Compare commits

..

49 Commits

Author SHA1 Message Date
jkrauss 877e801bd0 Update schematic to pass ERC
KiBot CI / test (push) Successful in 8m24s
2026-03-09 12:50:15 -07:00
jkrauss 411bcb592b fix(symbols): Fix SRX pin type on bq27427 2026-03-09 12:50:15 -07:00
jkrauss 41f54481ff [bot]: Update Outputs 2026-03-09 15:01:12 +00:00
jkrauss bc09ab26dd Translate Impedance Table to millimeters
KiBot CI / test (push) Successful in 7m59s
2026-03-09 07:53:14 -07:00
jkrauss 143795c47b [bot]: Update Outputs 2026-03-09 14:49:03 +00:00
jkrauss 4318d94060 Update Impedance Table Format
KiBot CI / test (push) Successful in 5m56s
2026-03-09 07:43:07 -07:00
jkrauss 4b5a6a2d09 [bot]: Update Outputs 2026-03-08 20:55:35 +00:00
jkrauss d4182a9118 Add Impedance Table
KiBot CI / test (push) Successful in 5m49s
2026-03-08 13:49:48 -07:00
jkrauss df5e04a463 [bot]: Update Outputs 2026-03-08 20:40:40 +00:00
jkrauss 3d48426b1f Run Blender Top/Bottom Renders
KiBot CI / test (push) Successful in 5m51s
2026-03-08 13:34:48 -07:00
jkrauss d082f0f3d4 [bot]: Update Outputs 2026-03-08 20:28:06 +00:00
jkrauss 1a727e5e8a Reset Renders
KiBot CI / test (push) Successful in 5m53s
2026-03-08 13:22:16 -07:00
jkrauss 8b0266b21b [bot]: Update Outputs 2026-03-08 15:54:54 +00:00
jkrauss 2f8a1b9869 Update Blender Lighting
KiBot CI / test (push) Successful in 4m10s
2026-03-08 08:50:45 -07:00
jkrauss 8db1654c3d [bot]: Update Outputs 2026-03-08 14:46:41 +00:00
jkrauss 779b20e217 Add Impedance Table and Library References
KiBot CI / test (push) Successful in 4m14s
2026-03-08 07:42:28 -07:00
jkrauss d5b00da42c [bot]: Update Outputs 2026-03-07 14:24:36 +00:00
jkrauss 621f7d84bc Move drawing notes to "notes" directory
KiBot CI / test (push) Successful in 5m31s
2026-03-07 06:19:05 -08:00
jkrauss 8602fd6a10 [bot]: Update Outputs 2026-03-07 01:29:32 +00:00
jkrauss 12b243df56 Adjust Blender Lighting
KiBot CI / test (push) Successful in 4m2s
2026-03-06 17:25:30 -08:00
jkrauss cea109440e [bot]: Update Outputs 2026-03-06 23:27:39 +00:00
jkrauss bee1240b7e Update Renders
KiBot CI / test (push) Successful in 4m2s
2026-03-06 15:23:36 -08:00
jkrauss 730e6e204a [bot]: Update Outputs 2026-03-06 22:27:49 +00:00
jkrauss f5cf91707d Test Fab and Assembly drawing WKS templates
KiBot CI / test (push) Successful in 3m58s
2026-03-06 14:23:52 -08:00
jkrauss f545a5f217 [bot]: Update Outputs 2026-03-06 21:25:59 +00:00
jkrauss 832f727e84 Test No Raytracing on PCB Viewer Renders
KiBot CI / test (push) Successful in 3m57s
2026-03-06 13:22:02 -08:00
jkrauss 71d3dd0ffb Test No Raytracing on PCB Viewer Renders
KiBot CI / test (push) Failing after 1m23s
2026-03-06 13:19:49 -08:00
jkrauss acd5ff8524 [bot]: Update Outputs 2026-03-06 21:08:59 +00:00
jkrauss 71e6913cd8 test: See if the drawing sheet is actually pulled in from the filesystem
KiBot CI / test (push) Successful in 7m4s
2026-03-06 13:01:55 -08:00
jkrauss 18040356d0 [bot]: Update Outputs 2026-03-06 20:40:54 +00:00
jkrauss 5caa450e69 Ensure the WKS is embedded in the Schematic, I guess
KiBot CI / test (push) Successful in 7m4s
2026-03-06 12:33:51 -08:00
jkrauss 4c0c81234f Update .gitignore
KiBot CI / test (push) Failing after 53s
2026-03-06 12:12:51 -08:00
jkrauss 999aa87807 [bot]: Update Outputs 2026-03-06 19:03:40 +00:00
jkrauss c1e0c16472 Remove errant WKS files
KiBot CI / test (push) Successful in 11m19s
2026-03-06 10:52:24 -08:00
jkrauss 6a0f1050fe [bot]: Update Outputs 2026-03-06 18:13:38 +00:00
jkrauss c00f1ce352 Add Panel Definitions
KiBot CI / test (push) Successful in 12m7s
2026-03-06 10:01:35 -08:00
jkrauss 8e94e7b580 Move to Working State
KiBot CI / test (push) Failing after 11m37s
2026-03-06 09:46:21 -08:00
jkrauss b752ffdc56 [bot]: Update Outputs 2026-03-06 17:00:16 +00:00
jkrauss 0e4308be37 Test without Pre-Existing XML
KiBot CI / test (push) Successful in 53s
2026-03-06 08:59:22 -08:00
jkrauss 6dadcf0b05 [bot]: Update Outputs 2026-03-06 16:57:47 +00:00
jkrauss 02b8af50a7 Add Update XML as separate pre-processing step
KiBot CI / test (push) Successful in 1m30s
2026-03-06 08:56:17 -08:00
jkrauss 370d5c1ac6 [bot]: Update Outputs 2026-03-06 16:26:08 +00:00
jkrauss 4e6ec4d2fe Start in Draft Mode right now
KiBot CI / test (push) Successful in 7m20s
2026-03-06 08:18:49 -08:00
jkrauss 31a5eb676f Update template paths
KiBot CI / test (push) Failing after 6m44s
2026-03-06 08:10:53 -08:00
jkrauss 1fa3de130e Update Layer Names to new template
KiBot CI / test (push) Failing after 51s
2026-03-06 08:07:51 -08:00
jkrauss fc4a488534 Update Project from Test_4, Update CI Script
KiBot CI / test (push) Failing after 51s
2026-03-06 08:05:48 -08:00
jkrauss 3dcb32765f Rename Project
KiBot CI / test (push) Failing after 40s
2026-03-06 08:01:21 -08:00
jkrauss de7ed20a5f [bootstrap] Add subtree 'Asymworks/KiCad-Library' at 'lib/asymworks' 2026-03-06 08:01:20 -08:00
jkrauss 35b4f6d342 Squashed 'lib/asymworks/' content from commit eacbe15
git-subtree-dir: lib/asymworks
git-subtree-split: eacbe15c14a66380e51c43426bcd2588b10c90d4
2026-03-06 08:01:20 -08:00
245 changed files with 1271597 additions and 21273 deletions
+7
View File
@@ -0,0 +1,7 @@
*.csv filter=bom_csv
*.html filter=bom_html
*.gbr filter=gerber
*.gbrjob filter=gbrjob
*.xml filter=xml
*.kicad_pcb filter=kicad_pcb_f
*.net filter=net_filter
+20
View File
@@ -0,0 +1,20 @@
[filter "bom_csv"]
clean = sed -E 's/^BoM Date:.*$/BoM Date:Date/'
smudge = sed -E \"s/BoM Date:Date/BoM Date:,`date +\\\"%a %d %b %Y %X %:::z\\\"`/\"
[filter "bom_html"]
clean = sed -E 's/^<tr><td>BoM Date<\\/td><td>.*$/<tr><td>BoM Date<\\/td><td>Date<\\/td><\\/tr>/'
smudge = sed -E \"s/<tr><td>BoM Date<\\/td><td>Date<\\/td><\\/tr>/<tr><td>BoM Date<\\/td><td>`date +\\\"%a %d %b %Y %X %:::z\\\"`<\\/td><\\/tr>/\"
[filter "gerber"]
clean = sed -E -e 's/^%TF.CreationDate,.*$/%TF.CreationDate,Date%/' -e 's/^G04 Created by KiCad.*$/G04 Created by KiCad*/'
smudge = sed -E \"s/%TF.CreationDate,Date%/%TF.CreationDate,`date +%Y-%m-%dT%H:%M:%S%:z`/\"
[filter "gbrjob"]
clean = sed -E 's/\"CreationDate\":.*/\"CreationDate\": \"Date\"/'
smudge = sed -E \"s/\\\"CreationDate\\\": \\\"Date\\\"/\\\"CreationDate\\\": \\\"`date +%Y-%m-%dT%H:%M:%S%:z`\\\"/\"
[filter "xml"]
clean = sed -E -e 's/^ <date>.*<\\/date>/ <date>Date2<\\/date>/' -e 's/^ <date>.*<\\/date>/ <date>Date1<\\/date>/'
smudge = sed -E -e \"s/<date>Date1<\\/date>/<date>`date +\\\"%a %d %b %Y %X %:::z\\\"`<\\/date>/\" -e \"s/<date>Date2<\\/date>/<date>`date +\\\"%Y-%m-%d\\\"`<\\/date>/\"
[filter "kicad_pcb_f"]
clean = sed -E 's/\\(host pcbnew ([[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+).*/\\(host pcbnew \\1\\)/'
[filter "net_filter"]
clean = sed -E -e 's/\\(date \\\".*\\\"\\)/\\(date \\\"Date\\\"\\)/'
smudge = sed -E -e \"s/\\(date \\\"Date\\\"\\)/\\(date \\\"`date +\\\"%a %d %b %Y %X %:::z\\\"`\\\"\\)/\"
+14 -4
View File
@@ -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:
+2
View File
@@ -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/
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1834
View File
File diff suppressed because it is too large Load Diff
+32728
View File
File diff suppressed because it is too large Load Diff
+221 -37
View File
@@ -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": ""
}
}
}
+971
View File
@@ -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")
)
)
)
+2164
View File
File diff suppressed because it is too large Load Diff
+579
View File
@@ -0,0 +1,579 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Main page</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" disabled style="font-size:44px; color: gray; cursor: not-allowed; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="items-container">
<div>
<div class="category-box" onclick="location.href='Test_5-navigate_reports.html'">
<p class="category-title">reports</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_schematic.html'">
<p class="category-title">schematic</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_mfg.html'">
<p class="category-title">mfg</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_kiri.html'">
<p class="category-title">kiri</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_renders.html'">
<p class="category-title">renders</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_models.html'">
<p class="category-title">models</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_test.html'">
<p class="category-title">test</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_panels.html'">
<p class="category-title">panels</p>
</div>
</div></div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>
+567
View File
@@ -0,0 +1,567 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/kiri</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_kiri.html" style="text-decoration:none;color:inherit;">kiri</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="html_kiri">
<div class="output-comment">KiRI webpage</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../kiri/index.html'">
<img src="images/icon.svg_64.png" alt="index.html" width="64" height="64">
<p class="filename">index.html</p>
<p class="output-name">html_kiri</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>
+570
View File
@@ -0,0 +1,570 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/mfg</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="items-container">
<div>
<div class="category-box" onclick="location.href='Test_5-navigate_mfg_assembly.html'">
<p class="category-title">assembly</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_mfg_fab.html'">
<p class="category-title">fab</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_mfg_jlcpcb.html'">
<p class="category-title">jlcpcb</p>
</div>
</div></div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>
+633
View File
@@ -0,0 +1,633 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/mfg/assembly</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate_mfg.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_assembly.html" style="text-decoration:none;color:inherit;">assembly</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="csv_bom">
<div class="output-comment">Bill of Materials in CSV format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-bom.csv'">
<img src="images/file_csv_64.png" alt="Test_5-bom.csv" width="64" height="64">
<p class="filename">Test_5-bom.csv</p>
<p class="output-name">csv_bom</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="html_bom">
<div class="output-comment">Bill of Materials in HTML format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-bom.html'">
<img src="images/file_html_64.png" alt="Test_5-bom.html" width="64" height="64">
<p class="filename">Test_5-bom.html</p>
<p class="output-name">html_bom</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="html_bom_interactive">
<div class="output-comment">Bill of Materials in HTML format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-ibom.html'">
<img src="images/ibom_64.png" alt="Test_5-ibom.html" width="64" height="64">
<p class="filename">Test_5-ibom.html</p>
<p class="output-name">html_bom_interactive</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="csv_position">
<div class="output-comment">Position file in CSV format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-CPL.csv'">
<img src="images/file_csv_64.png" alt="Test_5-CPL.csv" width="64" height="64">
<p class="filename">Test_5-CPL.csv</p>
<p class="output-name">csv_position</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="pdf_assembly">
<div class="output-comment">Assembly document in PDF format</div>
<div class="items-container">
<div class="output-box wide" onclick="location.href='../mfg/assembly/Test_5-assembly.pdf'">
<img src="images/cat_pdf_assembly_Test_5-assembly.png" alt="Test_5-assembly.pdf" width="512" height="362">
<p class="filename">Test_5-assembly.pdf</p>
<p class="output-name">pdf_assembly</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="csv_comp_count">
<div class="output-comment">Component report (count) in CSV format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-components_count.csv'">
<img src="images/file_csv_64.png" alt="Test_5-components_count.csv" width="64" height="64">
<p class="filename">Test_5-components_count.csv</p>
<p class="output-name">csv_comp_count</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="txt_assembly_notes">
<div class="output-comment">Assembly notes in TXT format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-fabrication_notes.txt'">
<img src="images/file_txt_64.png" alt="Test_5-fabrication_notes.txt" width="64" height="64">
<p class="filename">Test_5-fabrication_notes.txt</p>
<p class="output-name">txt_assembly_notes</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>
+621
View File
@@ -0,0 +1,621 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/mfg/fab</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</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()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate_mfg_fab.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_fab.html" style="text-decoration:none;color:inherit;">fab</a>/<wbr><a href="Test_5-navigate_mfg_fab_drill-tables.html" style="text-decoration:none;color:inherit;">drill-tables</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="csv_drill_table">
<div class="output-comment">Drill Table in CSV format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/fab/drill-tables/Test_5-(L1-L4)_drill_table.csv'">
<img src="images/file_csv_64.png" alt="Test_5-(L1-L4)_drill_table.csv" width="64" height="64">
<p class="filename">Test_5-(L1-L4)_drill_table.csv</p>
<p class="output-name">csv_drill_table</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/drill-tables/Test_5-(L1-L4)_NPTH_drill_table.csv'">
<img src="images/file_csv_64.png" alt="Test_5-(L1-L4)_NPTH_drill_table.csv" width="64" height="64">
<p class="filename">Test_5-(L1-L4)_NPTH_drill_table.csv</p>
<p class="output-name">csv_drill_table</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>
+661
View File
@@ -0,0 +1,661 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/mfg/fab/gerbers</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate_mfg_fab.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_fab.html" style="text-decoration:none;color:inherit;">fab</a>/<wbr><a href="Test_5-navigate_mfg_fab_gerbers.html" style="text-decoration:none;color:inherit;">gerbers</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="gbr_gerbers">
<div class="output-comment">Gerbers in GBR format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-F_Cu.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Cu.gbr" width="64" height="64">
<p class="filename">Test_5-F_Cu.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-In1_Cu.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-In1_Cu.gbr" width="64" height="64">
<p class="filename">Test_5-In1_Cu.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-In2_Cu.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-In2_Cu.gbr" width="64" height="64">
<p class="filename">Test_5-In2_Cu.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-B_Cu.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-B_Cu.gbr" width="64" height="64">
<p class="filename">Test_5-B_Cu.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-Edge_Cuts.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-Edge_Cuts.gbr" width="64" height="64">
<p class="filename">Test_5-Edge_Cuts.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-F_Silkscreen.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Silkscreen.gbr" width="64" height="64">
<p class="filename">Test_5-F_Silkscreen.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-F_Mask.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Mask.gbr" width="64" height="64">
<p class="filename">Test_5-F_Mask.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-F_Paste.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Paste.gbr" width="64" height="64">
<p class="filename">Test_5-F_Paste.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-B_Silkscreen.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-B_Silkscreen.gbr" width="64" height="64">
<p class="filename">Test_5-B_Silkscreen.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-B_Mask.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-B_Mask.gbr" width="64" height="64">
<p class="filename">Test_5-B_Mask.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-B_Paste.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-B_Paste.gbr" width="64" height="64">
<p class="filename">Test_5-B_Paste.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="drl_excellon">
<div class="output-comment">Drill in Excellon format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5--pth.drl'">
<img src="images/file_drl_64.png" alt="Test_5--pth.drl" width="64" height="64">
<p class="filename">Test_5--pth.drl</p>
<p class="output-name">drl_excellon</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5--npth.drl'">
<img src="images/file_drl_64.png" alt="Test_5--npth.drl" width="64" height="64">
<p class="filename">Test_5--npth.drl</p>
<p class="output-name">drl_excellon</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="pdf_drill_map">
<div class="output-comment">Drill Map in PDF format</div>
<div class="items-container">
<div class="output-box wide" onclick="location.href='../mfg/fab/gerbers/Test_5--pth_map.pdf'">
<img src="images/cat_pdf_drill_map_Test_5--pth_map.png" alt="Test_5--pth_map.pdf" width="512" height="362">
<p class="filename">Test_5--pth_map.pdf</p>
<p class="output-name">pdf_drill_map</p>
</div>
<div class="output-box wide" onclick="location.href='../mfg/fab/gerbers/Test_5--npth_map.pdf'">
<img src="images/cat_pdf_drill_map_Test_5--npth_map.png" alt="Test_5--npth_map.pdf" width="512" height="362">
<p class="filename">Test_5--npth_map.pdf</p>
<p class="output-name">pdf_drill_map</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>
+595
View File
@@ -0,0 +1,595 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/mfg/jlcpcb</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</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()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate_mfg_jlcpcb.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_jlcpcb.html" style="text-decoration:none;color:inherit;">jlcpcb</a>/<wbr><a href="Test_5-navigate_mfg_jlcpcb_gerbers.html" style="text-decoration:none;color:inherit;">gerbers</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="jlcpcb_gerbers">
<div class="output-comment">Gerbers in GBR format for JLCPCB</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-F_Cu.gtl'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Cu.gtl" width="64" height="64">
<p class="filename">Test_5-F_Cu.gtl</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-In1_Cu.g1'">
<img src="images/file_gbr_64.png" alt="Test_5-In1_Cu.g1" width="64" height="64">
<p class="filename">Test_5-In1_Cu.g1</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-In2_Cu.g2'">
<img src="images/file_gbr_64.png" alt="Test_5-In2_Cu.g2" width="64" height="64">
<p class="filename">Test_5-In2_Cu.g2</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-B_Cu.gbl'">
<img src="images/file_gbr_64.png" alt="Test_5-B_Cu.gbl" width="64" height="64">
<p class="filename">Test_5-B_Cu.gbl</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-Edge_Cuts.gm1'">
<img src="images/file_gbr_64.png" alt="Test_5-Edge_Cuts.gm1" width="64" height="64">
<p class="filename">Test_5-Edge_Cuts.gm1</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-F_Silkscreen.gto'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Silkscreen.gto" width="64" height="64">
<p class="filename">Test_5-F_Silkscreen.gto</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-F_Mask.gts'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Mask.gts" width="64" height="64">
<p class="filename">Test_5-F_Mask.gts</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-F_Paste.gtp'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Paste.gtp" width="64" height="64">
<p class="filename">Test_5-F_Paste.gtp</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-B_Silkscreen.gbo'">
<img src="images/file_gbr_64.png" alt="Test_5-B_Silkscreen.gbo" width="64" height="64">
<p class="filename">Test_5-B_Silkscreen.gbo</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-B_Mask.gbs'">
<img src="images/file_gbr_64.png" alt="Test_5-B_Mask.gbs" width="64" height="64">
<p class="filename">Test_5-B_Mask.gbs</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-B_Paste.gbp'">
<img src="images/unknown_64.png" alt="Test_5-B_Paste.gbp" width="64" height="64">
<p class="filename">Test_5-B_Paste.gbp</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>
+578
View File
@@ -0,0 +1,578 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/models</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_models.html" style="text-decoration:none;color:inherit;">models</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="step">
<div class="output-comment">PCB 3D model in STEP format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../models/Test_5-step.step'">
<img src="images/file_stp_64.png" alt="Test_5-step.step" width="64" height="64">
<p class="filename">Test_5-step.step</p>
<p class="output-name">step</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="glb">
<div class="output-comment">PCB 3D model in GLB/gITF format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../models/Test_5-glb.glb'">
<img src="images/file_glb_64.png" alt="Test_5-glb.glb" width="64" height="64">
<p class="filename">Test_5-glb.glb</p>
<p class="output-name">glb</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>
+562
View File
@@ -0,0 +1,562 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/panels</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_panels.html" style="text-decoration:none;color:inherit;">panels</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="items-container">
<div>
<div class="category-box" onclick="location.href='Test_5-navigate_panels_panel-800.html'">
<p class="category-title">panel-800</p>
</div>
</div></div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>
+573
View File
@@ -0,0 +1,573 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/panels/panel-800</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate_panels.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_panels.html" style="text-decoration:none;color:inherit;">panels</a>/<wbr><a href="Test_5-navigate_panels_panel-800.html" style="text-decoration:none;color:inherit;">panel-800</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="panel_801">
<div class="output-comment">@COMMENT@</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../panels/panel-800/Test_5-panel_801.kicad_pcb'">
<img src="images/pcbnew_64.png" alt="Test_5-panel_801.kicad_pcb" width="64" height="64">
<p class="filename">Test_5-panel_801.kicad_pcb</p>
<p class="output-name">panel_801</p>
</div>
<div class="output-box wide" onclick="location.href='../panels/panel-800/Test_5-panel_801.png'">
<img src="images/cat_panel_801_Test_5-panel_801.png" alt="Test_5-panel_801.png" width="512" height="317">
<p class="filename">Test_5-panel_801.png</p>
<p class="output-name">panel_801</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>
+690
View File
@@ -0,0 +1,690 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/renders</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</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>
+590
View File
@@ -0,0 +1,590 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/reports</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_reports.html" style="text-decoration:none;color:inherit;">reports</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="erc">
<div class="output-comment">erc</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../reports/report_Test_5-erc.html'">
<img src="images/erc.svg_64.png" alt="report_Test_5-erc.html" width="64" height="64">
<p class="filename">report_Test_5-erc.html</p>
<p class="output-name">erc</p>
</div>
<div class="output-box " onclick="location.href='../reports/report_Test_5-erc.rpt'">
<img src="images/erc.svg_64.png" alt="report_Test_5-erc.rpt" width="64" height="64">
<p class="filename">report_Test_5-erc.rpt</p>
<p class="output-name">erc</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="drc">
<div class="output-comment">drc</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../reports/report_Test_5-drc.html'">
<img src="images/drc.svg_64.png" alt="report_Test_5-drc.html" width="64" height="64">
<p class="filename">report_Test_5-drc.html</p>
<p class="output-name">drc</p>
</div>
<div class="output-box " onclick="location.href='../reports/report_Test_5-drc.rpt'">
<img src="images/drc.svg_64.png" alt="report_Test_5-drc.rpt" width="64" height="64">
<p class="filename">report_Test_5-drc.rpt</p>
<p class="output-name">drc</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>
+578
View File
@@ -0,0 +1,578 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/schematic</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_schematic.html" style="text-decoration:none;color:inherit;">schematic</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="pdf_schematic">
<div class="output-comment">Schematic in PDF format</div>
<div class="items-container">
<div class="output-box wide" onclick="location.href='../schematic/Test_5-schematic.pdf'">
<img src="images/cat_pdf_schematic_Test_5-schematic.png" alt="Test_5-schematic.pdf" width="512" height="362">
<p class="filename">Test_5-schematic.pdf</p>
<p class="output-name">pdf_schematic</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="txt_schematic_notes">
<div class="output-comment">Schematic notes in TXT format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../schematic/Test_5-schematic_notes.txt'">
<img src="images/file_txt_64.png" alt="Test_5-schematic_notes.txt" width="64" height="64">
<p class="filename">Test_5-schematic_notes.txt</p>
<p class="output-name">txt_schematic_notes</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>
+562
View File
@@ -0,0 +1,562 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/test</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_test.html" style="text-decoration:none;color:inherit;">test</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="items-container">
<div>
<div class="category-box" onclick="location.href='Test_5-navigate_test_testpoints.html'">
<p class="category-title">testpoints</p>
</div>
</div></div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>
+589
View File
@@ -0,0 +1,589 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/test/testpoints</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate_test.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_test.html" style="text-decoration:none;color:inherit;">test</a>/<wbr><a href="Test_5-navigate_test_testpoints.html" style="text-decoration:none;color:inherit;">testpoints</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="csv_testpoints">
<div class="output-comment">Testpoint report in CSV format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../test/testpoints/Test_5-testpoints.csv'">
<img src="images/file_csv_64.png" alt="Test_5-testpoints.csv" width="64" height="64">
<p class="filename">Test_5-testpoints.csv</p>
<p class="output-name">csv_testpoints</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="csv_testpoints_top">
<div class="output-comment">Top testpoint report in CSV format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../test/testpoints/Test_5-testpoints-top.csv'">
<img src="images/file_csv_64.png" alt="Test_5-testpoints-top.csv" width="64" height="64">
<p class="filename">Test_5-testpoints-top.csv</p>
<p class="output-name">csv_testpoints_top</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="csv_testpoints_bottom">
<div class="output-comment">Bottom testpoint report in CSV format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../test/testpoints/Test_5-testpoints-bottom.csv'">
<img src="images/file_csv_64.png" alt="Test_5-testpoints-bottom.csv" width="64" height="64">
<p class="filename">Test_5-testpoints-bottom.csv</p>
<p class="output-name">csv_testpoints_bottom</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

