diff --git a/.gitignore b/.gitignore index edf6ee9..3f59809 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,5 @@ fp-info-cache # gerber zip files **/gerber/*.zip + +node_modules diff --git a/.markdownlint.yaml b/.markdownlint.yaml new file mode 100644 index 0000000..49e2515 --- /dev/null +++ b/.markdownlint.yaml @@ -0,0 +1,5 @@ +default: true + +# MD013/line-length - Line length +MD013: + tables: false diff --git a/.prettierrc.yaml b/.prettierrc.yaml new file mode 100644 index 0000000..4a19fb5 --- /dev/null +++ b/.prettierrc.yaml @@ -0,0 +1 @@ +proseWrap: "always" diff --git a/BUILDGUIDE.md b/BUILDGUIDE.md new file mode 100644 index 0000000..d905c57 --- /dev/null +++ b/BUILDGUIDE.md @@ -0,0 +1,222 @@ +# Build Guide + +## Parts + +The following parts list has links to various shops. Please don't see this as an +endorsement for the shops, its just where I ended up ordering the things I used +to help you find the correct parts. I found it quite difficult to find screws +and spacers that will fit the tight build, for example. + +| Name | Amount | Remarks | Part | +| :------------------------- | :----- | :---------------------------------------------------------------------------- | :----------------------------------- | +| PCB | 2 | | | +| Top plate | 2 | | | +| Bottom plate | 2 | | | +| nice!nano | 2 | | [nice!nano on nicekeyboards.com] | +| 301230 LiPo battery | 2 | | | +| Mill-Max Series 315 header | 4 | | [headers on keycapsss.com] | +| Mill-Max Series 315 pin | 48 | | [pins on keycapsss.com] | +| Tactile switch | 2 | | [SS12D00] | +| Power switch | 2 | | [TS-1136-4.3] | +| Diode | 66 | | SOD-123FL | +| Kailh Choc Hotswap Socket | 66 | | [Choc Type Hot Swap Socket] | +| Key switch | 66 | | PG1350, NOT Choc V2! | +| Keycaps | 66 | The Taira is NOT compatible with keycaps intended for 19x19mm switch spacing! | [MBK Choc Low Profile Blank Keycaps] | +| Spacer M2 4mm | 16 | | [brass round standoff, m2x4] | +| Screw M2 3mm | 32 | | [m2x3 screw] | +| Cushion rubber feet | 28 | I had to stack two 1mm cushion rubbers to be higher than the screws, so 7x2x2 | [adhesive rubber feet 1mm] | +| USB-C cable | 1-2 | At least one for charging the battery, two during assembly | | + +[nice!nano on nicekeyboards.com]: https://nicekeyboards.com/nice-nano/ +[headers on keycapsss.com]: + https://keycapsss.com/keyboard-parts/parts/100/single-row-socket-headers-or-pins-mill-max-series-315?number=KC10067_header +[pins on keycapsss.com]: + https://keycapsss.com/keyboard-parts/parts/100/single-row-socket-headers-or-pins-mill-max-series-315?number=KC10067_pins +[ss12d00]: https://aliexpress.com/item/4000770828576.html +[ts-1136-4.3]: https://aliexpress.com/item/1068908059.html +[choc type hot swap socket]: + https://www.kailhswitch.com/mechanical-keyboard-switches/box-switches/choc-type-hot-swap-socket.html +[mbk choc low profile blank keycaps]: + https://keycapsss.com/keyboard-parts/keycaps/169/mbk-choc-low-profile-blank-keycaps?number=KC10130_1U-WH +[brass round standoff, m2x4]: https://aliexpress.com/item/32968906213.html +[m2x3 screw]: https://www.amazon.de/gp/product/B00W96Z5RQ +[adhesive rubber feet 1mm]: https://www.amazon.de/gp/product/B06WRQ471S + +## Printing the PCBs and plates + +Download the gerber files from the [latest release](https://github.com/strayer/taira-keyboard/releases/latest). + +These were exported from KiCad to be printed by JLC PCB. Check your PCB fab for +their requirements and maybe export new gerber files with KiCad yourself. + +## Firmware preparation + +Download the latest firmware from [strayer/taira-keyboard-zmk-config], you will +need it later to test the nice!nanos during the build process. + +[strayer/taira-keyboard-zmk-config]: + https://github.com/strayer/taira-keyboard-zmk-config + +## Building + +Decide which of the PCBs should be the left and right side. You will have to +solder some things to the back side and front side, so find a way to keep track +on which side you are currently working. + +### Diodes + +First, solder the diodes to the PCB. + +The diodes **MUST** be attached to the bottom side of the PCB! Not all diodes +are directed in the same way, so keep an eye on the arrow markings on the PCB +silkscreen to orient the diodes in the right direction. + +The orientation of the diode is as follows: Attach the chip component so that +the "|||" mark on the diode is facing the "|" of the diode mark "|◁" on the PCB. + +![Diode orientation](docs/diode-orientation.jpg) + +Prepare the PCB by putting solder on the right pad of all diode spots. Next, +solder the diodes by melting the solder on the PCB while holding them on the +pad. + +![A diode soldered on the right side](docs/diode-soldering.jpg) + +Continue with soldering the other side of the diodes to the PCB. + +![A diode soldered on both sides](docs/diode-soldering-2.jpg) + +### Power and reset switch + +Solder the power switch and reset switch to the **FRONT** of the PCB. The +orientation of both components doesn't matter. + +![The power and reset switches](docs/power-and-reset-switch.jpg) + +![Power and reset switch inserted into the respective sockets](docs/power-and-reset-switch-inserted.jpg) + +Clip the legs to avoid conflicts with the bottom plate. + +![Soldered and clipped power and reset switch](docs/power-and-reset-switch-soldered.jpg) + +### nice!nano + +Solder the sockets for the nice!nano to the **FRONT** of the PCB. The correct +holes for the left and right PCB are marked with a white frame. + +![nice!nano sockets inserted](docs/nice-nano-sockets-inserted.jpg) + +**IMPORTANT**: Check that you didn't short the pins of the nice!nano by +accident! Due to the flippable PCB design it is easy to make a solder bridge +between the front and bottom socket hole and create shorts. + +Solder the MillMax pin legs to the nice!nano. **IMPORTANT**: The side of the +nice!nano with the silkscreen markings, components and LEDs must be on top! +There are various guides on how to do this, one is linked in the documentation +of the nice!nano itself: +[nicekeyboards.com: Socketing the nice!nano](https://nicekeyboards.com/docs/nice-nano/getting-started#socketing-the-nicenano) + +I did this by putting kapton tape over the two socket rows, inserting the +millmax pins or diode legs in each hole, putting the nice!nano on top of it and +soldering the pins in place. + +Note: I recommend using MillMax pins instead of leftover diode legs as described +in some guides. I tried both and the MillMax pins are _much_ more sturdy. It is +**VERY** easy to bend the pins and rip a nice!nano with diode legs out of the +sockets just by picking up the board while it is charging via USB-C. + +![nice!nano soldered to pins](docs/nice-nano-soldered-to-pins.jpg) + +### Operation check + +Put the nice!nano in the sockets and attach it to your computer with a USB-C +cable. Flash the left and right firmware as described in the ZMK documentation +to the respective nice!nanos. Afterwards only the left side needs to be +connected to the computer, the right side will connect to the left side via +Bluetooth as long as it has power through USB-C. If everything is working +correctly you should be able to simulate key presses by shorting the hotswap +sockets solder pads. Also try pressing the reset buttons to check if the +nice!nanos reset as expected (the blue LED should flash). + +### Kailh Hotswap Sockets + +Solder the Kailh Hotswap Sockets the same way you did the diodes, also on the +**BACK** of the PCB. The correct spots are again marked with white silkscreen. +Put solder on the right pad of all hotswap socket spots, put the socket into +position and hold it down with tweezers while melting the solder through the +metal part of the socket. Afterwards heat up the left metal part of the socket +and solder it on the pad. + +![Kailh hotswap socket aligned to PCB](docs/kailh-hotswap-socket-aligned.jpg) + +![Kailh hotswap socket soldered on one side](docs/kailh-hotswap-socket-soldered.jpg) + +The fourth socket in the bottom row can be put in two different positions. You +can either have four switches next to each other to have HJKL-like arrow keys or +have the switch a bit further to the center to make it easier to reach it with +your thumb. You can also solder hotswap sockets to both positions if you want to +be able to switch positions later. The default keymap is intended to be used +with the thumb on the left side (mapped to Alt) and as arrow keys on the right +side (mapped to ←↓↑→). + +![Switch in position 1](docs/positional-switch-1.jpeg) +![Switch in position 2](docs/positional-switch-2.jpeg) + +### Batteries + +First remove the nice!nano from the socket and make sure the power switch is set +to OFF. Place the battery between the sockets for the nice!nano. Guide the wires +through the hole in the PCB to the back side and solder them into the B+ and B- +holes there. Measure the voltage if you are unsure which wire is positive and +negative. Be extra careful to NOT short the battery terminals/wires! I opted to +secure the wires and soldering spots with kapton tape. I also put kapton tape on +the back of the nice!nano to avoid it touching the battery directly, although +this is probably unnecessary. + +![Battery aligned between the nice!nano sockets](docs/battery-1.jpg) +![Battery wires soldered to PCB](docs/battery-2.jpg) + +Put the nice!nano back into the socket and flip the power switch. Make sure the +LEDs on the nice!nano light up to test the connection. (Note: This may not work +when the battery is discharged) + +A new Bluetooth device named "Taira" should appear on your device after turning +on the power switch. Try to connect to it and short the hotswap sockets again to +test, ideally with both sides turned on. + +### Top and bottom plates + +Take a top plate and put a 3mm screw from the top through the hole and screw on +a spacer, repeat this for every hole. Guide the spacers through the assembled +PCB, place the bottom plate on it and secure it with a 3mm screw in each hole. +The distance between the PCB and the top plate should be so that an inserted +switch is supported by the top plate while still touching the PCB. + +![Spacers secured to top plate](docs/screws-1.jpg) +![Top plate guided through PCB](docs/screws-2.jpg) +![Bottom plate secured to spacers](docs/screws-3.jpg) + +Add some rubber pads / feet to the bottom plate to reduce noise while typing and +avoid sliding. + +![Bottom plate with rubber feet](docs/rubber-feet.jpg) + +### Switches + +Gently insert each Kailh Choc switch into the hotswap sockets. It will require +some force, but keep in mind that it _is_ possible to lift off the socket pad if +using too much force or changing switches too often. + +If required, push the top plate up to the switch support with a screwdriver. + +Finally, attach the keycaps. + +### Conclusion + +Congratulations! You successfully built a Taira keyboard! + +I'd love to get feedback on the build process and the keyboard itself - feel +free to e-mail me at [strayer@olle-orks.org](mailto:strayer@olle-orks.org) or +[start a discussion on Github](https://github.com/strayer/taira-keyboard/discussions)! + +![A finished Taira v1.0](docs/taira-1.0.jpg) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..394b12a --- /dev/null +++ b/LICENSE @@ -0,0 +1,8 @@ +Copyright 2022 Sven Grunewaldt + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..999da1c --- /dev/null +++ b/README.md @@ -0,0 +1,51 @@ +# Taira Keyboard + +## What? + +A wireless low-profile split mechanical keyboard with 66 keys inspired by the +ErgoDash and Corne Chocolate. It runs ZMK on two nice!nanos, is fully wireless +via Bluetooth and uses Kailh Choc V1 switches in a 18x19mm grid layout. + +![An assembled Taira v1.0](docs/taira-1.0.jpg) + +## Why? + +I used an ErgoDash with MX switches for over a year multiple hours each day. +Even though I love typing on it, it always felt too bulky and the wires really +started to annoy me - especially when moving between workplaces. At some point I +discovered ZMK and started plans on building a keyboard based on the ErgoDash, +but as low-profile as I could manage. + +After investigating which other low-profile keyboards exist in the community, I +quickly realized that the most sophisticated offer seems to be the Corne +Chocolate. This keyboard is heavily based upon the footprints of the Corne +Chocolate, but layed out in a layout very similar to the original ErgoDash. + +## Build guide + +Follow the [build guide](BUILDGUIDE.md) if you are interested in building your +own Taira. + +## Firmware + +The ZMK firmware is managed in a separate repository: [strayer/taira-keyboard-zmk-config] + +[strayer/taira-keyboard-zmk-config]: https://github.com/strayer/taira-keyboard-zmk-config + +## Acknowledgements + +Thanks to [@omkbd](https://github.com/omkbd) and +[@foostan](https://github.com/foostan/) for releasing both the ErgoDash and the +Corne Chocolate under the MIT license. Without their work, this keyboard would +not exist. + +- https://github.com/omkbd/ErgoDash +- https://github.com/foostan/crkbd/tree/main/corne-chocolate +- an unnamed coworker who helped me _a lot_ while planning and working on the + keyboard + +## Copyright + +Copyright 2022 Sven Grunewaldt + +License: [MIT](LICENSE) diff --git a/docs/battery-1.jpg b/docs/battery-1.jpg new file mode 100644 index 0000000..78f7eb8 Binary files /dev/null and b/docs/battery-1.jpg differ diff --git a/docs/battery-2.jpg b/docs/battery-2.jpg new file mode 100644 index 0000000..af668e8 Binary files /dev/null and b/docs/battery-2.jpg differ diff --git a/docs/diode-orientation.jpg b/docs/diode-orientation.jpg new file mode 100644 index 0000000..5bd1d96 Binary files /dev/null and b/docs/diode-orientation.jpg differ diff --git a/docs/diode-soldering-2.jpg b/docs/diode-soldering-2.jpg new file mode 100644 index 0000000..37958e7 Binary files /dev/null and b/docs/diode-soldering-2.jpg differ diff --git a/docs/diode-soldering.jpg b/docs/diode-soldering.jpg new file mode 100644 index 0000000..7501fdc Binary files /dev/null and b/docs/diode-soldering.jpg differ diff --git a/docs/kailh-hotswap-socket-aligned.jpg b/docs/kailh-hotswap-socket-aligned.jpg new file mode 100644 index 0000000..3ff0183 Binary files /dev/null and b/docs/kailh-hotswap-socket-aligned.jpg differ diff --git a/docs/kailh-hotswap-socket-soldered.jpg b/docs/kailh-hotswap-socket-soldered.jpg new file mode 100644 index 0000000..73ba7d5 Binary files /dev/null and b/docs/kailh-hotswap-socket-soldered.jpg differ diff --git a/docs/nice-nano-sockets-inserted.jpg b/docs/nice-nano-sockets-inserted.jpg new file mode 100644 index 0000000..d70d55c Binary files /dev/null and b/docs/nice-nano-sockets-inserted.jpg differ diff --git a/docs/nice-nano-soldered-to-pins.jpg b/docs/nice-nano-soldered-to-pins.jpg new file mode 100644 index 0000000..f050aa9 Binary files /dev/null and b/docs/nice-nano-soldered-to-pins.jpg differ diff --git a/docs/positional-switch-1.jpeg b/docs/positional-switch-1.jpeg new file mode 100644 index 0000000..6404c3d Binary files /dev/null and b/docs/positional-switch-1.jpeg differ diff --git a/docs/positional-switch-2.jpeg b/docs/positional-switch-2.jpeg new file mode 100644 index 0000000..543b6ea Binary files /dev/null and b/docs/positional-switch-2.jpeg differ diff --git a/docs/power-and-reset-switch-inserted.jpg b/docs/power-and-reset-switch-inserted.jpg new file mode 100644 index 0000000..4d492b1 Binary files /dev/null and b/docs/power-and-reset-switch-inserted.jpg differ diff --git a/docs/power-and-reset-switch-soldered.jpg b/docs/power-and-reset-switch-soldered.jpg new file mode 100644 index 0000000..df19658 Binary files /dev/null and b/docs/power-and-reset-switch-soldered.jpg differ diff --git a/docs/power-and-reset-switch.jpg b/docs/power-and-reset-switch.jpg new file mode 100644 index 0000000..d79775a Binary files /dev/null and b/docs/power-and-reset-switch.jpg differ diff --git a/docs/rubber-feet.jpg b/docs/rubber-feet.jpg new file mode 100644 index 0000000..3858cfe Binary files /dev/null and b/docs/rubber-feet.jpg differ diff --git a/docs/screws-1.jpg b/docs/screws-1.jpg new file mode 100644 index 0000000..b86eb95 Binary files /dev/null and b/docs/screws-1.jpg differ diff --git a/docs/screws-2.jpg b/docs/screws-2.jpg new file mode 100644 index 0000000..976cb26 Binary files /dev/null and b/docs/screws-2.jpg differ diff --git a/docs/screws-3.jpg b/docs/screws-3.jpg new file mode 100644 index 0000000..e7ac9c3 Binary files /dev/null and b/docs/screws-3.jpg differ diff --git a/docs/taira-1.0.jpg b/docs/taira-1.0.jpg new file mode 100644 index 0000000..03b43cd Binary files /dev/null and b/docs/taira-1.0.jpg differ diff --git a/package.json b/package.json new file mode 100644 index 0000000..34e7e7e --- /dev/null +++ b/package.json @@ -0,0 +1,6 @@ +{ + "devDependencies": { + "markdownlint-cli": "^0.30.0", + "prettier": "^2.5.1" + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..3a999d2 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,217 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +commander@~8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +deep-extend@^0.6.0, deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +entities@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +get-stdin@~8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + +glob@~7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +ignore@~5.1.9: + version "5.1.9" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" + integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsonc-parser@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" + integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + +linkify-it@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" + integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== + dependencies: + uc.micro "^1.0.1" + +lodash.differencewith@~4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.differencewith/-/lodash.differencewith-4.5.0.tgz#bafafbc918b55154e179176a00bb0aefaac854b7" + integrity sha1-uvr7yRi1UVTheRdqALsK76rIVLc= + +lodash.flatten@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +markdown-it@12.2.0: + version "12.2.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.2.0.tgz#091f720fd5db206f80de7a8d1f1a7035fd0d38db" + integrity sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg== + dependencies: + argparse "^2.0.1" + entities "~2.1.0" + linkify-it "^3.0.1" + mdurl "^1.0.1" + uc.micro "^1.0.5" + +markdownlint-cli@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/markdownlint-cli/-/markdownlint-cli-0.30.0.tgz#4ec0ab85a491eb161182e5c26eff308bf90f18f3" + integrity sha512-NiG8iERjwsRZtJAIyLMDdYL2O3bJVn3fUxzDl+6Iv61/YYz9H9Nzgke/v0/cW9HfGvgZHhbfI19LFMp6gbKdyw== + dependencies: + commander "~8.3.0" + deep-extend "~0.6.0" + get-stdin "~8.0.0" + glob "~7.2.0" + ignore "~5.1.9" + js-yaml "^4.1.0" + jsonc-parser "~3.0.0" + lodash.differencewith "~4.5.0" + lodash.flatten "~4.4.0" + markdownlint "~0.24.0" + markdownlint-rule-helpers "~0.15.0" + minimatch "~3.0.4" + minimist "~1.2.5" + run-con "~1.2.10" + +markdownlint-rule-helpers@~0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.15.0.tgz#11434c573649b9235ae70b967314f5711f7d8fa8" + integrity sha512-A+9mswc3m/kkqpJCqntmte/1VKhDJ+tjZsERLz5L4h/Qr7ht2/BkGkgY5E7/wsxIhcpl+ctIfz+oS3PQrMOB2w== + +markdownlint@~0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.24.0.tgz#224b53f671367a237d40c8be1745c7be9a322671" + integrity sha512-OJIGsGFV/rC9irI5E1FMy6v9hdACSwaa+EN3224Y5KG8zj2EYzdHOw0pOJovIYmjNfEZ9BtxUY4P7uYHTSNnbQ== + dependencies: + markdown-it "12.2.0" + +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + +minimatch@^3.0.4, minimatch@~3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.5, minimist@~1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +prettier@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" + integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== + +run-con@~1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/run-con/-/run-con-1.2.10.tgz#90de9d43d20274d00478f4c000495bd72f417d22" + integrity sha512-n7PZpYmMM26ZO21dd8y3Yw1TRtGABjRtgPSgFS/nhzfvbJMXFtJhJVyEgayMiP+w/23craJjsnfDvx4W4ue/HQ== + dependencies: + deep-extend "^0.6.0" + ini "~2.0.0" + minimist "^1.2.5" + strip-json-comments "~3.1.1" + +strip-json-comments@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=