breadkit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +16 -0
  4. data/SECURITY.md +5 -0
  5. data/data/boards/full.yml +18 -0
  6. data/data/boards/half.yml +17 -0
  7. data/data/boards/mini.yml +8 -0
  8. data/data/parts/2n3906.yml +10 -0
  9. data/data/parts/arduino_uno.yml +34 -0
  10. data/data/parts/bc547.yml +10 -0
  11. data/data/parts/bc557.yml +10 -0
  12. data/data/parts/capacitor.yml +7 -0
  13. data/data/parts/diode.yml +8 -0
  14. data/data/parts/electrolytic.yml +8 -0
  15. data/data/parts/led.yml +9 -0
  16. data/data/parts/ne555.yml +16 -0
  17. data/data/parts/pot.yml +12 -0
  18. data/data/parts/resistor.yml +7 -0
  19. data/data/parts/tact_switch_6mm.yml +19 -0
  20. data/data/parts/transistor.yml +10 -0
  21. data/docs/assets/01_led_button.svg +12 -0
  22. data/docs/dsl.md +62 -0
  23. data/exe/breadkit +5 -0
  24. data/lib/breadkit/analysis.rb +382 -0
  25. data/lib/breadkit/board.rb +163 -0
  26. data/lib/breadkit/cli.rb +61 -0
  27. data/lib/breadkit/dsl.rb +182 -0
  28. data/lib/breadkit/hole_id.rb +46 -0
  29. data/lib/breadkit/ir.rb +215 -0
  30. data/lib/breadkit/model.rb +31 -0
  31. data/lib/breadkit/part_library.rb +125 -0
  32. data/lib/breadkit/resolver.rb +449 -0
  33. data/lib/breadkit/value.rb +50 -0
  34. data/lib/breadkit/version.rb +5 -0
  35. data/lib/breadkit.rb +26 -0
  36. data/package-lock.json +1172 -0
  37. data/package.json +12 -0
  38. data/schema/ir-v1.json +128 -0
  39. data/schema/part-v1.json +48 -0
  40. data/sig/breadkit.rbs +180 -0
  41. data/site/assets/01_led_button.svg +14 -0
  42. data/site/assets/03_arduino_blink.svg +14 -0
  43. data/site/favicon.svg +7 -0
  44. data/site/guide/components/index.html +113 -0
  45. data/site/guide/dsl/index.html +132 -0
  46. data/site/guide/index.html +163 -0
  47. data/site/index.html +95 -0
  48. data/site/styles.css +14 -0
  49. metadata +94 -0
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="265.00" height="215.00" viewBox="0 0 265.00 215.00" font-family="Helvetica, Arial, 'Noto Sans JP', sans-serif" fill="#e8efeb" role="img">
3
+ <title>Arduino UNO LED</title>
4
+ <desc>Breadboard wiring diagram generated by Breadkit.</desc>
5
+ <g transform="matrix(0 1 -1 0 305.00 -42.50)">
6
+ <g id="board"><rect x="-15.00" y="-45.00" width="320.00" height="200.00" rx="8" fill="#202a27" stroke="#52625b" stroke-width="1"/><rect x="-10.00" y="45.00" width="310.00" height="20.00" rx="2" fill="#141c19"/><rect x="7.00" y="-23.00" width="286.00" height="6.00" rx="3" fill="#ed7168" opacity="0.14" data-rail="T+"/><rect x="7.00" y="-33.00" width="286.00" height="6.00" rx="3" fill="#99aaa4" opacity="0.14" data-rail="T-"/><rect x="7.00" y="137.00" width="286.00" height="6.00" rx="3" fill="#ed7168" opacity="0.14" data-rail="B+"/><rect x="7.00" y="127.00" width="286.00" height="6.00" rx="3" fill="#99aaa4" opacity="0.14" data-rail="B-"/></g>
7
+ <g id="holes"><circle cx="0.00" cy="110.00" r="1.30" fill="#718178" data-hole="a1" opacity="0.75"/><circle cx="0.00" cy="100.00" r="1.30" fill="#718178" data-hole="b1" opacity="0.75"/><circle cx="0.00" cy="90.00" r="1.30" fill="#718178" data-hole="c1" opacity="0.75"/><circle cx="0.00" cy="80.00" r="1.30" fill="#718178" data-hole="d1" opacity="0.75"/><circle cx="0.00" cy="70.00" r="1.30" fill="#718178" data-hole="e1" opacity="0.75"/><circle cx="0.00" cy="40.00" r="1.30" fill="#718178" data-hole="f1" opacity="0.75"/><circle cx="0.00" cy="30.00" r="1.30" fill="#718178" data-hole="g1" opacity="0.75"/><circle cx="0.00" cy="20.00" r="1.30" fill="#718178" data-hole="h1" opacity="0.75"/><circle cx="0.00" cy="10.00" r="1.30" fill="#718178" data-hole="i1" opacity="0.75"/><circle cx="0.00" cy="0.00" r="1.30" fill="#718178" data-hole="j1" opacity="0.75"/><circle cx="10.00" cy="110.00" r="1.30" fill="#718178" data-hole="a2" opacity="0.75"/><circle cx="10.00" cy="100.00" r="1.30" fill="#718178" data-hole="b2" opacity="0.75"/><circle cx="10.00" cy="90.00" r="1.30" fill="#718178" data-hole="c2" opacity="0.75"/><circle cx="10.00" cy="80.00" r="1.30" fill="#718178" data-hole="d2" opacity="0.75"/><circle cx="10.00" cy="70.00" r="1.30" fill="#718178" data-hole="e2" opacity="0.75"/><circle cx="10.00" cy="40.00" r="1.30" fill="#718178" data-hole="f2" opacity="0.75"/><circle cx="10.00" cy="30.00" r="1.30" fill="#718178" data-hole="g2" opacity="0.75"/><circle cx="10.00" cy="20.00" r="1.30" fill="#718178" data-hole="h2" opacity="0.75"/><circle cx="10.00" cy="10.00" r="1.30" fill="#718178" data-hole="i2" opacity="0.75"/><circle cx="10.00" cy="0.00" r="1.30" fill="#718178" data-hole="j2" opacity="0.75"/><circle cx="20.00" cy="110.00" r="1.30" fill="#718178" data-hole="a3" opacity="0.75"/><circle cx="20.00" cy="100.00" r="1.30" fill="#718178" data-hole="b3" opacity="0.75"/><circle cx="20.00" cy="90.00" r="1.30" fill="#718178" data-hole="c3" opacity="0.75"/><circle cx="20.00" cy="80.00" r="1.30" fill="#718178" data-hole="d3" opacity="0.75"/><circle cx="20.00" cy="70.00" r="1.30" fill="#718178" data-hole="e3" opacity="0.75"/><circle cx="20.00" cy="40.00" r="1.30" fill="#718178" data-hole="f3" opacity="0.75"/><circle cx="20.00" cy="30.00" r="1.30" fill="#718178" data-hole="g3" opacity="0.75"/><circle cx="20.00" cy="20.00" r="1.30" fill="#718178" data-hole="h3" opacity="0.75"/><circle cx="20.00" cy="10.00" r="1.30" fill="#718178" data-hole="i3" opacity="0.75"/><circle cx="20.00" cy="0.00" r="1.30" fill="#718178" data-hole="j3" opacity="0.75"/><circle cx="30.00" cy="110.00" r="1.30" fill="#718178" data-hole="a4" opacity="0.75"/><circle cx="30.00" cy="100.00" r="1.30" fill="#718178" data-hole="b4" opacity="0.75"/><circle cx="30.00" cy="90.00" r="1.30" fill="#718178" data-hole="c4" opacity="0.75"/><circle cx="30.00" cy="80.00" r="1.30" fill="#718178" data-hole="d4" opacity="0.75"/><circle cx="30.00" cy="70.00" r="1.30" fill="#718178" data-hole="e4" opacity="0.75"/><circle cx="30.00" cy="40.00" r="1.30" fill="#718178" data-hole="f4" opacity="0.75"/><circle cx="30.00" cy="30.00" r="1.30" fill="#718178" data-hole="g4" opacity="0.75"/><circle cx="30.00" cy="20.00" r="1.30" fill="#718178" data-hole="h4" opacity="0.75"/><circle cx="30.00" cy="10.00" r="1.30" fill="#718178" data-hole="i4" opacity="0.75"/><circle cx="30.00" cy="0.00" r="1.30" fill="#718178" data-hole="j4" opacity="0.75"/><circle cx="40.00" cy="110.00" r="1.30" fill="#718178" data-hole="a5" opacity="0.75"/><circle cx="40.00" cy="100.00" r="1.30" fill="#718178" data-hole="b5" opacity="0.75"/><circle cx="40.00" cy="90.00" r="1.30" fill="#718178" data-hole="c5" opacity="0.75"/><circle cx="40.00" cy="80.00" r="1.30" fill="#718178" data-hole="d5" opacity="0.75"/><circle cx="40.00" cy="70.00" r="1.30" fill="#718178" data-hole="e5" opacity="0.75"/><circle cx="40.00" cy="40.00" r="1.30" fill="#718178" data-hole="f5" opacity="0.75"/><circle cx="40.00" cy="30.00" r="1.30" fill="#718178" data-hole="g5" opacity="0.75"/><circle cx="40.00" cy="20.00" r="1.30" fill="#718178" data-hole="h5" opacity="0.75"/><circle cx="40.00" cy="10.00" r="1.30" fill="#718178" data-hole="i5" opacity="0.75"/><circle cx="40.00" cy="0.00" r="1.30" fill="#718178" data-hole="j5" opacity="0.75"/><circle cx="50.00" cy="110.00" r="1.30" fill="#718178" data-hole="a6" opacity="0.75"/><circle cx="50.00" cy="100.00" r="1.30" fill="#718178" data-hole="b6" opacity="0.75"/><circle cx="50.00" cy="90.00" r="1.30" fill="#718178" data-hole="c6" opacity="0.75"/><circle cx="50.00" cy="80.00" r="1.30" fill="#718178" data-hole="d6" opacity="0.75"/><circle cx="50.00" cy="70.00" r="1.30" fill="#718178" data-hole="e6" opacity="0.75"/><circle cx="50.00" cy="40.00" r="1.30" fill="#718178" data-hole="f6" opacity="0.75"/><circle cx="50.00" cy="30.00" r="1.30" fill="#718178" data-hole="g6" opacity="0.75"/><circle cx="50.00" cy="20.00" r="1.30" fill="#718178" data-hole="h6" opacity="0.75"/><circle cx="50.00" cy="10.00" r="1.30" fill="#718178" data-hole="i6" opacity="0.75"/><circle cx="50.00" cy="0.00" r="1.30" fill="#718178" data-hole="j6" opacity="0.75"/><circle cx="60.00" cy="110.00" r="1.30" fill="#718178" data-hole="a7" opacity="0.75"/><circle cx="60.00" cy="100.00" r="1.30" fill="#718178" data-hole="b7" opacity="0.75"/><circle cx="60.00" cy="90.00" r="1.30" fill="#718178" data-hole="c7" opacity="0.75"/><circle cx="60.00" cy="80.00" r="1.30" fill="#718178" data-hole="d7" opacity="0.75"/><circle cx="60.00" cy="70.00" r="1.30" fill="#718178" data-hole="e7" opacity="0.75"/><circle cx="60.00" cy="40.00" r="1.30" fill="#718178" data-hole="f7" opacity="0.75"/><circle cx="60.00" cy="30.00" r="1.30" fill="#718178" data-hole="g7" opacity="0.75"/><circle cx="60.00" cy="20.00" r="1.30" fill="#718178" data-hole="h7" opacity="0.75"/><circle cx="60.00" cy="10.00" r="1.30" fill="#718178" data-hole="i7" opacity="0.75"/><circle cx="60.00" cy="0.00" r="1.30" fill="#718178" data-hole="j7" opacity="0.75"/><circle cx="70.00" cy="110.00" r="1.30" fill="#718178" data-hole="a8" opacity="0.75"/><circle cx="70.00" cy="100.00" r="1.30" fill="#718178" data-hole="b8" opacity="0.75"/><circle cx="70.00" cy="90.00" r="1.30" fill="#718178" data-hole="c8" opacity="0.75"/><circle cx="70.00" cy="80.00" r="1.30" fill="#718178" data-hole="d8" opacity="0.75"/><circle cx="70.00" cy="70.00" r="1.30" fill="#718178" data-hole="e8" opacity="0.75"/><circle cx="70.00" cy="40.00" r="1.30" fill="#718178" data-hole="f8" opacity="0.75"/><circle cx="70.00" cy="30.00" r="1.30" fill="#718178" data-hole="g8" opacity="0.75"/><circle cx="70.00" cy="20.00" r="1.30" fill="#718178" data-hole="h8" opacity="0.75"/><circle cx="70.00" cy="10.00" r="1.30" fill="#718178" data-hole="i8" opacity="0.75"/><circle cx="70.00" cy="0.00" r="1.30" fill="#718178" data-hole="j8" opacity="0.75"/><circle cx="80.00" cy="110.00" r="1.30" fill="#718178" data-hole="a9" opacity="0.75"/><circle cx="80.00" cy="100.00" r="1.30" fill="#718178" data-hole="b9" opacity="0.75"/><circle cx="80.00" cy="90.00" r="1.30" fill="#718178" data-hole="c9" opacity="0.75"/><circle cx="80.00" cy="80.00" r="1.30" fill="#718178" data-hole="d9" opacity="0.75"/><circle cx="80.00" cy="70.00" r="1.30" fill="#718178" data-hole="e9" opacity="0.75"/><circle cx="80.00" cy="40.00" r="1.30" fill="#718178" data-hole="f9" opacity="0.75"/><circle cx="80.00" cy="30.00" r="1.30" fill="#718178" data-hole="g9" opacity="0.75"/><circle cx="80.00" cy="20.00" r="1.30" fill="#718178" data-hole="h9" opacity="0.75"/><circle cx="80.00" cy="10.00" r="1.30" fill="#718178" data-hole="i9" opacity="0.75"/><circle cx="80.00" cy="0.00" r="1.30" fill="#718178" data-hole="j9" opacity="0.75"/><circle cx="90.00" cy="110.00" r="1.80" fill="#d4e2d9" data-hole="a10" opacity="1"/><circle cx="90.00" cy="100.00" r="1.80" fill="#d4e2d9" data-hole="b10" opacity="1"/><circle cx="90.00" cy="90.00" r="1.80" fill="#d4e2d9" data-hole="c10" opacity="1"/><circle cx="90.00" cy="80.00" r="1.80" fill="#d4e2d9" data-hole="d10" opacity="1"/><circle cx="90.00" cy="70.00" r="1.80" fill="#d4e2d9" data-hole="e10" opacity="1"/><circle cx="90.00" cy="40.00" r="1.30" fill="#718178" data-hole="f10" opacity="0.75"/><circle cx="90.00" cy="30.00" r="1.30" fill="#718178" data-hole="g10" opacity="0.75"/><circle cx="90.00" cy="20.00" r="1.30" fill="#718178" data-hole="h10" opacity="0.75"/><circle cx="90.00" cy="10.00" r="1.30" fill="#718178" data-hole="i10" opacity="0.75"/><circle cx="90.00" cy="0.00" r="1.30" fill="#718178" data-hole="j10" opacity="0.75"/><circle cx="100.00" cy="110.00" r="1.30" fill="#718178" data-hole="a11" opacity="0.75"/><circle cx="100.00" cy="100.00" r="1.30" fill="#718178" data-hole="b11" opacity="0.75"/><circle cx="100.00" cy="90.00" r="1.30" fill="#718178" data-hole="c11" opacity="0.75"/><circle cx="100.00" cy="80.00" r="1.30" fill="#718178" data-hole="d11" opacity="0.75"/><circle cx="100.00" cy="70.00" r="1.30" fill="#718178" data-hole="e11" opacity="0.75"/><circle cx="100.00" cy="40.00" r="1.30" fill="#718178" data-hole="f11" opacity="0.75"/><circle cx="100.00" cy="30.00" r="1.30" fill="#718178" data-hole="g11" opacity="0.75"/><circle cx="100.00" cy="20.00" r="1.30" fill="#718178" data-hole="h11" opacity="0.75"/><circle cx="100.00" cy="10.00" r="1.30" fill="#718178" data-hole="i11" opacity="0.75"/><circle cx="100.00" cy="0.00" r="1.30" fill="#718178" data-hole="j11" opacity="0.75"/><circle cx="110.00" cy="110.00" r="1.30" fill="#718178" data-hole="a12" opacity="0.75"/><circle cx="110.00" cy="100.00" r="1.30" fill="#718178" data-hole="b12" opacity="0.75"/><circle cx="110.00" cy="90.00" r="1.30" fill="#718178" data-hole="c12" opacity="0.75"/><circle cx="110.00" cy="80.00" r="1.30" fill="#718178" data-hole="d12" opacity="0.75"/><circle cx="110.00" cy="70.00" r="1.30" fill="#718178" data-hole="e12" opacity="0.75"/><circle cx="110.00" cy="40.00" r="1.30" fill="#718178" data-hole="f12" opacity="0.75"/><circle cx="110.00" cy="30.00" r="1.30" fill="#718178" data-hole="g12" opacity="0.75"/><circle cx="110.00" cy="20.00" r="1.30" fill="#718178" data-hole="h12" opacity="0.75"/><circle cx="110.00" cy="10.00" r="1.30" fill="#718178" data-hole="i12" opacity="0.75"/><circle cx="110.00" cy="0.00" r="1.30" fill="#718178" data-hole="j12" opacity="0.75"/><circle cx="120.00" cy="110.00" r="1.30" fill="#718178" data-hole="a13" opacity="0.75"/><circle cx="120.00" cy="100.00" r="1.30" fill="#718178" data-hole="b13" opacity="0.75"/><circle cx="120.00" cy="90.00" r="1.30" fill="#718178" data-hole="c13" opacity="0.75"/><circle cx="120.00" cy="80.00" r="1.30" fill="#718178" data-hole="d13" opacity="0.75"/><circle cx="120.00" cy="70.00" r="1.30" fill="#718178" data-hole="e13" opacity="0.75"/><circle cx="120.00" cy="40.00" r="1.30" fill="#718178" data-hole="f13" opacity="0.75"/><circle cx="120.00" cy="30.00" r="1.30" fill="#718178" data-hole="g13" opacity="0.75"/><circle cx="120.00" cy="20.00" r="1.30" fill="#718178" data-hole="h13" opacity="0.75"/><circle cx="120.00" cy="10.00" r="1.30" fill="#718178" data-hole="i13" opacity="0.75"/><circle cx="120.00" cy="0.00" r="1.30" fill="#718178" data-hole="j13" opacity="0.75"/><circle cx="130.00" cy="110.00" r="1.80" fill="#d4e2d9" data-hole="a14" opacity="1"/><circle cx="130.00" cy="100.00" r="1.80" fill="#d4e2d9" data-hole="b14" opacity="1"/><circle cx="130.00" cy="90.00" r="1.80" fill="#d4e2d9" data-hole="c14" opacity="1"/><circle cx="130.00" cy="80.00" r="1.80" fill="#d4e2d9" data-hole="d14" opacity="1"/><circle cx="130.00" cy="70.00" r="1.80" fill="#d4e2d9" data-hole="e14" opacity="1"/><circle cx="130.00" cy="40.00" r="1.30" fill="#718178" data-hole="f14" opacity="0.75"/><circle cx="130.00" cy="30.00" r="1.30" fill="#718178" data-hole="g14" opacity="0.75"/><circle cx="130.00" cy="20.00" r="1.30" fill="#718178" data-hole="h14" opacity="0.75"/><circle cx="130.00" cy="10.00" r="1.30" fill="#718178" data-hole="i14" opacity="0.75"/><circle cx="130.00" cy="0.00" r="1.30" fill="#718178" data-hole="j14" opacity="0.75"/><circle cx="140.00" cy="110.00" r="1.30" fill="#718178" data-hole="a15" opacity="0.75"/><circle cx="140.00" cy="100.00" r="1.30" fill="#718178" data-hole="b15" opacity="0.75"/><circle cx="140.00" cy="90.00" r="1.30" fill="#718178" data-hole="c15" opacity="0.75"/><circle cx="140.00" cy="80.00" r="1.30" fill="#718178" data-hole="d15" opacity="0.75"/><circle cx="140.00" cy="70.00" r="1.30" fill="#718178" data-hole="e15" opacity="0.75"/><circle cx="140.00" cy="40.00" r="1.30" fill="#718178" data-hole="f15" opacity="0.75"/><circle cx="140.00" cy="30.00" r="1.30" fill="#718178" data-hole="g15" opacity="0.75"/><circle cx="140.00" cy="20.00" r="1.30" fill="#718178" data-hole="h15" opacity="0.75"/><circle cx="140.00" cy="10.00" r="1.30" fill="#718178" data-hole="i15" opacity="0.75"/><circle cx="140.00" cy="0.00" r="1.30" fill="#718178" data-hole="j15" opacity="0.75"/><circle cx="150.00" cy="110.00" r="1.80" fill="#d4e2d9" data-hole="a16" opacity="1"/><circle cx="150.00" cy="100.00" r="1.80" fill="#d4e2d9" data-hole="b16" opacity="1"/><circle cx="150.00" cy="90.00" r="1.80" fill="#d4e2d9" data-hole="c16" opacity="1"/><circle cx="150.00" cy="80.00" r="1.80" fill="#d4e2d9" data-hole="d16" opacity="1"/><circle cx="150.00" cy="70.00" r="1.80" fill="#d4e2d9" data-hole="e16" opacity="1"/><circle cx="150.00" cy="40.00" r="1.30" fill="#718178" data-hole="f16" opacity="0.75"/><circle cx="150.00" cy="30.00" r="1.30" fill="#718178" data-hole="g16" opacity="0.75"/><circle cx="150.00" cy="20.00" r="1.30" fill="#718178" data-hole="h16" opacity="0.75"/><circle cx="150.00" cy="10.00" r="1.30" fill="#718178" data-hole="i16" opacity="0.75"/><circle cx="150.00" cy="0.00" r="1.30" fill="#718178" data-hole="j16" opacity="0.75"/><circle cx="160.00" cy="110.00" r="1.30" fill="#718178" data-hole="a17" opacity="0.75"/><circle cx="160.00" cy="100.00" r="1.30" fill="#718178" data-hole="b17" opacity="0.75"/><circle cx="160.00" cy="90.00" r="1.30" fill="#718178" data-hole="c17" opacity="0.75"/><circle cx="160.00" cy="80.00" r="1.30" fill="#718178" data-hole="d17" opacity="0.75"/><circle cx="160.00" cy="70.00" r="1.30" fill="#718178" data-hole="e17" opacity="0.75"/><circle cx="160.00" cy="40.00" r="1.30" fill="#718178" data-hole="f17" opacity="0.75"/><circle cx="160.00" cy="30.00" r="1.30" fill="#718178" data-hole="g17" opacity="0.75"/><circle cx="160.00" cy="20.00" r="1.30" fill="#718178" data-hole="h17" opacity="0.75"/><circle cx="160.00" cy="10.00" r="1.30" fill="#718178" data-hole="i17" opacity="0.75"/><circle cx="160.00" cy="0.00" r="1.30" fill="#718178" data-hole="j17" opacity="0.75"/><circle cx="170.00" cy="110.00" r="1.30" fill="#718178" data-hole="a18" opacity="0.75"/><circle cx="170.00" cy="100.00" r="1.30" fill="#718178" data-hole="b18" opacity="0.75"/><circle cx="170.00" cy="90.00" r="1.30" fill="#718178" data-hole="c18" opacity="0.75"/><circle cx="170.00" cy="80.00" r="1.30" fill="#718178" data-hole="d18" opacity="0.75"/><circle cx="170.00" cy="70.00" r="1.30" fill="#718178" data-hole="e18" opacity="0.75"/><circle cx="170.00" cy="40.00" r="1.30" fill="#718178" data-hole="f18" opacity="0.75"/><circle cx="170.00" cy="30.00" r="1.30" fill="#718178" data-hole="g18" opacity="0.75"/><circle cx="170.00" cy="20.00" r="1.30" fill="#718178" data-hole="h18" opacity="0.75"/><circle cx="170.00" cy="10.00" r="1.30" fill="#718178" data-hole="i18" opacity="0.75"/><circle cx="170.00" cy="0.00" r="1.30" fill="#718178" data-hole="j18" opacity="0.75"/><circle cx="180.00" cy="110.00" r="1.30" fill="#718178" data-hole="a19" opacity="0.75"/><circle cx="180.00" cy="100.00" r="1.30" fill="#718178" data-hole="b19" opacity="0.75"/><circle cx="180.00" cy="90.00" r="1.30" fill="#718178" data-hole="c19" opacity="0.75"/><circle cx="180.00" cy="80.00" r="1.30" fill="#718178" data-hole="d19" opacity="0.75"/><circle cx="180.00" cy="70.00" r="1.30" fill="#718178" data-hole="e19" opacity="0.75"/><circle cx="180.00" cy="40.00" r="1.30" fill="#718178" data-hole="f19" opacity="0.75"/><circle cx="180.00" cy="30.00" r="1.30" fill="#718178" data-hole="g19" opacity="0.75"/><circle cx="180.00" cy="20.00" r="1.30" fill="#718178" data-hole="h19" opacity="0.75"/><circle cx="180.00" cy="10.00" r="1.30" fill="#718178" data-hole="i19" opacity="0.75"/><circle cx="180.00" cy="0.00" r="1.30" fill="#718178" data-hole="j19" opacity="0.75"/><circle cx="190.00" cy="110.00" r="1.30" fill="#718178" data-hole="a20" opacity="0.75"/><circle cx="190.00" cy="100.00" r="1.30" fill="#718178" data-hole="b20" opacity="0.75"/><circle cx="190.00" cy="90.00" r="1.30" fill="#718178" data-hole="c20" opacity="0.75"/><circle cx="190.00" cy="80.00" r="1.30" fill="#718178" data-hole="d20" opacity="0.75"/><circle cx="190.00" cy="70.00" r="1.30" fill="#718178" data-hole="e20" opacity="0.75"/><circle cx="190.00" cy="40.00" r="1.30" fill="#718178" data-hole="f20" opacity="0.75"/><circle cx="190.00" cy="30.00" r="1.30" fill="#718178" data-hole="g20" opacity="0.75"/><circle cx="190.00" cy="20.00" r="1.30" fill="#718178" data-hole="h20" opacity="0.75"/><circle cx="190.00" cy="10.00" r="1.30" fill="#718178" data-hole="i20" opacity="0.75"/><circle cx="190.00" cy="0.00" r="1.30" fill="#718178" data-hole="j20" opacity="0.75"/><circle cx="200.00" cy="110.00" r="1.30" fill="#718178" data-hole="a21" opacity="0.75"/><circle cx="200.00" cy="100.00" r="1.30" fill="#718178" data-hole="b21" opacity="0.75"/><circle cx="200.00" cy="90.00" r="1.30" fill="#718178" data-hole="c21" opacity="0.75"/><circle cx="200.00" cy="80.00" r="1.30" fill="#718178" data-hole="d21" opacity="0.75"/><circle cx="200.00" cy="70.00" r="1.30" fill="#718178" data-hole="e21" opacity="0.75"/><circle cx="200.00" cy="40.00" r="1.30" fill="#718178" data-hole="f21" opacity="0.75"/><circle cx="200.00" cy="30.00" r="1.30" fill="#718178" data-hole="g21" opacity="0.75"/><circle cx="200.00" cy="20.00" r="1.30" fill="#718178" data-hole="h21" opacity="0.75"/><circle cx="200.00" cy="10.00" r="1.30" fill="#718178" data-hole="i21" opacity="0.75"/><circle cx="200.00" cy="0.00" r="1.30" fill="#718178" data-hole="j21" opacity="0.75"/><circle cx="210.00" cy="110.00" r="1.30" fill="#718178" data-hole="a22" opacity="0.75"/><circle cx="210.00" cy="100.00" r="1.30" fill="#718178" data-hole="b22" opacity="0.75"/><circle cx="210.00" cy="90.00" r="1.30" fill="#718178" data-hole="c22" opacity="0.75"/><circle cx="210.00" cy="80.00" r="1.30" fill="#718178" data-hole="d22" opacity="0.75"/><circle cx="210.00" cy="70.00" r="1.30" fill="#718178" data-hole="e22" opacity="0.75"/><circle cx="210.00" cy="40.00" r="1.30" fill="#718178" data-hole="f22" opacity="0.75"/><circle cx="210.00" cy="30.00" r="1.30" fill="#718178" data-hole="g22" opacity="0.75"/><circle cx="210.00" cy="20.00" r="1.30" fill="#718178" data-hole="h22" opacity="0.75"/><circle cx="210.00" cy="10.00" r="1.30" fill="#718178" data-hole="i22" opacity="0.75"/><circle cx="210.00" cy="0.00" r="1.30" fill="#718178" data-hole="j22" opacity="0.75"/><circle cx="220.00" cy="110.00" r="1.30" fill="#718178" data-hole="a23" opacity="0.75"/><circle cx="220.00" cy="100.00" r="1.30" fill="#718178" data-hole="b23" opacity="0.75"/><circle cx="220.00" cy="90.00" r="1.30" fill="#718178" data-hole="c23" opacity="0.75"/><circle cx="220.00" cy="80.00" r="1.30" fill="#718178" data-hole="d23" opacity="0.75"/><circle cx="220.00" cy="70.00" r="1.30" fill="#718178" data-hole="e23" opacity="0.75"/><circle cx="220.00" cy="40.00" r="1.30" fill="#718178" data-hole="f23" opacity="0.75"/><circle cx="220.00" cy="30.00" r="1.30" fill="#718178" data-hole="g23" opacity="0.75"/><circle cx="220.00" cy="20.00" r="1.30" fill="#718178" data-hole="h23" opacity="0.75"/><circle cx="220.00" cy="10.00" r="1.30" fill="#718178" data-hole="i23" opacity="0.75"/><circle cx="220.00" cy="0.00" r="1.30" fill="#718178" data-hole="j23" opacity="0.75"/><circle cx="230.00" cy="110.00" r="1.30" fill="#718178" data-hole="a24" opacity="0.75"/><circle cx="230.00" cy="100.00" r="1.30" fill="#718178" data-hole="b24" opacity="0.75"/><circle cx="230.00" cy="90.00" r="1.30" fill="#718178" data-hole="c24" opacity="0.75"/><circle cx="230.00" cy="80.00" r="1.30" fill="#718178" data-hole="d24" opacity="0.75"/><circle cx="230.00" cy="70.00" r="1.30" fill="#718178" data-hole="e24" opacity="0.75"/><circle cx="230.00" cy="40.00" r="1.30" fill="#718178" data-hole="f24" opacity="0.75"/><circle cx="230.00" cy="30.00" r="1.30" fill="#718178" data-hole="g24" opacity="0.75"/><circle cx="230.00" cy="20.00" r="1.30" fill="#718178" data-hole="h24" opacity="0.75"/><circle cx="230.00" cy="10.00" r="1.30" fill="#718178" data-hole="i24" opacity="0.75"/><circle cx="230.00" cy="0.00" r="1.30" fill="#718178" data-hole="j24" opacity="0.75"/><circle cx="240.00" cy="110.00" r="1.30" fill="#718178" data-hole="a25" opacity="0.75"/><circle cx="240.00" cy="100.00" r="1.30" fill="#718178" data-hole="b25" opacity="0.75"/><circle cx="240.00" cy="90.00" r="1.30" fill="#718178" data-hole="c25" opacity="0.75"/><circle cx="240.00" cy="80.00" r="1.30" fill="#718178" data-hole="d25" opacity="0.75"/><circle cx="240.00" cy="70.00" r="1.30" fill="#718178" data-hole="e25" opacity="0.75"/><circle cx="240.00" cy="40.00" r="1.30" fill="#718178" data-hole="f25" opacity="0.75"/><circle cx="240.00" cy="30.00" r="1.30" fill="#718178" data-hole="g25" opacity="0.75"/><circle cx="240.00" cy="20.00" r="1.30" fill="#718178" data-hole="h25" opacity="0.75"/><circle cx="240.00" cy="10.00" r="1.30" fill="#718178" data-hole="i25" opacity="0.75"/><circle cx="240.00" cy="0.00" r="1.30" fill="#718178" data-hole="j25" opacity="0.75"/><circle cx="250.00" cy="110.00" r="1.30" fill="#718178" data-hole="a26" opacity="0.75"/><circle cx="250.00" cy="100.00" r="1.30" fill="#718178" data-hole="b26" opacity="0.75"/><circle cx="250.00" cy="90.00" r="1.30" fill="#718178" data-hole="c26" opacity="0.75"/><circle cx="250.00" cy="80.00" r="1.30" fill="#718178" data-hole="d26" opacity="0.75"/><circle cx="250.00" cy="70.00" r="1.30" fill="#718178" data-hole="e26" opacity="0.75"/><circle cx="250.00" cy="40.00" r="1.30" fill="#718178" data-hole="f26" opacity="0.75"/><circle cx="250.00" cy="30.00" r="1.30" fill="#718178" data-hole="g26" opacity="0.75"/><circle cx="250.00" cy="20.00" r="1.30" fill="#718178" data-hole="h26" opacity="0.75"/><circle cx="250.00" cy="10.00" r="1.30" fill="#718178" data-hole="i26" opacity="0.75"/><circle cx="250.00" cy="0.00" r="1.30" fill="#718178" data-hole="j26" opacity="0.75"/><circle cx="260.00" cy="110.00" r="1.30" fill="#718178" data-hole="a27" opacity="0.75"/><circle cx="260.00" cy="100.00" r="1.30" fill="#718178" data-hole="b27" opacity="0.75"/><circle cx="260.00" cy="90.00" r="1.30" fill="#718178" data-hole="c27" opacity="0.75"/><circle cx="260.00" cy="80.00" r="1.30" fill="#718178" data-hole="d27" opacity="0.75"/><circle cx="260.00" cy="70.00" r="1.30" fill="#718178" data-hole="e27" opacity="0.75"/><circle cx="260.00" cy="40.00" r="1.30" fill="#718178" data-hole="f27" opacity="0.75"/><circle cx="260.00" cy="30.00" r="1.30" fill="#718178" data-hole="g27" opacity="0.75"/><circle cx="260.00" cy="20.00" r="1.30" fill="#718178" data-hole="h27" opacity="0.75"/><circle cx="260.00" cy="10.00" r="1.30" fill="#718178" data-hole="i27" opacity="0.75"/><circle cx="260.00" cy="0.00" r="1.30" fill="#718178" data-hole="j27" opacity="0.75"/><circle cx="270.00" cy="110.00" r="1.30" fill="#718178" data-hole="a28" opacity="0.75"/><circle cx="270.00" cy="100.00" r="1.30" fill="#718178" data-hole="b28" opacity="0.75"/><circle cx="270.00" cy="90.00" r="1.30" fill="#718178" data-hole="c28" opacity="0.75"/><circle cx="270.00" cy="80.00" r="1.30" fill="#718178" data-hole="d28" opacity="0.75"/><circle cx="270.00" cy="70.00" r="1.30" fill="#718178" data-hole="e28" opacity="0.75"/><circle cx="270.00" cy="40.00" r="1.30" fill="#718178" data-hole="f28" opacity="0.75"/><circle cx="270.00" cy="30.00" r="1.30" fill="#718178" data-hole="g28" opacity="0.75"/><circle cx="270.00" cy="20.00" r="1.30" fill="#718178" data-hole="h28" opacity="0.75"/><circle cx="270.00" cy="10.00" r="1.30" fill="#718178" data-hole="i28" opacity="0.75"/><circle cx="270.00" cy="0.00" r="1.30" fill="#718178" data-hole="j28" opacity="0.75"/><circle cx="280.00" cy="110.00" r="1.30" fill="#718178" data-hole="a29" opacity="0.75"/><circle cx="280.00" cy="100.00" r="1.30" fill="#718178" data-hole="b29" opacity="0.75"/><circle cx="280.00" cy="90.00" r="1.30" fill="#718178" data-hole="c29" opacity="0.75"/><circle cx="280.00" cy="80.00" r="1.30" fill="#718178" data-hole="d29" opacity="0.75"/><circle cx="280.00" cy="70.00" r="1.30" fill="#718178" data-hole="e29" opacity="0.75"/><circle cx="280.00" cy="40.00" r="1.30" fill="#718178" data-hole="f29" opacity="0.75"/><circle cx="280.00" cy="30.00" r="1.30" fill="#718178" data-hole="g29" opacity="0.75"/><circle cx="280.00" cy="20.00" r="1.30" fill="#718178" data-hole="h29" opacity="0.75"/><circle cx="280.00" cy="10.00" r="1.30" fill="#718178" data-hole="i29" opacity="0.75"/><circle cx="280.00" cy="0.00" r="1.30" fill="#718178" data-hole="j29" opacity="0.75"/><circle cx="290.00" cy="110.00" r="1.30" fill="#718178" data-hole="a30" opacity="0.75"/><circle cx="290.00" cy="100.00" r="1.30" fill="#718178" data-hole="b30" opacity="0.75"/><circle cx="290.00" cy="90.00" r="1.30" fill="#718178" data-hole="c30" opacity="0.75"/><circle cx="290.00" cy="80.00" r="1.30" fill="#718178" data-hole="d30" opacity="0.75"/><circle cx="290.00" cy="70.00" r="1.30" fill="#718178" data-hole="e30" opacity="0.75"/><circle cx="290.00" cy="40.00" r="1.30" fill="#718178" data-hole="f30" opacity="0.75"/><circle cx="290.00" cy="30.00" r="1.30" fill="#718178" data-hole="g30" opacity="0.75"/><circle cx="290.00" cy="20.00" r="1.30" fill="#718178" data-hole="h30" opacity="0.75"/><circle cx="290.00" cy="10.00" r="1.30" fill="#718178" data-hole="i30" opacity="0.75"/><circle cx="290.00" cy="0.00" r="1.30" fill="#718178" data-hole="j30" opacity="0.75"/><circle cx="10.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+1" opacity="0.75"/><circle cx="20.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+2" opacity="0.75"/><circle cx="30.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+3" opacity="0.75"/><circle cx="40.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+4" opacity="0.75"/><circle cx="50.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+5" opacity="0.75"/><circle cx="70.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+6" opacity="0.75"/><circle cx="80.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+7" opacity="0.75"/><circle cx="90.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+8" opacity="0.75"/><circle cx="100.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+9" opacity="0.75"/><circle cx="110.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+10" opacity="0.75"/><circle cx="130.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+11" opacity="0.75"/><circle cx="140.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+12" opacity="0.75"/><circle cx="150.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+13" opacity="0.75"/><circle cx="160.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+14" opacity="0.75"/><circle cx="170.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+15" opacity="0.75"/><circle cx="190.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+16" opacity="0.75"/><circle cx="200.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+17" opacity="0.75"/><circle cx="210.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+18" opacity="0.75"/><circle cx="220.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+19" opacity="0.75"/><circle cx="230.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+20" opacity="0.75"/><circle cx="250.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+21" opacity="0.75"/><circle cx="260.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+22" opacity="0.75"/><circle cx="270.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+23" opacity="0.75"/><circle cx="280.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+24" opacity="0.75"/><circle cx="290.00" cy="-20.00" r="1.30" fill="#718178" data-hole="T+25" opacity="0.75"/><circle cx="10.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-1" opacity="0.75"/><circle cx="20.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-2" opacity="0.75"/><circle cx="30.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-3" opacity="0.75"/><circle cx="40.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-4" opacity="0.75"/><circle cx="50.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-5" opacity="0.75"/><circle cx="70.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-6" opacity="0.75"/><circle cx="80.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-7" opacity="0.75"/><circle cx="90.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-8" opacity="0.75"/><circle cx="100.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-9" opacity="0.75"/><circle cx="110.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-10" opacity="0.75"/><circle cx="130.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-11" opacity="0.75"/><circle cx="140.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-12" opacity="0.75"/><circle cx="150.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-13" opacity="0.75"/><circle cx="160.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-14" opacity="0.75"/><circle cx="170.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-15" opacity="0.75"/><circle cx="190.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-16" opacity="0.75"/><circle cx="200.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-17" opacity="0.75"/><circle cx="210.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-18" opacity="0.75"/><circle cx="220.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-19" opacity="0.75"/><circle cx="230.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-20" opacity="0.75"/><circle cx="250.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-21" opacity="0.75"/><circle cx="260.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-22" opacity="0.75"/><circle cx="270.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-23" opacity="0.75"/><circle cx="280.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-24" opacity="0.75"/><circle cx="290.00" cy="-30.00" r="1.30" fill="#718178" data-hole="T-25" opacity="0.75"/><circle cx="10.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+1" opacity="0.75"/><circle cx="20.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+2" opacity="0.75"/><circle cx="30.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+3" opacity="0.75"/><circle cx="40.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+4" opacity="0.75"/><circle cx="50.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+5" opacity="0.75"/><circle cx="70.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+6" opacity="0.75"/><circle cx="80.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+7" opacity="0.75"/><circle cx="90.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+8" opacity="0.75"/><circle cx="100.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+9" opacity="0.75"/><circle cx="110.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+10" opacity="0.75"/><circle cx="130.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+11" opacity="0.75"/><circle cx="140.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+12" opacity="0.75"/><circle cx="150.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+13" opacity="0.75"/><circle cx="160.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+14" opacity="0.75"/><circle cx="170.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+15" opacity="0.75"/><circle cx="190.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+16" opacity="0.75"/><circle cx="200.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+17" opacity="0.75"/><circle cx="210.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+18" opacity="0.75"/><circle cx="220.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+19" opacity="0.75"/><circle cx="230.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+20" opacity="0.75"/><circle cx="250.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+21" opacity="0.75"/><circle cx="260.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+22" opacity="0.75"/><circle cx="270.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+23" opacity="0.75"/><circle cx="280.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+24" opacity="0.75"/><circle cx="290.00" cy="140.00" r="1.30" fill="#718178" data-hole="B+25" opacity="0.75"/><circle cx="10.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-1" opacity="0.75"/><circle cx="20.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-2" opacity="0.75"/><circle cx="30.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-3" opacity="0.75"/><circle cx="40.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-4" opacity="0.75"/><circle cx="50.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-5" opacity="0.75"/><circle cx="70.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-6" opacity="0.75"/><circle cx="80.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-7" opacity="0.75"/><circle cx="90.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-8" opacity="0.75"/><circle cx="100.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-9" opacity="0.75"/><circle cx="110.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-10" opacity="0.75"/><circle cx="130.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-11" opacity="0.75"/><circle cx="140.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-12" opacity="0.75"/><circle cx="150.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-13" opacity="0.75"/><circle cx="160.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-14" opacity="0.75"/><circle cx="170.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-15" opacity="0.75"/><circle cx="190.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-16" opacity="0.75"/><circle cx="200.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-17" opacity="0.75"/><circle cx="210.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-18" opacity="0.75"/><circle cx="220.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-19" opacity="0.75"/><circle cx="230.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-20" opacity="0.75"/><circle cx="250.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-21" opacity="0.75"/><circle cx="260.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-22" opacity="0.75"/><circle cx="270.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-23" opacity="0.75"/><circle cx="280.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-24" opacity="0.75"/><circle cx="290.00" cy="130.00" r="1.30" fill="#718178" data-hole="B-25" opacity="0.75"/></g>
8
+ <g id="components"><g data-ref="R1"><line x1="90.00" y1="110.00" x2="110.00" y2="110.00" stroke="#91a199" stroke-width="0.90"/><line x1="130.00" y1="110.00" x2="110.00" y2="110.00" stroke="#91a199" stroke-width="0.90"/><rect x="98.00" y="106.00" width="24.00" height="8.00" rx="3" fill="#f0d79c" stroke="#654f36" data-ref="R1"/><rect x="103.00" y="106.00" width="1.70" height="8.00" fill="#ff8c00"/><rect x="107.00" y="106.00" width="1.70" height="8.00" fill="#ff8c00"/><rect x="111.00" y="106.00" width="1.70" height="8.00" fill="#8b4513"/><rect x="115.00" y="106.00" width="1.70" height="8.00" fill="#d4af37"/><text x="110.00" y="103.00" transform="rotate(-90 110.00 103.00)" font-size="5" font-weight="500" text-anchor="middle">R1 330</text></g><g data-ref="D1"><line x1="130.00" y1="100.00" x2="140.00" y2="100.00" stroke="#91a199" stroke-width="0.90"/><line x1="150.00" y1="100.00" x2="140.00" y2="100.00" stroke="#91a199" stroke-width="0.90"/><circle cx="140.00" cy="100.00" r="5.50" fill="#df5550" stroke="#733b39" data-ref="D1"/><line x1="142.50" y1="95.00" x2="142.50" y2="105.00" stroke="#733b39" stroke-width="1.20"/><text x="140.00" y="92.00" transform="rotate(-90 140.00 92.00)" font-size="5" font-weight="500" text-anchor="middle">D1</text></g></g>
9
+ <g id="offboard"><rect x="67.50" y="200.00" width="165.00" height="70.00" rx="2" fill="#343a3d" stroke="#687176" data-ref="UNO"/><text x="145.50" y="235.00" transform="rotate(-90 145.50 235.00)" font-size="6.5" font-weight="600" text-anchor="middle" fill="#e8efeb">Arduino Uno</text><circle cx="75.00" cy="200.00" r="1.70" fill="#91a199" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.D0" data-pin-type=""/><text x="75.00" y="205.50" transform="rotate(-90 75.00 205.50)" font-size="5.4" fill="#889095" text-anchor="end" data-pin-label="UNO.D0">D0</text><circle cx="85.00" cy="200.00" r="1.70" fill="#91a199" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.D1" data-pin-type=""/><text x="85.00" y="205.50" transform="rotate(-90 85.00 205.50)" font-size="5.4" fill="#889095" text-anchor="end" data-pin-label="UNO.D1">D1</text><circle cx="95.00" cy="200.00" r="1.70" fill="#91a199" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.D2" data-pin-type=""/><text x="95.00" y="205.50" transform="rotate(-90 95.00 205.50)" font-size="5.4" fill="#889095" text-anchor="end" data-pin-label="UNO.D2">D2</text><circle cx="105.00" cy="200.00" r="1.70" fill="#91a199" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.D3" data-pin-type=""/><text x="105.00" y="205.50" transform="rotate(-90 105.00 205.50)" font-size="5.4" fill="#889095" text-anchor="end" data-pin-label="UNO.D3">D3</text><circle cx="115.00" cy="200.00" r="1.70" fill="#91a199" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.D4" data-pin-type=""/><text x="115.00" y="205.50" transform="rotate(-90 115.00 205.50)" font-size="5.4" fill="#889095" text-anchor="end" data-pin-label="UNO.D4">D4</text><circle cx="125.00" cy="200.00" r="1.70" fill="#91a199" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.D5" data-pin-type=""/><text x="125.00" y="205.50" transform="rotate(-90 125.00 205.50)" font-size="5.4" fill="#889095" text-anchor="end" data-pin-label="UNO.D5">D5</text><circle cx="135.00" cy="200.00" r="1.70" fill="#91a199" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.D6" data-pin-type=""/><text x="135.00" y="205.50" transform="rotate(-90 135.00 205.50)" font-size="5.4" fill="#889095" text-anchor="end" data-pin-label="UNO.D6">D6</text><circle cx="145.00" cy="200.00" r="1.70" fill="#91a199" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.D7" data-pin-type=""/><text x="145.00" y="205.50" transform="rotate(-90 145.00 205.50)" font-size="5.4" fill="#889095" text-anchor="end" data-pin-label="UNO.D7">D7</text><circle cx="155.00" cy="200.00" r="1.70" fill="#91a199" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.D8" data-pin-type=""/><text x="155.00" y="205.50" transform="rotate(-90 155.00 205.50)" font-size="5.4" fill="#889095" text-anchor="end" data-pin-label="UNO.D8">D8</text><circle cx="165.00" cy="200.00" r="1.70" fill="#91a199" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.D9" data-pin-type=""/><text x="165.00" y="205.50" transform="rotate(-90 165.00 205.50)" font-size="5.4" fill="#889095" text-anchor="end" data-pin-label="UNO.D9">D9</text><circle cx="175.00" cy="200.00" r="1.70" fill="#91a199" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.D10" data-pin-type=""/><text x="175.00" y="205.50" transform="rotate(-90 175.00 205.50)" font-size="5.4" fill="#889095" text-anchor="end" data-pin-label="UNO.D10">D10</text><circle cx="185.00" cy="200.00" r="1.70" fill="#91a199" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.D11" data-pin-type=""/><text x="185.00" y="205.50" transform="rotate(-90 185.00 205.50)" font-size="5.4" fill="#889095" text-anchor="end" data-pin-label="UNO.D11">D11</text><circle cx="195.00" cy="200.00" r="1.70" fill="#91a199" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.D12" data-pin-type=""/><text x="195.00" y="205.50" transform="rotate(-90 195.00 205.50)" font-size="5.4" fill="#889095" text-anchor="end" data-pin-label="UNO.D12">D12</text><circle cx="205.00" cy="200.00" r="1.70" fill="#91a199" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.D13" data-pin-type=""/><text x="205.00" y="205.50" transform="rotate(-90 205.00 205.50)" font-size="5.4" fill="#e8efeb" text-anchor="end" data-pin-label="UNO.D13">D13</text><circle cx="215.00" cy="200.00" r="1.70" fill="#888780" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.GND" data-pin-type="ground"/><text x="215.00" y="205.50" transform="rotate(-90 215.00 205.50)" font-size="5.4" fill="#e8efeb" text-anchor="end" data-pin-label="UNO.GND">GND</text><circle cx="225.00" cy="200.00" r="1.70" fill="#E24B4A" stroke="#343a3d" stroke-width="0.6" data-pin="UNO.5V" data-pin-type="power"/><text x="225.00" y="205.50" transform="rotate(-90 225.00 205.50)" font-size="5.4" fill="#889095" text-anchor="end" data-pin-label="UNO.5V">5V</text></g>
10
+ <g id="wires"><path d="M 205.00 200.00 L 90.00 90.00" fill="none" stroke="#202a27" stroke-width="3.6" stroke-linecap="round" stroke-linejoin="round"/><path d="M 150.00 110.00 L 215.00 200.00" fill="none" stroke="#202a27" stroke-width="3.6" stroke-linecap="round" stroke-linejoin="round"/><path d="M 205.00 200.00 L 90.00 90.00" fill="none" stroke="yellow" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" data-ref="W1"/><path d="M 150.00 110.00 L 215.00 200.00" fill="none" stroke="black" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" data-ref="W2"/><circle cx="205.00" cy="200.00" r="2.80" fill="yellow" stroke="#202a27" stroke-width="1.2" data-wire="W1"/><circle cx="90.00" cy="90.00" r="2.80" fill="yellow" stroke="#202a27" stroke-width="1.2" data-wire="W1"/><circle cx="150.00" cy="110.00" r="2.80" fill="black" stroke="#202a27" stroke-width="1.2" data-wire="W2"/><circle cx="215.00" cy="200.00" r="2.80" fill="black" stroke="#202a27" stroke-width="1.2" data-wire="W2"/></g>
11
+ <g id="labels"><text x="-7.00" y="110.00" transform="rotate(-90 -7.00 110.00)" font-size="8" font-weight="500" fill="#c0cdc5" text-anchor="middle">a</text><text x="-7.00" y="100.00" transform="rotate(-90 -7.00 100.00)" font-size="8" font-weight="500" fill="#c0cdc5" text-anchor="middle">b</text><text x="-7.00" y="90.00" transform="rotate(-90 -7.00 90.00)" font-size="8" font-weight="500" fill="#c0cdc5" text-anchor="middle">c</text><text x="-7.00" y="80.00" transform="rotate(-90 -7.00 80.00)" font-size="8" font-weight="500" fill="#c0cdc5" text-anchor="middle">d</text><text x="-7.00" y="70.00" transform="rotate(-90 -7.00 70.00)" font-size="8" font-weight="500" fill="#c0cdc5" text-anchor="middle">e</text><text x="-7.00" y="40.00" transform="rotate(-90 -7.00 40.00)" font-size="8" font-weight="500" fill="#c0cdc5" text-anchor="middle">f</text><text x="-7.00" y="30.00" transform="rotate(-90 -7.00 30.00)" font-size="8" font-weight="500" fill="#c0cdc5" text-anchor="middle">g</text><text x="-7.00" y="20.00" transform="rotate(-90 -7.00 20.00)" font-size="8" font-weight="500" fill="#c0cdc5" text-anchor="middle">h</text><text x="-7.00" y="10.00" transform="rotate(-90 -7.00 10.00)" font-size="8" font-weight="500" fill="#c0cdc5" text-anchor="middle">i</text><text x="-7.00" y="0.00" transform="rotate(-90 -7.00 0.00)" font-size="8" font-weight="500" fill="#c0cdc5" text-anchor="middle">j</text><rect x="2.00" y="115.00" width="6.00" height="10.00" rx="2" fill="#202a27" stroke="#52625b" stroke-width="0.6"/><text x="8.00" y="120.00" transform="rotate(-90 8.00 120.00)" font-size="6" font-weight="500" fill="#e8efeb" text-anchor="middle">1</text><rect x="42.00" y="115.00" width="6.00" height="10.00" rx="2" fill="#202a27" stroke="#52625b" stroke-width="0.6"/><text x="48.00" y="120.00" transform="rotate(-90 48.00 120.00)" font-size="6" font-weight="500" fill="#e8efeb" text-anchor="middle">5</text><rect x="92.00" y="115.00" width="6.00" height="10.00" rx="2" fill="#202a27" stroke="#52625b" stroke-width="0.6"/><text x="98.00" y="120.00" transform="rotate(-90 98.00 120.00)" font-size="6" font-weight="500" fill="#e8efeb" text-anchor="middle">10</text><rect x="142.00" y="115.00" width="6.00" height="10.00" rx="2" fill="#202a27" stroke="#52625b" stroke-width="0.6"/><text x="148.00" y="120.00" transform="rotate(-90 148.00 120.00)" font-size="6" font-weight="500" fill="#e8efeb" text-anchor="middle">15</text><rect x="192.00" y="115.00" width="6.00" height="10.00" rx="2" fill="#202a27" stroke="#52625b" stroke-width="0.6"/><text x="198.00" y="120.00" transform="rotate(-90 198.00 120.00)" font-size="6" font-weight="500" fill="#e8efeb" text-anchor="middle">20</text><rect x="242.00" y="115.00" width="6.00" height="10.00" rx="2" fill="#202a27" stroke="#52625b" stroke-width="0.6"/><text x="248.00" y="120.00" transform="rotate(-90 248.00 120.00)" font-size="6" font-weight="500" fill="#e8efeb" text-anchor="middle">25</text><rect x="292.00" y="115.00" width="6.00" height="10.00" rx="2" fill="#202a27" stroke="#52625b" stroke-width="0.6"/><text x="298.00" y="120.00" transform="rotate(-90 298.00 120.00)" font-size="6" font-weight="500" fill="#e8efeb" text-anchor="middle">30</text></g>
12
+ <g id="nets"></g><g id="annotations"></g>
13
+ </g>
14
+ <g id="legend"></g></svg>
data/site/favicon.svg ADDED
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">
2
+ <rect width="48" height="48" rx="12" fill="#1b2423" />
3
+ <path d="M10 15h28M10 33h28M15 10v28M33 10v28" fill="none" stroke="#3d4b47" stroke-width="2" />
4
+ <path d="M15 15h18v18H15z" fill="none" stroke="#d99755" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" />
5
+ <circle cx="15" cy="15" r="2.5" fill="#e8eeeb" />
6
+ <circle cx="33" cy="33" r="2.5" fill="#e8eeeb" />
7
+ </svg>
@@ -0,0 +1,113 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta name="theme-color" content="#101719">
7
+ <meta name="description" content="Breadkit component examples and custom module definitions with typed pins.">
8
+ <title>Components and modules | Breadkit</title>
9
+ <link rel="canonical" href="https://breadkit.github.io/breadkit/guide/components/">
10
+ <link rel="icon" href="../../favicon.svg" type="image/svg+xml">
11
+ <link rel="stylesheet" href="../../assets/site.css">
12
+ </head>
13
+ <body class="min-h-dvh bg-ink font-sans text-paper antialiased">
14
+ <a class="sr-only rounded-sm bg-copper px-4 py-3 font-semibold text-ink focus:not-sr-only focus:fixed focus:left-4 focus:top-4 focus:outline-2 focus:outline-offset-4 focus:outline-paper" href="#main">Skip to content</a>
15
+ <header class="border-b border-line">
16
+ <div class="mx-auto flex max-w-7xl flex-wrap items-center justify-between gap-4 px-5 py-5 sm:px-8 lg:px-10">
17
+ <a class="flex items-center gap-3 rounded-sm text-xl font-semibold focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="../../" aria-label="Breadkit home"><img class="size-8" src="../../favicon.svg" alt="" width="32" height="32"><span>breadkit</span></a>
18
+ <nav aria-label="Main navigation" class="flex flex-wrap items-center gap-x-5 gap-y-2 text-sm text-muted">
19
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="../">Guide</a>
20
+ <a class="rounded-sm text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="./" aria-current="page">Components</a>
21
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="../dsl/">Reference</a>
22
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="https://breadkit.github.io/breadkit-render/">Render</a>
23
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="https://breadkit.github.io/breadkit-lint/">Lint</a>
24
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="https://github.com/breadkit/breadkit">GitHub</a>
25
+ </nav>
26
+ </div>
27
+ </header>
28
+
29
+ <div class="mx-auto grid max-w-7xl gap-10 px-5 py-10 sm:px-8 lg:grid-cols-12 lg:px-10">
30
+ <aside class="border-b border-line pb-6 lg:col-span-2 lg:self-start lg:sticky lg:top-8 lg:border-b-0 lg:pb-0" aria-label="Guide chapters">
31
+ <p class="mb-4 text-sm font-semibold">User guide</p>
32
+ <nav aria-label="Guide navigation" class="flex flex-wrap gap-x-5 gap-y-3 text-sm text-muted lg:flex-col lg:gap-3">
33
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="../">Getting started</a>
34
+ <a class="rounded-sm text-copper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="./" aria-current="page">Components and modules</a>
35
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="../dsl/">DSL reference</a>
36
+ <span class="hidden border-t border-line pt-4 text-xs text-muted lg:block">Related tools</span>
37
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="https://breadkit.github.io/breadkit-render/">Render a diagram</a>
38
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="https://breadkit.github.io/breadkit-lint/">Check a circuit</a>
39
+ </nav>
40
+ </aside>
41
+
42
+ <main id="main" class="min-w-0 lg:col-span-10 xl:col-span-8">
43
+ <p class="text-sm font-medium text-copper">Breadkit / Components</p>
44
+ <h1 class="mt-3 text-balance text-4xl font-semibold leading-tight sm:text-5xl">Components and modules</h1>
45
+ <p class="mt-6 max-w-3xl text-pretty text-lg leading-8 text-muted">Place a component by naming the holes for its leads or its anchor hole. Use <code class="font-mono text-paper">offboard</code> for modules beside the breadboard, then wire their named pins.</p>
46
+
47
+ <section id="parts" class="scroll-mt-8 border-t border-line pt-10 mt-12">
48
+ <h2 class="text-balance text-2xl font-semibold">Common components</h2>
49
+ <p class="mt-4 text-pretty leading-7 text-muted">These built-in definitions support rendering and connection analysis. Hole positions are examples; choose positions that fit your circuit.</p>
50
+ <div class="mt-6 overflow-x-auto rounded-lg border border-line">
51
+ <table class="w-full min-w-2xl border-collapse text-left text-sm">
52
+ <thead class="bg-board"><tr><th class="px-4 py-3 font-semibold">Component</th><th class="px-4 py-3 font-semibold">DSL</th><th class="px-4 py-3 font-semibold">Placement</th></tr></thead>
53
+ <tbody class="text-muted">
54
+ <tr class="border-t border-line"><th class="px-4 py-4 font-semibold text-paper">Resistor</th><td class="px-4 py-4 font-mono text-paper">resistor :R1, "330", pins: %w[a12 a16]</td><td class="px-4 py-4">Two leads</td></tr>
55
+ <tr class="border-t border-line"><th class="px-4 py-4 font-semibold text-paper">LED</th><td class="px-4 py-4 font-mono text-paper">led :D1, color: :red, anode: "b16", cathode: "b17"</td><td class="px-4 py-4">Two polarized leads</td></tr>
56
+ <tr class="border-t border-line"><th class="px-4 py-4 font-semibold text-paper">Push button</th><td class="px-4 py-4 font-mono text-paper">button :SW1, at: "e10"</td><td class="px-4 py-4">Across the center gap</td></tr>
57
+ <tr class="border-t border-line"><th class="px-4 py-4 font-semibold text-paper">Capacitor</th><td class="px-4 py-4 font-mono text-paper">capacitor :C1, "10n", pins: %w[h23 h24]</td><td class="px-4 py-4">Two nonpolarized leads</td></tr>
58
+ <tr class="border-t border-line"><th class="px-4 py-4 font-semibold text-paper">Electrolytic capacitor</th><td class="px-4 py-4 font-mono text-paper">electrolytic :C2, "100u", plus: "g22", minus: "j24"</td><td class="px-4 py-4">Positive and negative leads</td></tr>
59
+ <tr class="border-t border-line"><th class="px-4 py-4 font-semibold text-paper">NE555</th><td class="px-4 py-4 font-mono text-paper">ic :U1, "NE555", at: "e20"</td><td class="px-4 py-4">Anchor at pin 1</td></tr>
60
+ </tbody>
61
+ </table>
62
+ </div>
63
+ <p class="mt-5 text-pretty leading-7 text-muted">Built-in definitions also include diodes, transistors, and potentiometers. BC547 and BC557 use CBE pin order; 2N3904 and 2N3906 use EBC. An unknown transistor model emits a warning and uses the generic EBC order. Run <code class="font-mono text-paper">breadkit parts</code> to list definitions. Values may use units such as <code class="font-mono text-paper">4.7k</code> or <code class="font-mono text-paper">10uF</code>.</p>
64
+ </section>
65
+
66
+ <section id="modules" class="scroll-mt-8 border-t border-line pt-10 mt-12">
67
+ <h2 class="text-balance text-2xl font-semibold">Define module pins</h2>
68
+ <p class="mt-4 text-pretty leading-7 text-muted">Define offboard modules such as OLEDs and sensors in YAML. This excerpt from the SHT31 definition names each pin and its <code class="font-mono text-paper">type:</code>, which controls the pin marker color.</p>
69
+ <div class="mt-6 grid min-w-0 gap-5 xl:grid-cols-2">
70
+ <div class="min-w-0 rounded-lg border border-line bg-board"><div class="border-b border-line px-4 py-3 text-sm text-muted">parts/sht31.yml</div><pre class="overflow-x-auto p-4 font-mono text-xs leading-6 sm:text-sm"><code>id: sht31
71
+ category: module
72
+ placement: offboard
73
+ pins:
74
+ - {num: 1, name: VIN, type: power}
75
+ - {num: 2, name: GND, type: ground}
76
+ - {num: 3, name: SCL, type: clock}
77
+ - {num: 4, name: SDA, type: data}
78
+ - {num: 5, name: ADR, type: address}
79
+ - {num: 6, name: ALR, type: interrupt}
80
+ render: {shape: offboard, label: SHT31}</code></pre></div>
81
+ <div class="min-w-0 rounded-lg border border-line bg-board"><div class="border-b border-line px-4 py-3 text-sm text-muted">Use it in a circuit file</div><pre class="overflow-x-auto p-4 font-mono text-xs leading-6 sm:text-sm"><code>board :full
82
+ use_parts "parts/*.yml"
83
+ offboard :SHT31, :sht31, side: :right,
84
+ at: "a12", address: "0x44"
85
+
86
+ wire "SHT31.SCL", "h22", color: :yellow
87
+ wire "SHT31.SDA", "h24", color: :blue</code></pre><p class="px-4 pb-5 text-pretty text-sm leading-6 text-muted">The module appears beside the board. Wire SCL and SDA by name, and connect the real power pins too.</p></div>
88
+ </div>
89
+ <p class="mt-5 text-pretty leading-7 text-muted">For a board-mounted module such as an RP2040, define <code class="font-mono text-paper">placement: footprint</code> and its pin positions, then place it with <code class="font-mono text-paper">part :PICO, :rp2040_clone, at: "c1"</code>. <a class="rounded-sm text-paper underline decoration-line underline-offset-4 hover:decoration-copper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="https://github.com/breadkit/breadkit/tree/main/examples/parts">Browse the part definitions</a>.</p>
90
+ </section>
91
+
92
+ <section id="sensor-demo" class="scroll-mt-8 border-t border-line pt-10 mt-12 pb-16">
93
+ <h2 class="text-balance text-2xl font-semibold">A circuit with several modules</h2>
94
+ <p class="mt-4 text-pretty leading-7 text-muted">The sensor demo places an RP2040-compatible board on the breadboard and an OLED plus two SHT31 modules beside it. Power, I2C, switches, and IR wiring can be shown layer by layer.</p>
95
+ <figure class="mt-6 overflow-hidden rounded-lg border border-line bg-board">
96
+ <div class="flex justify-center p-5 sm:p-8"><img class="h-auto w-full max-w-lg" src="https://breadkit.github.io/breadkit-render/images/sensor-demo.png" alt="Diagram with an RP2040, OLED, two SHT31 modules, switches, and IR sensor modules" width="848" height="1311" loading="lazy"></div>
97
+ <figcaption class="flex flex-wrap gap-x-5 gap-y-2 border-t border-line px-5 py-4 text-sm text-muted"><a class="rounded-sm text-paper underline decoration-line underline-offset-4 hover:decoration-copper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="https://breadkit.github.io/breadkit-render/images/sensor-demo.svg">Open layered SVG</a><a class="rounded-sm text-paper underline decoration-line underline-offset-4 hover:decoration-copper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="https://github.com/breadkit/breadkit/blob/main/examples/05_sensor_demo.bk.rb">View circuit source</a></figcaption>
98
+ </figure>
99
+ </section>
100
+ </main>
101
+
102
+ <nav class="hidden xl:col-span-2 xl:block xl:self-start xl:sticky xl:top-8" aria-label="On this page">
103
+ <p class="mb-4 text-sm font-semibold">On this page</p>
104
+ <ul class="space-y-3 border-l border-line pl-4 text-sm text-muted">
105
+ <li><a class="hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="#parts">Common components</a></li>
106
+ <li><a class="hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="#modules">Module definitions</a></li>
107
+ <li><a class="hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="#sensor-demo">Multi-module example</a></li>
108
+ </ul>
109
+ </nav>
110
+ </div>
111
+ <footer class="border-t border-line"><div class="mx-auto flex max-w-7xl flex-wrap items-center justify-between gap-3 px-5 py-7 text-sm text-muted sm:px-8 lg:px-10"><p>See component connections in both the diagram and the circuit data.</p><a class="rounded-sm text-paper underline decoration-line underline-offset-4 hover:decoration-copper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="../">Back to the guide</a></div></footer>
112
+ </body>
113
+ </html>
@@ -0,0 +1,132 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta name="theme-color" content="#101719">
7
+ <meta name="description" content="Breadkit DSL reference: declarations, component placement, hole and pin references, layers, switch states, and CLI commands.">
8
+ <title>DSL reference | Breadkit</title>
9
+ <link rel="canonical" href="https://breadkit.github.io/breadkit/guide/dsl/">
10
+ <link rel="icon" href="../../favicon.svg" type="image/svg+xml">
11
+ <link rel="stylesheet" href="../../assets/site.css">
12
+ </head>
13
+ <body class="min-h-dvh bg-ink font-sans text-paper antialiased">
14
+ <a class="sr-only rounded-sm bg-copper px-4 py-3 font-semibold text-ink focus:not-sr-only focus:fixed focus:left-4 focus:top-4 focus:outline-2 focus:outline-offset-4 focus:outline-paper" href="#main">Skip to content</a>
15
+ <header class="border-b border-line">
16
+ <div class="mx-auto flex max-w-7xl flex-wrap items-center justify-between gap-4 px-5 py-5 sm:px-8 lg:px-10">
17
+ <a class="flex items-center gap-3 rounded-sm text-xl font-semibold focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="../../" aria-label="Breadkit home"><img class="size-8" src="../../favicon.svg" alt="" width="32" height="32"><span>breadkit</span></a>
18
+ <nav aria-label="Main navigation" class="flex flex-wrap items-center gap-x-5 gap-y-2 text-sm text-muted">
19
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="../">Guide</a>
20
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="../components/">Components</a>
21
+ <a class="rounded-sm text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="./" aria-current="page">Reference</a>
22
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="https://breadkit.github.io/breadkit-render/">Render</a>
23
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="https://breadkit.github.io/breadkit-lint/">Lint</a>
24
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="https://github.com/breadkit/breadkit">GitHub</a>
25
+ </nav>
26
+ </div>
27
+ </header>
28
+
29
+ <div class="mx-auto grid max-w-7xl gap-10 px-5 py-10 sm:px-8 lg:grid-cols-12 lg:px-10">
30
+ <aside class="border-b border-line pb-6 lg:col-span-2 lg:self-start lg:sticky lg:top-8 lg:border-b-0 lg:pb-0" aria-label="Guide chapters">
31
+ <p class="mb-4 text-sm font-semibold">User guide</p>
32
+ <nav aria-label="Guide navigation" class="flex flex-wrap gap-x-5 gap-y-3 text-sm text-muted lg:flex-col lg:gap-3">
33
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="../">Getting started</a>
34
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="../components/">Components and modules</a>
35
+ <a class="rounded-sm text-copper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="./" aria-current="page">DSL reference</a>
36
+ <span class="hidden border-t border-line pt-4 text-xs text-muted lg:block">Related tools</span>
37
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="https://breadkit.github.io/breadkit-render/">Render a diagram</a>
38
+ <a class="rounded-sm hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="https://breadkit.github.io/breadkit-lint/">Check a circuit</a>
39
+ </nav>
40
+ </aside>
41
+
42
+ <main id="main" class="min-w-0 lg:col-span-10 xl:col-span-8">
43
+ <p class="text-sm font-medium text-copper">Breadkit / Reference</p>
44
+ <h1 class="mt-3 text-balance text-4xl font-semibold leading-tight sm:text-5xl">DSL reference</h1>
45
+ <p class="mt-6 max-w-3xl text-pretty text-lg leading-8 text-muted">A <code class="font-mono text-paper">.bk.rb</code> file describes the board, parts, wires, and expected connections. Breadkit resolves it into nets and JSON IR. The file runs as Ruby, so only load files you trust.</p>
46
+
47
+ <section id="example" class="scroll-mt-8 mt-12 border-t border-line pt-10">
48
+ <h2 class="text-balance text-2xl font-semibold">A small circuit</h2>
49
+ <p class="mt-4 text-pretty leading-7 text-muted">This is the button and LED example used in the <a class="text-paper underline decoration-copper underline-offset-4 focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="../#led-example">guide</a>.</p>
50
+ <pre class="mt-5 overflow-x-auto rounded-lg border border-line bg-board p-5 font-mono text-sm leading-6"><code>title "Button-controlled LED"
51
+ board :half
52
+ supply :USB, voltage: 5.0, plus: "B+1", minus: "B-1"
53
+ net :VCC, at: "B+1"
54
+ net :GND, at: "B-1"
55
+
56
+ button :SW1, at: "e10"
57
+ resistor :R1, "330", pins: %w[a12 a16]
58
+ led :D1, color: :red, anode: "b16", cathode: "b17"
59
+ wire "a10", "B+", color: :red
60
+ wire "a17", "B-", color: :black
61
+
62
+ expect do
63
+ connected "SW1.1", :VCC
64
+ isolated :VCC, :GND
65
+ end</code></pre>
66
+ </section>
67
+
68
+ <section id="declarations" class="scroll-mt-8 mt-12 border-t border-line pt-10">
69
+ <h2 class="text-balance text-2xl font-semibold">Declarations</h2>
70
+ <div class="mt-6 overflow-x-auto rounded-lg border border-line">
71
+ <table class="w-full min-w-2xl border-collapse text-left text-sm">
72
+ <thead class="bg-board"><tr><th class="px-4 py-3 font-semibold">Method</th><th class="px-4 py-3 font-semibold">Purpose</th></tr></thead>
73
+ <tbody class="text-muted">
74
+ <tr class="border-t border-line"><th class="px-4 py-4 font-mono font-normal text-paper">title(text)</th><td class="px-4 py-4">Set the diagram title.</td></tr>
75
+ <tr class="border-t border-line"><th class="px-4 py-4 font-mono font-normal text-paper">board(id, split_rails: false)</th><td class="px-4 py-4">Select <code>:full</code>, <code>:half</code>, <code>:mini</code>, or a custom board ID.</td></tr>
76
+ <tr class="border-t border-line"><th class="px-4 py-4 font-mono font-normal text-paper">use_parts(path) / use_boards(path)</th><td class="px-4 py-4">Load YAML definitions relative to the DSL file. Globs are supported.</td></tr>
77
+ <tr class="border-t border-line"><th class="px-4 py-4 font-mono font-normal text-paper">supply(name, voltage:, plus:, minus:)</th><td class="px-4 py-4">Add a DC source. Both terminals occupy board holes.</td></tr>
78
+ <tr class="border-t border-line"><th class="px-4 py-4 font-mono font-normal text-paper">net(name, at:)</th><td class="px-4 py-4">Label a hole or component pin.</td></tr>
79
+ <tr class="border-t border-line"><th class="px-4 py-4 font-mono font-normal text-paper">part(ref, type, value = nil, pins: ..., at: ..., **attrs)</th><td class="px-4 py-4">Place a defined part. <code>pins:</code> accepts an ordered array or a pin-name hash.</td></tr>
80
+ <tr class="border-t border-line"><th class="px-4 py-4 font-mono font-normal text-paper">wire(from, to, color: nil, route: :straight, layer: nil)</th><td class="px-4 py-4">Connect holes or pins. Use <code>route: :arc</code> for a curve or <code>route: :edge</code> around the board edge. Options also include <code>id:</code>, <code>electrical:</code>, and <code>dashed:</code>.</td></tr>
81
+ <tr class="border-t border-line"><th class="px-4 py-4 font-mono font-normal text-paper">offboard(name, type, side: :left, at: nil, unused: [])</th><td class="px-4 py-4">Place a module beside the board. <code>at:</code> aligns its first pin; extra attributes such as <code>address:</code> appear on the module.</td></tr>
82
+ <tr class="border-t border-line"><th class="px-4 py-4 font-mono font-normal text-paper">expect(strict: false) { ... }</th><td class="px-4 py-4">Declare <code>connected</code>, <code>isolated</code>, or named <code>net</code> expectations. Strict mode also rejects unlisted pins on declared nets.</td></tr>
83
+ <tr class="border-t border-line"><th class="px-4 py-4 font-mono font-normal text-paper">lint_disable(rule, on: nil, reason: nil)</th><td class="px-4 py-4">Suppress a lint rule, optionally for one target.</td></tr>
84
+ </tbody>
85
+ </table>
86
+ </div>
87
+ <p class="mt-5 text-pretty leading-7 text-muted">Short forms are available for <code class="font-mono text-paper">resistor</code>, <code class="font-mono text-paper">capacitor</code>, <code class="font-mono text-paper">electrolytic</code>, <code class="font-mono text-paper">diode</code>, <code class="font-mono text-paper">led</code>, <code class="font-mono text-paper">transistor</code>, <code class="font-mono text-paper">pot</code>, <code class="font-mono text-paper">button</code>, and <code class="font-mono text-paper">ic</code>. See the <a class="text-paper underline decoration-copper underline-offset-4 focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="../components/">component examples</a>.</p>
88
+ </section>
89
+
90
+ <section id="references" class="scroll-mt-8 mt-12 border-t border-line pt-10">
91
+ <h2 class="text-balance text-2xl font-semibold">Hole and pin references</h2>
92
+ <ul class="mt-5 list-disc space-y-3 pl-6 text-pretty leading-7 text-muted">
93
+ <li>Terminal holes use rows <code class="font-mono text-paper">a</code> through <code class="font-mono text-paper">j</code> and 1-based numbers, such as <code class="font-mono text-paper">a10</code> or <code class="font-mono text-paper">J30</code>.</li>
94
+ <li>Rail holes use <code class="font-mono text-paper">T+</code>, <code class="font-mono text-paper">T-</code>, <code class="font-mono text-paper">B+</code>, and <code class="font-mono text-paper">B-</code>, with an optional 1-based index. A rail without an index selects a free hole.</li>
95
+ <li>Custom board YAML may define other row and rail IDs. Rows <code class="font-mono text-paper">u</code> and <code class="font-mono text-paper">v</code> use <code class="font-mono text-paper">u1</code> and <code class="font-mono text-paper">v1</code>; a rail with <code class="font-mono text-paper">id: PWR</code> uses <code class="font-mono text-paper">PWR1</code> or <code class="font-mono text-paper">PWR</code>. Set rail <code class="font-mono text-paper">polarity:</code> to <code class="font-mono text-paper">+</code> or <code class="font-mono text-paper">-</code> for polarity-aware rendering.</li>
96
+ <li>Component pins use names such as <code class="font-mono text-paper">R1.1</code>, <code class="font-mono text-paper">D1.anode</code>, or <code class="font-mono text-paper">U1.VCC</code>. A wire endpoint referencing a placed pin selects a free hole on its conductive strip.</li>
97
+ <li><code class="font-mono text-paper">ne555</code> and generic <code class="font-mono text-paper">dip</code> parts must straddle the center gap. For a generic DIP, set <code class="font-mono text-paper">pin_count</code>, such as <code class="font-mono text-paper">part :U2, :dip, pin_count: 14, at: "e20"</code>.</li>
98
+ <li>A generic header can be sized with <code class="font-mono text-paper">part :J1, :pin_header, pin_count: 4, pins: %w[a1 a2 a3 a4]</code>.</li>
99
+ </ul>
100
+ <p class="mt-5 text-pretty leading-7 text-muted">Values accept SI suffixes and RKM notation, including <code class="font-mono text-paper">4.7k</code>, <code class="font-mono text-paper">4k7</code>, <code class="font-mono text-paper">1M</code>, <code class="font-mono text-paper">100n</code>, and <code class="font-mono text-paper">10uF</code>.</p>
101
+ </section>
102
+
103
+ <section id="layers" class="scroll-mt-8 mt-12 border-t border-line pt-10">
104
+ <h2 class="text-balance text-2xl font-semibold">Layers and module pins</h2>
105
+ <p class="mt-4 text-pretty leading-7 text-muted">Give wires and components the same <code class="font-mono text-paper">layer:</code> to show them together in an interactive SVG. A layer can be one name or a list of names. Components without a layer remain visible in every view. Use <code class="font-mono text-paper">electrical: false, dashed: true</code> for an alternate visual connection that does not affect connectivity.</p>
106
+ <p class="mt-4 text-pretty leading-7 text-muted">Custom YAML definitions can mark module pins with <code class="font-mono text-paper">type:</code> values such as <code class="font-mono text-paper">power</code>, <code class="font-mono text-paper">ground</code>, <code class="font-mono text-paper">clock</code>, <code class="font-mono text-paper">data</code>, <code class="font-mono text-paper">address</code>, or <code class="font-mono text-paper">interrupt</code>. The renderer colors those markers and dims unwired pins.</p>
107
+ </section>
108
+
109
+ <section id="cli" class="scroll-mt-8 mt-12 border-t border-line pt-10 pb-16">
110
+ <h2 class="text-balance text-2xl font-semibold">Switch states, IR, and CLI</h2>
111
+ <p class="mt-4 text-pretty leading-7 text-muted"><code class="font-mono text-paper">circuit.states("none")</code>, <code class="font-mono text-paper">circuit.states("single")</code>, and <code class="font-mono text-paper">circuit.states("all")</code> control switch contact simulation. <code class="font-mono text-paper">Breadkit.load(path)</code> reads DSL or JSON IR. <code class="font-mono text-paper">circuit.to_ir</code> returns the resolved circuit data, including selected hole positions.</p>
112
+ <pre class="mt-5 overflow-x-auto rounded-lg border border-line bg-board p-5 font-mono text-sm leading-7"><code>breadkit nets circuit.bk.rb
113
+ breadkit parts
114
+ breadkit ir circuit.bk.rb</code></pre>
115
+ <p class="mt-4 text-pretty leading-7 text-muted">Use <code class="font-mono text-paper">breadkit nets</code> to inspect connections, <code class="font-mono text-paper">breadkit parts</code> to list built-in definitions, and <code class="font-mono text-paper">breadkit ir</code> to print JSON IR.</p>
116
+ </section>
117
+ </main>
118
+
119
+ <nav class="hidden xl:col-span-2 xl:block xl:self-start xl:sticky xl:top-8" aria-label="On this page">
120
+ <p class="mb-4 text-sm font-semibold">On this page</p>
121
+ <ul class="space-y-3 border-l border-line pl-4 text-sm text-muted">
122
+ <li><a class="hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="#example">Example</a></li>
123
+ <li><a class="hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="#declarations">Declarations</a></li>
124
+ <li><a class="hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="#references">References</a></li>
125
+ <li><a class="hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="#layers">Layers and pins</a></li>
126
+ <li><a class="hover:text-paper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="#cli">CLI and IR</a></li>
127
+ </ul>
128
+ </nav>
129
+ </div>
130
+ <footer class="border-t border-line"><div class="mx-auto flex max-w-7xl flex-wrap items-center justify-between gap-3 px-5 py-7 text-sm text-muted sm:px-8 lg:px-10"><p>Use the guide for a step-by-step example.</p><a class="rounded-sm text-paper underline decoration-line underline-offset-4 hover:decoration-copper focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-copper" href="../">Back to the guide</a></div></footer>
131
+ </body>
132
+ </html>