+2
View File
File diff suppressed because one or more lines are too long
+981
View File
@@ -0,0 +1,981 @@
/* Colors =================================================================== */
:root {
--light-bg-color: #ffffff;
--dark-bg-color: #1e1e2f;
--light-bg-color-banner: #dfdfdf;
--dark-bg-color-banner: #27293d;
--light-text-color: #444444;
--dark-text-color: #e5e5e5;
--light-hover-color: #902ec9;
--light-hover-color-act: #652f85;
--dark-hover-color: #ffa500;
--dark-hover-color-act: #cc8400;
--dark-text-color-accent: #a3a3c2;
--light-text-color-accent: #444444;
--light-banner-hover: #b0b0b0;
--dark-banner-hover: #383b4b;
--text-color-accent: #a3a3c2;
}
/* Main body ================================================================ */
body {
margin: 0;
font-family: 'Roboto', sans-serif;
background-color: var(--dark-bg-color);
color: var(--dark-text-color);
transition:
background-color 0.4s ease,
color 0.4s ease,
transition: scrollbar-color 0.2s ease-in-out;
}
body.dark-mode {
--text-color-accent: var(--dark-text-color-accent);
background-color: var(--dark-bg-color);
color: var(--dark-text-color);
}
body.light-mode {
--text-color-accent: var(--light-text-color-accent);
background-color: var(--light-bg-color);
color: var(--light-text-color);
}
/* Top Menu ================================================================= */
/* Layout is as follows */
/* [X/☰] [↩] [↪] <Category Path> <Title> (Logo) [☾/☀] [🏠︎] */
#topmenu {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 1000;
background-color: var(--dark-bg-color-banner);
padding: 10px 0;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
display: flex;
align-items: center;
justify-content: space-between;
transition: background-color 0.2s ease, color 0.2s ease;
}
body.light-mode #topmenu {
background-color: var(--light-bg-color-banner);
}
body.dark-mode #topmenu {
background-color: var(--dark-bg-color-banner);
}
/* Buttons ================================================================== */
/* button corresponds to the navigation buttons (forward, backward, home) */
button, #open-navbar, #close-navbar {
background: none;
border: none;
color: var(--dark-text-color);
cursor: pointer;
transition: color 0.3s ease;
user-select: none;
}
body.light-mode #topmenu button,
body.light-mode #topmenu #open-navbar,
body.light-mode #topmenu #close-navbar {
color: var(--light-text-color);
}
body.dark-mode #topmenu button,
body.dark-mode #topmenu #open-navbar,
body.dark-mode #topmenu #close-navbar {
color: var(--dark-text-color);
}
button {
font-size: 20px;
margin: 0 10px;
}
#open-navbar, #close-navbar {
width: 36px;
height: 36px;
line-height: 36px;
text-align: center;
font-size: 28px;
margin-left: 15px;
}
/* Hover effects */
button:hover, #open-navbar:hover, #close-navbar:hover {
color: var(--dark-hover-color);
}
body.dark-mode #topmenu button:hover,
body.dark-mode #topmenu #open-navbar:hover,
body.dark-mode #topmenu #close-navbar:hover {
color: var(--dark-hover-color);
}
body.light-mode #topmenu button:hover,
body.light-mode #topmenu #open-navbar:hover,
body.light-mode #topmenu #close-navbar:hover {
color: var(--light-hover-color);
}
/* Active effects */
button:active, #open-navbar:active, #close-navbar:active {
color: var(--dark-hover-color-act);
transition: none;
}
body.dark-mode #topmenu button:active,
body.dark-mode #topmenu #open-navbar:active,
body.dark-mode #topmenu #close-navbar:active {
color: var(--dark-hover-color-act);
}
body.light-mode #topmenu button:active,
body.light-mode #topmenu #open-navbar:active,
body.light-mode #topmenu #close-navbar:active {
color: var(--light-hover-color-act);
}
/* Sidebar Navigation ======================================================= */
.navbar {
position: fixed;
width: 0; /* Initially collapsed */
height: calc(100% - var(--top-menu-height, 60px));
top: var(--top-menu-height, 60px);
left: 0;
background-color: #27293d;
overflow-x: hidden;
overflow-y: auto;
transition:
width 0.5s ease,
padding-left 0.5s ease,
scrollbar-color 0.2s ease-in-out,
background-color 0.2s ease-in-out;
box-sizing: border-box;
padding-top: 0;
padding-bottom: 40px;
}
body.dark-mode .navbar {
background-color: var(--dark-bg-color-banner);
}
body.light-mode .navbar {
background-color: var(--light-bg-color-banner);
}
.navbar > ul:first-child {
margin-top: 20px; /* Padding between top menu and first element of navbar */
}
/* Side Navigation Outputs -------------------------------------------------- */
.navbar-output {
padding: 8px 30px;
text-decoration: none;
font-size: 16px;
color: var(--dark-text-color);
display: block;
transition: color 0.3s ease;
border-radius: 4px;
}
body.light-mode .navbar-output {
color: var(--light-text-color);
}
body.dark-mode .navbar-output {
color: var(--dark-text-color);
}
/* Hover effects */
.navbar-output:hover {
color: var(--dark-hover-color);
background-color: var(--dark-banner-hover);
}
body.dark-mode .navbar-output:hover {
color: var(--dark-hover-color);
background-color: var(--dark-banner-hover);
}
body.light-mode .navbar-output:hover {
color: var(--light-hover-color);
background-color: var(--light-banner-hover);
}
/* Active effects */
.navbar-output:active {
color: var(--dark-hover-color-act);
}
body.dark-mode .navbar-output:active {
color: var(--dark-hover-color-act);
}
body.light-mode .navbar-output:active {
color: var(--light-hover-color-act);
}
/* Side Navigation Categories ----------------------------------------------- */
.navbar-category {
list-style: none;
padding: 0;
margin: 0;
user-select: none; /* Prevent text selection */
}
.navbar-category .folder > span {
display: flex;
align-items: center;
cursor: pointer;
color: var(--dark-text-color-accent);
padding: 10px 20px;
margin-bottom: 0px;
width: 100%;
transition: background-color 0.3s, color 0.3s;
border-radius: 4px;
}
.navbar-category .folder-contents {
list-style: none;
margin-left: 20px;
padding: 0;
}
body.dark-mode .navbar-category .folder > span {
color: var(--dark-text-color-accent);
}
body.light-mode .navbar-category .folder > span {
color: var(--light-text-color);
}
/* Hover effects */
.navbar-category .folder > span:hover {
background-color: var(--dark-banner-hover);
color: var(--dark-hover-color);
}
body.dark-mode .navbar-category .folder > span:hover {
color: var(--dark-hover-color);
background-color: var(--dark-banner-hover);
}
body.light-mode .navbar-category .folder > span:hover {
color: var(--light-hover-color);
background-color: var(--light-banner-hover);
}
/* Active effects */
.navbar-category .folder > span:active {
color: var(--dark-hover-color);
transition: none;
}
body.dark-mode .navbar-category .folder > span:active {
color: var(--dark-hover-color-act);
}
body.light-mode .navbar-category .folder > span:active {
color: var(--light-hover-color-act);
}
/* Chevron (arrow) styling -------------------------------------------------- */
.chevron {
display: block;
width: 0;
height: 0;
border: 8px solid transparent;
border-left-color: #606077;
margin-right: 8px;
transform-origin: 25% 50%;
transition: transform 0.3s ease, border-left-color 0.3s ease;
pointer-events: none;
}
body.dark-mode .chevron {
border-left-color: #606077;
}
body.light-mode .chevron {
border-left-color: #909090;
}
/* We change styles for when the chevron is pointing down */
.folder.open > span .chevron {
border-left-color: var(--dark-text-color-accent);
transform: rotate(90deg);
}
body.dark-mode .folder.open > span .chevron {
border-left-color: var(--dark-text-color-accent);
}
body.light-mode .folder.open > span .chevron {
border-left-color: var(--light-text-color-accent);
}
/* Hover effects */
body.dark-mode .folder > span:hover .chevron {
border-left-color: var(--dark-hover-color)
}
body.light-mode .folder > span:hover .chevron {
border-left-color: var(--light-hover-color)
}
/* Active effects */
body.dark-mode .folder > span:active .chevron {
border-left-color: var(--dark-hover-color-act)
}
body.light-mode .folder > span:active .chevron {
border-left-color: var(--light-hover-color-act)
}
/* Main content ============================================================= */
#main {
transition: margin-left 0.5s;
padding: 16px;
margin-top: 80px;
}
/* Comment field of output is used as a title for each output */
.output-comment {
font-size: 1.4em;
font-weight: 500;
color: var(--dark-text-color);
margin: 20px 0 10px 0;
text-align: center;
}
body.light-mode .output-comment {
color: var(--light-text-color);
}
body.dark-mode .output-comment {
color: var(--dark-text-color);
}
/* Kibot version ------------------------------------------------------------ */
.generator {
text-align: right;
font-size: 0.6em;
text-decoration: none;
}
.generator a {
text-decoration: none; /* Removes the underline */
}
/* Dark Mode: Regular Text */
body.dark-mode .generator {
color: var(--dark-text-color-accent);
}
/* Dark Mode: Hyperlinks */
body.dark-mode .generator a {
color: var(--dark-hover-color); /* Hyperlink */
}
/* Light Mode: Regular Text */
body.light-mode .generator {
color: var(--light-text-color-accent);
}
/* Light Mode: Hyperlinks */
body.light-mode .generator a {
color: var(--light-hover-color); /* Hyperlink */
}
/* Category boxes (folder) -------------------------------------------------- */
.category-box {
z-index: 1000;
background-color: var(--dark-bg-color-banner);
border: 1px solid var(--dark-bg-color-banner);
border-radius: 8px;
padding: 16px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 400px;
height: 140;
text-decoration: none;
transition: background-color 0.3s ease, transform 0.2s ease;
margin-bottom: 0px;
}
body.light-mode .category-box {
color: var(--light-text-color);
background-color: var(--light-bg-color-banner);
border: var(--light-bg-color-banner);
}
body.dark-mode .category-box {
color: var(--dark-text-color);
background-color: var(--dark-bg-color-banner);
border: var(--dark-bg-color-banner);
}
.category-box img {
margin-top: 10px;
max-width: 100%;
max-height: 100%;
height: auto;
margin-bottom: 10px;
}
.category-title {
font-size: 1.4em;
font-weight: 500;
text-align: center;
color: #e5e5e5;
text-decoration: none;
display: inline-block;
margin-top: 0px;
margin-bottom: 0px;
}
body.light-mode .category-title {
color: var(--light-text-color);
}
body.dark-mode .category-title {
color: var(--dark-text-color);
}
/* Hover effects */
.category-box:hover {
background-color: var(--dark-banner-hover);
transform: scale(1.05); /* Slight zoom effect */
cursor: pointer;
}
body.light-mode .category-box:hover {
background-color: var(--light-banner-hover);
}
body.dark-mode .category-box:hover {
background-color: var(--dark-banner-hover);
}
/* Output boxes (files) ----------------------------------------------------- */
.output-box {
z-index: 999;
background-color: var(--dark-bg-color-banner);
border: 1px solid var(--dark-bg-color-banner);
border-radius: 8px;
padding: 16px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 300px;
height: 140px;
text-decoration: none;
transition: background-color 0.3s ease, transform 0.2s ease;
}
/* Offset the scroll position */
.output-virtual-box {
position: relative;
padding-top: var(--top-menu-height, 80px);
margin-top: calc(-1 * var(--top-menu-height, 80px));
pointer-events: none; /* Make it non-interactive */
}
.output-virtual-box > * {
pointer-events: auto; /* Allow its children to remain interactive */
}
/* Some files (e.g. PDF, PNG) have wider output boxes */
.output-box.wide {
width: 400px;
height: auto;
}
.output-box img {
margin-top: 10px;
max-width: 100%;
max-height: 100%;
height: auto;
margin-bottom: 0px;
}
/* The output boxes are centered and wrap around */
.items-container {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 20px;
padding: 20px;
}
body.light-mode .output-box {
color: var(--light-text-color);
background-color: var(--light-bg-color-banner);
border: var(--light-bg-color-banner);
}
body.dark-mode .output-box {
color: var(--dark-text-color);
background-color: var(--dark-bg-color-banner);
border: var(--dark-bg-color-banner);
}
/* Hover effects */
.output-box:hover {
background-color: var(--dark-banner-hover);
transform: scale(1.05);
cursor: pointer;
}
body.light-mode .output-box:hover {
background-color: var(--light-banner-hover);
}
body.dark-mode .output-box:hover {
background-color: var(--dark-banner-hover);
}
/* Name of the output below the icon */
.output-box .output-name {
color: #8997c6;
font-size: 14px;
margin-top: 0px;
text-align: center;
}
body.light-mode .output-box .output-name {
color: var(--light-text-color-accent);
}
body.dark-mode .output-box .output-name {
color: #8997c6;
}
/* Filename below the icon */
.output-box .filename {
text-decoration: none;
color: var(--dark-text-color);
text-align: center;
font-size: 14px;
margin-bottom: 7px;
}
body.light-mode .output-box .filename {
color: var(--light-text-color);
}
body.dark-mode .output-box .filename {
color: var(--dark-text-color);
}
/* Theme Toggle Switch ====================================================== */
.theme-switch {
position: relative;
display: inline-block;
width: 50px;
height: 25px;
margin-left: 10px;
}
/* Hide the default checkbox button */
.theme-switch input {
opacity: 0;
width: 0;
height: 0;
}
.theme-switch span {
position: absolute;
cursor: pointer;
background-color: var(--light-banner-hover);
border-radius: 25px;
top: 0;
left: 0;
right: 0;
bottom: 0;
transition: 0.4s;
}
.theme-switch span::before {
position: absolute;
content: "";
height: 20px;
width: 20px;
left: 4px;
bottom: 3px;
background-color: var(--light-bg-color);
border-radius: 50%;
transition: none; /* Disable animation by default */
}
.theme-switch span.animate::before {
transition: transform 0.4s ease, background-color 0.4s ease;
}
.theme-switch input:checked + span {
background-color: var(--dark-bg-color);
}
.theme-switch input:checked + span::before {
transform: translateX(25px);
background-color: var(--dark-text-color);
}
/* Scrollbar ================================================================ */
body, html {
scroll-behavior: smooth;
scrollbar-width: auto;
}
body.dark-mode .navbar {
scrollbar-color: var(--dark-banner-hover) var(--dark-bg-color);
}
body.light-mode .navbar {
scrollbar-color: var(--light-banner-hover) var(--light-bg-color);
}
/* WebKit Scrollbar Styles */
body::-webkit-scrollbar, .navbar::-webkit-scrollbar {
width: 12px;
height: 12px;
}
body::-webkit-scrollbar-thumb, .navbar::-webkit-scrollbar-thumb {
border-radius: 6px;
background: var(--dark-banner-hover);
border: 2px solid var(--dark-bg-color);
}
body::-webkit-scrollbar-track, .navbar::-webkit-scrollbar-track {
border-radius: 6px;
background: var(--dark-bg-color);
}
body.dark-mode::-webkit-scrollbar-thumb:hover, .navbar.dark-mode::-webkit-scrollbar-thumb:hover {
background: #44475a !important;
}
body.light-mode::-webkit-scrollbar-thumb, .navbar.light-mode::-webkit-scrollbar-thumb {
background: var(--light-banner-hover);
border: 2px solid var(--light-bg-color);
}
body.light-mode::-webkit-scrollbar-track, .navbar.light-mode::-webkit-scrollbar-track {
background: var(--light-bg-color);
}
body.light-mode::-webkit-scrollbar-thumb:hover, .navbar.light-mode::-webkit-scrollbar-thumb:hover {
background: #909090 !important;
}
body::-webkit-scrollbar-corner, .navbar::-webkit-scrollbar-corner {
background: var(--dark-bg-color);
}
/* Markdown ================================================================= */
.markdown-content {
font-family: Roboto, sans-serif;
line-height: 1.6;
padding: 15px;
border-radius: 5px;
max-width: calc(100% - 180px);
white-space: pre-wrap; /* Handle preformatted text */
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
}
body.light-mode .markdown-content {
background-color: #f9f9f9;
border: 1px solid #ddd;
color: #444444;
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
}
body.dark-mode .markdown-content {
background-color: #1e1e2f;
border: 1px solid #44475a;
color: #e5e5e5;
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
}
/* Tables */
.markdown-content table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
}
body.light-mode .markdown-content table th,
body.light-mode .markdown-content table td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
background-color: #ffffff;
color: #444444;
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
}
body.dark-mode .markdown-content table th,
body.dark-mode .markdown-content table td {
border: 1px solid #44475a;
padding: 8px;
text-align: left;
background-color: #27293d;
color: #e5e5e5;
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
}
/* Code Blocks */
.markdown-content pre {
background-color: var(--dark-bg-color-banner);
color: var(--dark-text-color); /* Matches dark theme text */
padding: 10px;
border-radius: 5px;
overflow-x: auto;
transition: background-color 0.4s ease, color 0.4s ease;
}
body.light-mode .markdown-content pre {
background-color: var(--light-bg-color-banner);
color: var(--light-text-color);
transition: background-color 0.4s ease, color 0.4s ease;
}
body.dark-mode .markdown-content pre {
background-color: var(--dark-bg-color-banner);
color: var(--dark-text-color);
transition: background-color 0.4s ease, color 0.4s ease;
}
/* Inline Code */
.markdown-content code {
background-color: var(--light-bg-color-banner);
padding: 2px 5px;
border-radius: 3px;
font-family: 'Courier New', Courier, monospace;
transition: background-color 0.4s ease, color 0.4s ease;
}
body.light-mode .markdown-content code {
background-color: var(--light-bg-color-banner);
color: var(--light-text-color);
transition: background-color 0.4s ease, color 0.4s ease;
}
body.dark-mode .markdown-content code {
background-color: var(--dark-bg-color-banner);
color: var(--dark-text-color);
transition: background-color 0.4s ease, color 0.4s ease;
}
/* Links */
body.light-mode .markdown-content a {
color: var(--light-hover-color);
text-decoration: none;
transition: color 0.4s ease;
}
body.dark-mode .markdown-content a {
color: var(--dark-hover-color);
text-decoration: none;
transition: color 0.4s ease;
}
.markdown-content a:hover {
text-decoration: underline;
}
/* Images */
.markdown-content img {
max-width: 100%;
height: auto;
display: block;
margin: 10px auto;
transition: opacity 0.4s ease;
}
.markdown-content pre::-webkit-scrollbar {
height: 12px; /* Horizontal scrollbar height */
}
.markdown-content pre::-webkit-scrollbar-thumb {
background: var(--dark-banner-hover); /* Match other scrollbar thumb color */
border-radius: 6px; /* Round edges */
border: 2px solid var(--dark-bg-color); /* Outer border matches background */
}
.markdown-content pre::-webkit-scrollbar-track {
background: var(--dark-bg-color); /* Match the background color */
border-radius: 6px;
}
body.light-mode .markdown-content pre::-webkit-scrollbar-thumb {
background: var(--light-banner-hover); /* Light mode thumb color */
border: 2px solid var(--light-bg-color); /* Light mode border */
}
body.light-mode .markdown-content pre::-webkit-scrollbar-track {
background: var(--light-bg-color); /* Light mode track background */
}
/* Search bar =============================================================== */
#search-container,
#search-bar,
#autocomplete-list,
#autocomplete-list li {
transition: background-color 0.3s, color 0.3s, border-color 0.3s;
}
#search-container {
padding: 10px;
background-color: transparent;
margin-top: 10px;
top: 0;
z-index: 1001;
width: calc(100% - 10px);
box-sizing: border-box;
}
#search-bar {
width: 100%; /* Match the width of the container */
padding: 8px;
border: 1px solid var(--light-text-color-accent);
border-radius: 4px;
outline: none;
background-color: transparent;
color: var(--light-text-color);
box-sizing: border-box; /* Ensure padding is included in width */
}
#search-bar::placeholder {
color: var(--light-text-color-accent);
}
#autocomplete-list {
list-style-type: none;
padding: 0;
margin: 5px 0 0;
max-height: 200px;
overflow-y: auto;
background-color: var(--light-bg-color-banner);
border: 1px solid var(--light-text-color-accent);
border-radius: 4px;
position: absolute;
z-index: 1001;
width: auto; /* Width will be dynamically calculated */
box-sizing: border-box;
display: none; /* Hidden by default */
}
#autocomplete-list li {
padding: 8px;
cursor: pointer;
transition: background-color 0.2s;
color: var(--light-text-color);
}
#autocomplete-list li:hover {
background-color: var(--light-banner-hover);
color: var(--light-hover-color);
}
.dark-mode #search-bar {
color: var(--dark-text-color);
border-color: var(--dark-text-color-accent);
}
.dark-mode #search-bar::placeholder {
color: var(--dark-text-color-accent);
}
.dark-mode #autocomplete-list {
background-color: var(--dark-bg-color-banner);
border-color: var(--dark-text-color-accent);
}
.dark-mode #autocomplete-list li {
color: var(--dark-text-color);
}
.dark-mode #autocomplete-list li:hover {
background-color: var(--dark-banner-hover);
color: var(--dark-hover-color);
}
.highlighted {
background-color: var(--light-banner-hover); /* Same as hover background */
color: var(--light-hover-color); /* Same as hover text color */
}
body.dark-mode .highlighted {
background-color: var(--dark-banner-hover); /* Same as hover background */
color: var(--dark-hover-color); /* Same as hover text color */
}
/* New classes to remove transitions on page load =========================== */
body.no-transition,
.no-transition .output-box,
body.no-transition .theme-switch span,
body.no-transition button,
body.no-transition #close-navbar,
body.no-transition #home-button,
body.no-transition #back-button,
body.no-transition #forward-button,
body.no-transition #topmenu,
body.no-transition .navbar-category .folder > span,
body.no-transition .navbar-output,
body.no-transition .category-box,
#search-bar {
transition: none !important; /* Disable transition during page load */
}
+4
View File
@@ -0,0 +1,4 @@
<html>
<head>
<meta http-equiv="refresh" content="0; html/Test_5-navigate.html"/></head>
</html>
+38 -18
View File
@@ -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'
+91 -21
View File
@@ -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
-2
View File
@@ -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
+1 -1
View File
@@ -24,4 +24,4 @@ definitions:
COMMENT: Report
DIR: mfg
OUTPUT_ID: _notes
TEMPLATE: kibot/templates/fabrication_notes.txt
TEMPLATE: notes/fabrication_notes.txt
+9
View File
@@ -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
+2
View File
@@ -0,0 +1,2 @@
# KiCad Temporary Files
*.bak
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More