diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..480988f --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +speak.wntr.dev diff --git a/build/index.html b/build/index.html new file mode 100644 index 0000000..0c5b08c --- /dev/null +++ b/build/index.html @@ -0,0 +1,276 @@ + + + + + + + + + + Speak to Me + + + + + + - Kit build guide + + + +
+ + +
+

Build#

+

Welcome to the build guide for Speak to Me's DIY kit. We hope you have a great time putting this module together and a wonderful time using it.

+

Please read all instructions thoroughly before starting. If you have questions or run into trouble please reach out to us on discord or drop us an email at support@winterbloom.com.

+

This kit is a beginner-level kit, but it does have a few tricky parts. If it's your first time soldering we recommend reading through Adafruit's guide to excellent soldering and practicing a little before jumping in.

+

This build takes around two hours to complete.

+

Tools required#

+

Before you begin, make sure that you've got:

+ +
+

Flux

+

We suggest using solder with "no clean" flux. If you use a different kind of flux, be sure to carefully clean the flux residue off based on the guidelines provided by the manufacturer of your solder. Take special care with the LEDs and potentiometers, as they can be damaged by water and flux cleaners.

+
+

Kit contents#

+

Your kit should contain the following items. If any are missing please email us at support@winterbloom.com.

+

+ Mainboard + Front panel + 1/8" jacks (2) + Hex nuts for the 1/8" jacks (2) + Eurorack power header + Rubber band + JST wiring harness + 2.5mm L wrench + 2mm L wrench + M3x12 black hex bolts (4) + M3 nuts (4) + JST XH-2 header + Stereo potentiometer + Flat flex cable + Speaker + Grille cloth + 1/4 stereo jack + Speaker spacer + Knob + Headphone jack breakout board +

+ +

Soldering the power header#

+

Your first task is to place and solder the power header and JST header to the mainboard.

+

The mainboard, power header, and JST header

+

Start by placing the power header onto the back side of the mainboard, being careful to align the notch in the header with the drawing on the board. The power header fits snugly, so you might have to give it a little pressure to push it all the way in.

+

The power header being placed on to the back side of the motherboard

+

Flip the board over to the front side and solder the header's 10 pins. Take care not to damage any of the nearby components.

+

The power header's pins being soldered in place

+

Next, place the JST header on the back side of the board. Just like with the power header, align the header with the drawing on the board. The header should not hang over the edge of the board.

+

The JST header placed on the back side of the board

+

Flip the board over and solder the JST header's two pins.

+

The JST header's pin being soldered in place

+

Placing the front side components#

+

Next up is placing the components on the front side of the mainboard. You'll need the 1/8" jacks, the stereo potentiometer, the front panel, and the rubber band for this section.

+

The panel, mainboard, 1/8" jacks, stereo potentiometer, and a rubber band

+

Start by placing the potentiometer on the front side of the board. You might need to slightly straighten out the legs of the potentiometer to get it to go in - don't use excessive force to push it in. Remove the nut and washer on the potentiometer and set it aside for now.

+

The potentiometer placed on the front side of the board

+

Continue by placing the two 1/8" jacks on the front side of the board. Be sure to get the little flexible third leg into its hole.

+

The two 1/8" jacks placed on the front side of the board

+

Using the front panel as a jig#

+

Since the potentiometer and jacks need to peek through the front panel, you can use it as a jig to make sure everything stays in the right place while soldering. Carefully line up the front panel's holes with the potentiometer and jack and push the front panel on.

+

The panel being placed over the mainboard's jacks and potentiometer

+

Use the rubber band to temporarily hold the front panel on while you're working on it. You'll need to double- or triple- over the rubber band to get it tight.

+

+ A rubber band being pulled taught across the center of the module + The module with a doubled-overed rubber band holding the panel in place + The same but showing the back side of the module +

+

Soldering the front side components#

+

With everything held in place, you can now flip the module over and solder all of the front panel components in place. As you go, take a moment now and then to check that everything is flush with the panel and mainboard.

+

Start by soldering the two 1/8" jacks.

+

The pins on the 1/8" jacks being soldered in place

+

Next up is the potentiometer. This one can be a little tricky so read through all of these instructions and use caution. First, move the rubber band slightly to get a clear look at the potentiometer's holes.

+

The back side of the board, showing the rubber band moved down slightly to reveal the pins and legs for the potentiometer

+

Next, solder the two large legs of the potentiometer one at a time. When soldering the one next to the power header, be careful not to melt the power header with your iron. After soldering the first one, double-check that the potentiometer is flush with the mainboard and adjust if needed.

+

The potentiometer's leg being soldered in place

+

With the two legs soldered, finish up by soldering the six remaining pins.

+

The potentiometer's 6 pins being soldered

+

Soldering the flat flex cable to the mainboard#

+

Next up is soldering the flat flex cable to the mainboard.

+

The mainboard and the flat flex cable

+

Prepare the flat flex cable by removing the cover on one side of it. Just pull up lightly to get the cover to come off- do not cut the flat flex cable.

+

+ The flat flex cable with the small cover on the top of it being held lightly + The flat flex cable with the small cover on the top removed, revealing the conductors +

+

Push the exposed conductors of the flat flex cable through the matching holes on the motherboard. This is designed to go together easily, just be take care not to bend any of the conductors.

+

The flat flex cable placed through the five holes on the mainboard through the back side

+

With everything in place, solder the five flat flex cable conductors to the motherboard.

+

The flat flex cable's five conductors soldered onto the mainboard

+

Soldering the flat flex cable to the headphone breakout#

+

With one side of the flat flex cable done, the next step is to connect the other side to the headphone breakout board.

+

The mainboard (with the flat flex cable attached) and the headphone breakout board

+

Just like in the previous step, remove the cover for the flat flex cable. Push it through the matching holes on the headphone breakout board. Note the orientation of the breakout board relative to the mainboard. The side without any text is the front side and should be facing the same direction as the front side of the mainboard.

+

The five conductors of the flat flex cable pushed through the five holes on the headphone breakout board

+

Double check the orientation and then solder the flat flex cable in place.

+

The five conductors of the flat flex cable soldered to the headphone breakout board

+

Soldering the 1/4" jack#

+

Next up is soldering the large 1/4" jack to the jack breakout board. Before starting, remove the nut and washer from the jack and set aside.

+

The mainboard assembly with flat flex cable and headphone breakout attached along with the large 1/4" jack

+

Place the jack on the front side of the breakout board. The jack has one slanted side so that it can only go in one way. The jack's legs will not go all the way through the board so don't use excessive force to place it.

+

The large 1/4" jack placed on to the front side of the headphone breakout board

+

Solder the legs of the jack and take care not to melt the flat flex cable.

+

The back side of the headphone breakout board with the 1/4"'s legs being soldered in place

+

Preparing the speaker#

+

With the mainboard complete, your next task is to prepare the speaker. You'll need the speaker and the JST wiring harness.

+

The speaker and the JST wiring harness

+

Un-twist the end of the leads a little and solder the leads to the eyelets on the speaker. For Speak to Me, polarity does not matter, however, if you like to be thorough and proper the speaker's eyelets are marked with "+" and "-". Solder the black lead to the "-" eyelet and the red lead to the "+" eyelet.

+

The leads of the JST wiring harness being soldered to the speaker

+

At this point you are done soldering! You can put your iron away if you'd like.

+

Mounting the speaker#

+

Now that the speaker has its cable, your next task is to mount it to the front panel. You'll need the speaker, panel, grill cloth, speaker spacer, the four M3 bolts and nuts, and the 2.5mm L wrench.

+

The panel, speaker, grill cloth, speaker spacer, M3 bolts, M3 nuts, and a 2.5mm L wrench

+

Start by pushing two of the bolts through the mounting holes on the front side of the panel and then placing the panel face-down with the bolts sticking up. Put the bolts on opposite corners - one at the bottom-right and one at the top-left.

+

The panel with two bolts placed through it, lying face down with the bolts sticking up

+

Next, place the grill cloth through the bolts and flush up against the panel.

+

The same picture, but with the grill cloth placed on the bolts and flush against the panel

+

Now place the speaker spacer through the bolts and flush against the grill cloth.

+

The same picture, but now with the speaker spacer placed on the bolts and flush against the panel

+

Then place the speaker through the bolts and flush against the spacer. The bolts might be a bit tight here, if needed, flip the assembly over and use the 2.5mm L wrench to screw the bolts through.

+

The same picture, but now with the speaker placed on the boards and flush against the spacer

+

Take one of the M3 nuts and attach it to the bolt on the top of the speaker. Don't fully tighten it yet.

+

The speaker assembly with an M3 nut being hand-tightened onto one of the bolts

+

Do the same with the bolt on the bottom of the speaker. The speaker's eyelet might be in the way a little, you can bend it very slightly up to give yourself a bit more space. You can use the 2.5mm L wrench to back the bolt out a bit if needed.

+

The assembly with another M3 nut being placed while turning the bolt with the 2.5mm L wrench

+

Add the remaining two bolts and nuts. These bolts will have a lot more resistance than the first two and you'll need to use the 2.5 L wrench to screw them through the grill cloth, speaker spacer, and speaker to reach the bolt.

+

The front of the assembly with a third bolt being placed through one of the corners

+

Finally, tighten all the bolts carefully with the 2.5mm L wrench. They should be snug but do not over-tighten then as you could crack the speaker spacer.

+

The front of the assembly with one of the bolts being tightening with the 2.5mm L wrench

+

Mounting mainboard to the panel#

+

With the speaker mounted to the panel, it's time to mount the mainboard. You'll need the panel assembly, the mainboard, the nuts for the 1/8" jack, the jack and washer for the potentiometer, and the jack and washer for the 1/4" jack.

+

Place the panel over the 1/8" jacks and the potentiometer - the same way you did when using the panel to align components before soldering them.

+

The main board pushed flush against the back of the panel

+

Use the potentiometer's washer and nut to secure it to the panel.

+

The potentiometer's nut being tightened by hand

+

Secure the two 1/8" with their nuts.

+

The two 1/8" jack nuts being placed and tightened by hand

+

Push the large 1/4" jack through its hole in the panel. The flat flex cable will need to bend a bit to get it all to line up.

+

The large 1/4" jack being pushed through its hole in the front panel, with the flat flex cable bending to accommodate the new position.

+

Use the 1/4" jack's washer and nut to secure it to the panel.

+

The large 1/4" jack secured in place using its washer and nut

+

Adding the volume knob#

+

You're almost done! Next up is putting the volume knob on. You'll need the 2mm L wrench for this section.

+

The 20mm aluminum volume know and a 2mm L wrench

+

Using the 2mm L wrench, loosen the grub screw inside the knob. Don't completely remove it, just loosen it enough so that it's not obstructing the hole in the center.

+

The 2mm L wrench being used to loosen the grub nut inside the knob

+

Before placing the knob, turn the potentiometer manually all the way counter-clockwise. Place the knob over the potentiometer's shaft with the white stripe pointing to about 7 o' clock.

+

The knob placed on the front panel, with its white stripe pointing to 7 o' clock

+

Use the 2.5mm L wrench to tighten the grub screw and secure the knob to the potentiometer's shaft.

+

The 2.5mm L wrench being used to tighten the grub screw againt the potentiometer

+

Plugging in the speaker#

+

The last step is to plug in the speaker. Flip the module over and grab the speaker's JST cable.

+

The back side of the module, showing the speaker's JST cable

+

Push the end of the JST cable into the JST header on the mainboard. It might take a little bit of force to get the cable to snap into place.

+

The JST cable plugged into the JST header on the mainboard

+

All done#

+

Congratulations! You've finished your very own Speak to Me!

+

The compeleted module

+

Now that it's all put together go check out the User's Guide and please show us your work by tweeting at @wntrblm or tagging @wntrblm in your instagram post.

+
+ + + + + \ No newline at end of file diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..ef40c3f Binary files /dev/null and b/icon.png differ diff --git a/images/1-kit-10.jpg b/images/1-kit-10.jpg new file mode 100644 index 0000000..ba96231 Binary files /dev/null and b/images/1-kit-10.jpg differ diff --git a/images/1-kit-15.jpg b/images/1-kit-15.jpg new file mode 100644 index 0000000..5f4523a Binary files /dev/null and b/images/1-kit-15.jpg differ diff --git a/images/10-panel-1.jpg b/images/10-panel-1.jpg new file mode 100644 index 0000000..8474ed3 Binary files /dev/null and b/images/10-panel-1.jpg differ diff --git a/images/11-rubber-band-2.jpg b/images/11-rubber-band-2.jpg new file mode 100644 index 0000000..77991c0 Binary files /dev/null and b/images/11-rubber-band-2.jpg differ diff --git a/images/11-rubber-band-3.jpg b/images/11-rubber-band-3.jpg new file mode 100644 index 0000000..7b30c0d Binary files /dev/null and b/images/11-rubber-band-3.jpg differ diff --git a/images/11-rubber-band-4.jpg b/images/11-rubber-band-4.jpg new file mode 100644 index 0000000..f6d7277 Binary files /dev/null and b/images/11-rubber-band-4.jpg differ diff --git a/images/12-soldering-jacks-2.jpg b/images/12-soldering-jacks-2.jpg new file mode 100644 index 0000000..d66010e Binary files /dev/null and b/images/12-soldering-jacks-2.jpg differ diff --git a/images/13-soldering-pot-2.jpg b/images/13-soldering-pot-2.jpg new file mode 100644 index 0000000..f7c8508 Binary files /dev/null and b/images/13-soldering-pot-2.jpg differ diff --git a/images/13-soldering-pot-9.jpg b/images/13-soldering-pot-9.jpg new file mode 100644 index 0000000..04f131f Binary files /dev/null and b/images/13-soldering-pot-9.jpg differ diff --git a/images/14-soldering-pot-pt-2-2.jpg b/images/14-soldering-pot-pt-2-2.jpg new file mode 100644 index 0000000..e05aec5 Binary files /dev/null and b/images/14-soldering-pot-pt-2-2.jpg differ diff --git a/images/15-ffc-1.jpg b/images/15-ffc-1.jpg new file mode 100644 index 0000000..c1d2359 Binary files /dev/null and b/images/15-ffc-1.jpg differ diff --git a/images/16-ffc-prep-1.jpg b/images/16-ffc-prep-1.jpg new file mode 100644 index 0000000..6f60e7d Binary files /dev/null and b/images/16-ffc-prep-1.jpg differ diff --git a/images/16-ffc-prep-3.jpg b/images/16-ffc-prep-3.jpg new file mode 100644 index 0000000..0c1fd3d Binary files /dev/null and b/images/16-ffc-prep-3.jpg differ diff --git a/images/17-ffc-connect-3.jpg b/images/17-ffc-connect-3.jpg new file mode 100644 index 0000000..466f8f7 Binary files /dev/null and b/images/17-ffc-connect-3.jpg differ diff --git a/images/18-solder-ffc-1.jpg b/images/18-solder-ffc-1.jpg new file mode 100644 index 0000000..576b5a3 Binary files /dev/null and b/images/18-solder-ffc-1.jpg differ diff --git a/images/18-solder-ffc-9.jpg b/images/18-solder-ffc-9.jpg new file mode 100644 index 0000000..57aa18c Binary files /dev/null and b/images/18-solder-ffc-9.jpg differ diff --git a/images/19-ffc-and-hp-breakout-5.jpg b/images/19-ffc-and-hp-breakout-5.jpg new file mode 100644 index 0000000..dbf0b44 Binary files /dev/null and b/images/19-ffc-and-hp-breakout-5.jpg differ diff --git a/images/2-mb-3.jpg b/images/2-mb-3.jpg new file mode 100644 index 0000000..6901e33 Binary files /dev/null and b/images/2-mb-3.jpg differ diff --git a/images/20-ffc-hp-1.jpg b/images/20-ffc-hp-1.jpg new file mode 100644 index 0000000..ee723a7 Binary files /dev/null and b/images/20-ffc-hp-1.jpg differ diff --git a/images/21-ffc-soldering4.jpg b/images/21-ffc-soldering4.jpg new file mode 100644 index 0000000..eca903d Binary files /dev/null and b/images/21-ffc-soldering4.jpg differ diff --git a/images/22-big-jack-4.jpg b/images/22-big-jack-4.jpg new file mode 100644 index 0000000..56a573f Binary files /dev/null and b/images/22-big-jack-4.jpg differ diff --git a/images/23-big-jack-placement-4.jpg b/images/23-big-jack-placement-4.jpg new file mode 100644 index 0000000..d9e41cd Binary files /dev/null and b/images/23-big-jack-placement-4.jpg differ diff --git a/images/24-big-jack-soldering-5.jpg b/images/24-big-jack-soldering-5.jpg new file mode 100644 index 0000000..1f8c3ec Binary files /dev/null and b/images/24-big-jack-soldering-5.jpg differ diff --git a/images/25-speaker-and-jst-4.jpg b/images/25-speaker-and-jst-4.jpg new file mode 100644 index 0000000..f7fa5fa Binary files /dev/null and b/images/25-speaker-and-jst-4.jpg differ diff --git a/images/26-speaker-3.jpg b/images/26-speaker-3.jpg new file mode 100644 index 0000000..59c543d Binary files /dev/null and b/images/26-speaker-3.jpg differ diff --git a/images/27-speaker-soldering-1.jpg b/images/27-speaker-soldering-1.jpg new file mode 100644 index 0000000..d4593e4 Binary files /dev/null and b/images/27-speaker-soldering-1.jpg differ diff --git a/images/28-speaker-hardware-2.jpg b/images/28-speaker-hardware-2.jpg new file mode 100644 index 0000000..835ba63 Binary files /dev/null and b/images/28-speaker-hardware-2.jpg differ diff --git a/images/29-bolts-1.jpg b/images/29-bolts-1.jpg new file mode 100644 index 0000000..6d726e6 Binary files /dev/null and b/images/29-bolts-1.jpg differ diff --git a/images/3-pw-2.jpg b/images/3-pw-2.jpg new file mode 100644 index 0000000..07cf0a1 Binary files /dev/null and b/images/3-pw-2.jpg differ diff --git a/images/3-pw-5.jpg b/images/3-pw-5.jpg new file mode 100644 index 0000000..09185c8 Binary files /dev/null and b/images/3-pw-5.jpg differ diff --git a/images/30-grill-2.jpg b/images/30-grill-2.jpg new file mode 100644 index 0000000..456f63b Binary files /dev/null and b/images/30-grill-2.jpg differ diff --git a/images/31-spacer-1.jpg b/images/31-spacer-1.jpg new file mode 100644 index 0000000..d10eecb Binary files /dev/null and b/images/31-spacer-1.jpg differ diff --git a/images/32-mount-speaker-2.jpg b/images/32-mount-speaker-2.jpg new file mode 100644 index 0000000..9da6c74 Binary files /dev/null and b/images/32-mount-speaker-2.jpg differ diff --git a/images/33-first-nut-3.jpg b/images/33-first-nut-3.jpg new file mode 100644 index 0000000..637ac46 Binary files /dev/null and b/images/33-first-nut-3.jpg differ diff --git a/images/34-tighten-nut-2.jpg b/images/34-tighten-nut-2.jpg new file mode 100644 index 0000000..a39e0e8 Binary files /dev/null and b/images/34-tighten-nut-2.jpg differ diff --git a/images/35-other-bolts-4.jpg b/images/35-other-bolts-4.jpg new file mode 100644 index 0000000..de12aef Binary files /dev/null and b/images/35-other-bolts-4.jpg differ diff --git a/images/36-tighten-all-bolts-3.jpg b/images/36-tighten-all-bolts-3.jpg new file mode 100644 index 0000000..f8d35b4 Binary files /dev/null and b/images/36-tighten-all-bolts-3.jpg differ diff --git a/images/37-mount-panel-2.jpg b/images/37-mount-panel-2.jpg new file mode 100644 index 0000000..625700f Binary files /dev/null and b/images/37-mount-panel-2.jpg differ diff --git a/images/38-mount-pot-1.jpg b/images/38-mount-pot-1.jpg new file mode 100644 index 0000000..d61c137 Binary files /dev/null and b/images/38-mount-pot-1.jpg differ diff --git a/images/39-mount-jacks-1.jpg b/images/39-mount-jacks-1.jpg new file mode 100644 index 0000000..0e626b7 Binary files /dev/null and b/images/39-mount-jacks-1.jpg differ diff --git a/images/39-mount-jacks-3.jpg b/images/39-mount-jacks-3.jpg new file mode 100644 index 0000000..453bdd8 Binary files /dev/null and b/images/39-mount-jacks-3.jpg differ diff --git a/images/4-pws-8.jpg b/images/4-pws-8.jpg new file mode 100644 index 0000000..263ca41 Binary files /dev/null and b/images/4-pws-8.jpg differ diff --git a/images/40-align-big-jack-2.jpg b/images/40-align-big-jack-2.jpg new file mode 100644 index 0000000..0a01c72 Binary files /dev/null and b/images/40-align-big-jack-2.jpg differ diff --git a/images/41-mount-big-jack-5.jpg b/images/41-mount-big-jack-5.jpg new file mode 100644 index 0000000..450b713 Binary files /dev/null and b/images/41-mount-big-jack-5.jpg differ diff --git a/images/42-knob-4.jpg b/images/42-knob-4.jpg new file mode 100644 index 0000000..6b1c869 Binary files /dev/null and b/images/42-knob-4.jpg differ diff --git a/images/43-knob-loosen-2.jpg b/images/43-knob-loosen-2.jpg new file mode 100644 index 0000000..f8d19fd Binary files /dev/null and b/images/43-knob-loosen-2.jpg differ diff --git a/images/44-knob-placement-2.jpg b/images/44-knob-placement-2.jpg new file mode 100644 index 0000000..0c789e0 Binary files /dev/null and b/images/44-knob-placement-2.jpg differ diff --git a/images/45-tighten-knob-5.jpg b/images/45-tighten-knob-5.jpg new file mode 100644 index 0000000..9c9e05f Binary files /dev/null and b/images/45-tighten-knob-5.jpg differ diff --git a/images/46-speaker-connection-2.jpg b/images/46-speaker-connection-2.jpg new file mode 100644 index 0000000..87e7893 Binary files /dev/null and b/images/46-speaker-connection-2.jpg differ diff --git a/images/47-speaker-connected-4.jpg b/images/47-speaker-connected-4.jpg new file mode 100644 index 0000000..30c9a6a Binary files /dev/null and b/images/47-speaker-connected-4.jpg differ diff --git a/images/48-done-4.jpg b/images/48-done-4.jpg new file mode 100644 index 0000000..0034e73 Binary files /dev/null and b/images/48-done-4.jpg differ diff --git a/images/5-jst-4.jpg b/images/5-jst-4.jpg new file mode 100644 index 0000000..8104748 Binary files /dev/null and b/images/5-jst-4.jpg differ diff --git a/images/6-jsts-3.jpg b/images/6-jsts-3.jpg new file mode 100644 index 0000000..f903db2 Binary files /dev/null and b/images/6-jsts-3.jpg differ diff --git a/images/7-jacks-and-pot-4.jpg b/images/7-jacks-and-pot-4.jpg new file mode 100644 index 0000000..f6f5c82 Binary files /dev/null and b/images/7-jacks-and-pot-4.jpg differ diff --git a/images/8-pot-3.jpg b/images/8-pot-3.jpg new file mode 100644 index 0000000..b4f1f50 Binary files /dev/null and b/images/8-pot-3.jpg differ diff --git a/images/9-jacks-2.jpg b/images/9-jacks-2.jpg new file mode 100644 index 0000000..f1ec02b Binary files /dev/null and b/images/9-jacks-2.jpg differ diff --git a/images/dual-wielding.svg b/images/dual-wielding.svg new file mode 100644 index 0000000..3adb656 --- /dev/null +++ b/images/dual-wielding.svg @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/kit.svg b/images/kit.svg new file mode 100644 index 0000000..bf04017 --- /dev/null +++ b/images/kit.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/line-mono-alt.svg b/images/line-mono-alt.svg new file mode 100644 index 0000000..df0cb62 --- /dev/null +++ b/images/line-mono-alt.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/line-mono.svg b/images/line-mono.svg new file mode 100644 index 0000000..008c258 --- /dev/null +++ b/images/line-mono.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/line-split-mono.svg b/images/line-split-mono.svg new file mode 100644 index 0000000..d966820 --- /dev/null +++ b/images/line-split-mono.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/line-split-stereo.svg b/images/line-split-stereo.svg new file mode 100644 index 0000000..3c687aa --- /dev/null +++ b/images/line-split-stereo.svg @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/line-stereo.svg b/images/line-stereo.svg new file mode 100644 index 0000000..4c69b46 --- /dev/null +++ b/images/line-stereo.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/mono-in-headphones.svg b/images/mono-in-headphones.svg new file mode 100644 index 0000000..b11035b --- /dev/null +++ b/images/mono-in-headphones.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/mono-in-speaker.svg b/images/mono-in-speaker.svg new file mode 100644 index 0000000..3139462 --- /dev/null +++ b/images/mono-in-speaker.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/oshw.svg b/images/oshw.svg new file mode 100644 index 0000000..59fcf99 --- /dev/null +++ b/images/oshw.svg @@ -0,0 +1 @@ +US002060 \ No newline at end of file diff --git a/images/stereo-in-headphones.svg b/images/stereo-in-headphones.svg new file mode 100644 index 0000000..d5163b5 --- /dev/null +++ b/images/stereo-in-headphones.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/stereo-in-speaker.svg b/images/stereo-in-speaker.svg new file mode 100644 index 0000000..62cced8 --- /dev/null +++ b/images/stereo-in-speaker.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..4e623f2 --- /dev/null +++ b/index.html @@ -0,0 +1,200 @@ + + + + + + + + + + Speak to Me + + + + + + + +
+ + +
+

Speak to Me User Guide#

+

Speak to Me is rock solid high-quality headphone amplifier with a delightfully lo-fi speaker.

+ +

Specifications#

+ +

Getting support and help#

+

We want you to have a wonderful experience with your module. If you need help or run into problems, please reach out to us. Email is the best way for product issues, whereas Discord and GitHub are great for getting advice and help on how to customize your module.

+ +

Installing the module#

+

To install this into your Eurorack setup, connect a Eurorack power cable from your power supply to the back of the module. Note that even though there's a keyed power connector on the module, double check that the red stripe is on the side labeled red stripe! Once you've connected the power cable, secure your module to your rack rails using screws.

+

Making connections#

+

There's a few different ways that you can patch Speak to Me depending on your setup and needs. The following sections walk through the various ways of using Speak to Me.

+

Mono in with speaker#

+

Mono input with the speaker active

+

The most basic setup. Connect Eurorack-level audio to the top 3.5mm jack and Speak to Me will play the audio through its speaker

+

This is great for small setups but also super useful in larger racks if you want to monitor a small part of your patch.

+

Stereo in with speaker#

+

Stereo input with speaker active

+

Connect the Eurorack-level audio signal for the left channel to the top 3.5mm jack and the signal for the right channel to the bottom 3.5mm jack. Speak to Me will downmix the two signals to mono and play the audio through the speaker.

+

Like the mono setup, this is great for small setups and monitoring. It has the added benefit of being able +to monitor two (possibly unrelated) signals at the same time.

+

Mono in with headphones#

+

Mono input with headphones

+

Connect Eurorack-level audio to the top 3.5mm jack and connect a pair of stereo headphones to the larger 1/4" TRS jack. Speak to Me will play the audio through both the left and right headphone - no need to patch the same signal twice. The speaker is automatically turned off when headphones are connected.

+

Just like with the previous setup, this is wonderful for small setups and monitoring larger racks. One major benefit to this setup is that the module consumes much less power when the speaker is off, so this is ideal for portable and battery-powered setups.

+

Stereo in with headphones#

+

Stereo input with headphones

+

Connect the Eurorack-level audio signal for the left channel to the top 3.5mm jack and the signal for the right channel to the bottom 3.5mm jack. Connect a pair of stereo headphones to the larger 1/4" TRS jack. Speak to Me will play the audio through the headphones. The speaker is automatically turned off when headphones are connected.

+

Like the mono setup, this benefits from lower power consumption which is ideal for portable and battery-powered setups. It can also be used to monitor two different signals (one in each ear) if needed.

+

Mono in with line out#

+

First, connect the Eurorack-level audio signal to the top 3.5mm jack.

+

Next, connect Speak to Me's 1/4" stereo output to your mixer, interface, or other line-level equipment. The specific cable needed to do this depends on your equipment's input options.

+

If your equipment has a stereo line input, you can use a 1/4" TRS stereo cable like this one. Even though the interconnect is a stereo cable, Speak to Me will send the same signal to both channels:

+

Mono input with stereo cable line out

+

If your equipment has mono line, instrument, or microphone inputs such as those commonly found on recording interfaces, you can use a 1/4" TRS to 1/4" TS to adapter like this one:

+

Mono input with mono cable line out

+
+

Mono cables

+

We highly recommend using the TRS to TR adapter over using a typical mono 1/4" TR cable. Using a mono cable directly might, in extreme cases, cause some audio issues such as "hiccups". This is because using a mono cable shorts the signal on the ring connector to ground and causes the module to draw more power. Speak to Me is designed to operate under these conditions, but we wanted to let you know just in case.

+
+

Alternatively, you can use a 1/4" TRS Y-cable like this one as an adapter. You can connect either end of the Y cable to your equipment.

+

Mono input with split cable line out

+

This setup is great for getting audio out of your Eurorack and into a recording, mixer, or line-level effects units.

+

Stereo in with line out#

+

First, connect the Eurorack-level audio signal inputs: connect the signal for the left channel to the top 3.5mm jack and the signal for the right channel to the bottom 3.5mm jack.

+

Next, connect Speak to Me's 1/4" stereo output to your mixer, interface, or other line-level equipment. The specific cable needed to do this depends on your equipment's input options.

+

If your equipment has a stereo line input, you can use a 1/4" TRS stereo cable like this one:

+

Stereo input with stereo line out

+

However, if your equipment has mono line, instrument, or microphone inputs such as those commonly found on recording interfaces, you'll need to use a 1/4" TRS Y-cable like this one to split the left and right channels. You'll then connect each channel into a separate input on your equipment:

+

Stereo input with split line out

+

Like the mono setup, this is great for getting audio out of your Eurorack and into a recording, mixer, or line-level effects units. It's especially useful if you have modules that produce stereo effects or if you want to record two independent patches at the same time.

+

Stereo speakers#

+

Stereo speaker setup using two Speak to Me modules

+

If you happen to have two Speak to Me modules, you can set up one module on each side of your rack and use them as a pair of stereo speakers. Connect your right channel signal to the top 3.5mm input on the right-side Speak to Me and connect the left channel signal to the top 3.5mm input on the left side.

+ +

Like most audio equipment, connecting Speak to Me to external equipment can require using adapters. We recommend HOSA cables and adapters. You can purchase these online or through a local music equipment retailer.

+ +

Open source hardware & software#

+

Speak to Me is completely open source and hacking is encouraged.

+

The hardware design is available under the permissive CERN-OHL-P v2 and is designed using KiCAD which is free and open-source. You can open the hardware files using KiCAD or you can check out a PDF of the schematic.

+

Open Source Hardware Association mark Speak to Me is certified open source hardware

+

Warranty, disclaimers, and limits#

+

Modules purchased from Winterbloom have a warranty of six months from the date of purchase. This warranty covers any manufacturing defects in the module. It does not cover damage from due to incorrect handling, storage, or power, overvoltage events, or modifications.

+

Please contact us if you are experiencing issues with your module. Modules returned under warranty will either be refunded, replaced, or repaired at our discretion. You will be responsible for the cost of returning the module to Winterbloom.

+

Because Eurorack has a vast number of possible combinations of power supplies, modules, cases, and accessories, it is impossible for us to guarantee compatibility with every possible configuration. We make a reasonable effort to test modules with several power supplies, cases, and other modules.

+

We encourage tinkering, however, we will not refund, repair, or replace any products that have been modified.

+

We have stress tested Speak to Me under the following conditions. These are provided for reference only; we do not guarantee that that the module will function under these conditions.

+ +

Acknowledgments and thanks#

+

Speak to Me would not be possible without the support of Winterbloom's incredible community, the Trans Synth Discord, and Noise Engineering.

+
+ + + + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..bdb5905 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,13 @@ + + + + https://speak.wntr.dev/ + 2024-02-23 + daily + + + https://speak.wntr.dev/build/ + 2024-02-23 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000..5278cff Binary files /dev/null and b/sitemap.xml.gz differ diff --git a/winter.css b/winter.css new file mode 100644 index 0000000..e3666af --- /dev/null +++ b/winter.css @@ -0,0 +1,1303 @@ +@import "https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200..1000;1,200..1000&family=Space+Grotesk:wght@300..700&family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap"; +@import "https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0&display=block"; + +/* src/styles/reset.css */ +*, +*::before, +*::after { + box-sizing: border-box; +} +* { + margin: 0; +} +body { + line-height: 1.5; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + -webkit-text-size-adjust: 100%; + -moz-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + text-size-adjust: 100%; +} +img, +picture, +video, +canvas, +svg { + display: block; + max-width: 100%; +} +input, +button, +textarea, +select { + font: inherit; +} +p, +h1, +h2, +h3, +h4, +h5, +h6 { + overflow-wrap: break-word; +} +#root, +#__next { + isolation: isolate; +} + +/* src/styles/fonts.css */ + +/* src/styles/colors.css */ +:root { + --winter-white: #fff; + --winter-black: #000; + --winter-not-quite-black: #333; + --winter-yellow-1: rgb(184, 125, 33); + --winter-yellow-2: rgb(219, 161, 64); + --winter-yellow-3: rgb(250, 194, 105); + --winter-yellow-4: rgb(255, 214, 143); + --winter-yellow-5: rgb(255, 229, 186); + --winter-red-1: rgb(191, 36, 54); + --winter-red-2: rgb(217, 74, 92); + --winter-red-3: rgb(245, 115, 128); + --winter-red-4: rgb(250, 153, 163); + --winter-red-5: rgb(252, 194, 201); + --winter-teal-1: rgb(38, 120, 128); + --winter-teal-2: rgb(64, 140, 148); + --winter-teal-3: rgb(102, 173, 181); + --winter-teal-4: rgb(153, 209, 214); + --winter-teal-5: rgb(204, 237, 240); + --winter-purple-1: rgb(94, 64, 158); + --winter-purple-2: rgb(125, 97, 186); + --winter-purple-3: rgb(163, 138, 214); + --winter-purple-4: rgb(199, 184, 237); + --winter-purple-5: rgb(235, 227, 250); +} +:root { + --color-red-50: #fff8f8; + --color-red-100: #ffe9e9; + --color-red-200: #ffc7c9; + --color-red-300: #fea5a9; + --color-red-400: #f8818b; + --color-red-500: #d96772; + --color-red-600: #b0555d; + --color-red-700: #93494f; + --color-red-800: #753b40; + --color-red-900: #542d2f; + --color-orange-50: #fff9f5; + --color-orange-100: #fdeadd; + --color-orange-200: #facca8; + --color-orange-300: #f6ad72; + --color-orange-400: #f18c30; + --color-orange-500: #de6a00; + --color-orange-600: #b35800; + --color-orange-700: #964b00; + --color-orange-800: #773d00; + --color-orange-900: #582d00; + --color-yellow-50: #fdfaec; + --color-yellow-100: #f9eebf; + --color-yellow-200: #eed45a; + --color-yellow-300: #d3bd4a; + --color-yellow-400: #b7a540; + --color-yellow-500: #9a8c36; + --color-yellow-600: #7c722c; + --color-yellow-700: #686025; + --color-yellow-800: #534d1e; + --color-yellow-900: #3d3916; + --color-green-50: #f1fdf3; + --color-green-100: #cef8d6; + --color-green-200: #79ec91; + --color-green-300: #6bd280; + --color-green-400: #5db770; + --color-green-500: #4f9b5e; + --color-green-600: #407e4d; + --color-green-700: #366a41; + --color-green-800: #2b5534; + --color-green-900: #203f26; + --color-mint-50: #e9fff4; + --color-mint-100: #abffd6; + --color-mint-200: #73ebb1; + --color-mint-300: #65d19e; + --color-mint-400: #58b68b; + --color-mint-500: #499a75; + --color-mint-600: #3b7d60; + --color-mint-700: #316a51; + --color-mint-800: #275541; + --color-mint-900: #1d3e30; + --color-cyan-50: #eefdff; + --color-cyan-100: #c2f7ff; + --color-cyan-200: #7ce4f4; + --color-cyan-300: #6ecad9; + --color-cyan-400: #60b1bd; + --color-cyan-500: #5195a0; + --color-cyan-600: #427982; + --color-cyan-700: #37666e; + --color-cyan-800: #2c5258; + --color-cyan-900: #213c41; + --color-blue-50: #f5fbff; + --color-blue-100: #ddf0ff; + --color-blue-200: #abdaff; + --color-blue-300: #8cc3ed; + --color-blue-400: #7aaacf; + --color-blue-500: #678fae; + --color-blue-600: #54758e; + --color-blue-700: #476278; + --color-blue-800: #394f60; + --color-blue-900: #2a3a46; + --color-purple-50: #fbf9ff; + --color-purple-100: #f2eaff; + --color-purple-200: #deccff; + --color-purple-300: #cbafff; + --color-purple-400: #b791ff; + --color-purple-500: #9d75e6; + --color-purple-600: #8060bc; + --color-purple-700: #6c519e; + --color-purple-800: #56417f; + --color-purple-900: #40305d; + --color-violet-50: #fcf9fd; + --color-violet-100: #f5eaf7; + --color-violet-200: #e7ccec; + --color-violet-300: #d8afe0; + --color-violet-400: #c991d5; + --color-violet-500: #b770c7; + --color-violet-600: #a34cba; + --color-violet-700: #9037a8; + --color-violet-800: #722e85; + --color-violet-900: #53255f; + --color-pink-50: #fff8fb; + --color-pink-100: #ffe8f0; + --color-pink-200: #ffc5d9; + --color-pink-300: #fea2c2; + --color-pink-400: #f77ea8; + --color-pink-500: #d16a8e; + --color-pink-600: #aa5674; + --color-pink-700: #8f4962; + --color-pink-800: #733a4e; + --color-pink-900: #552b3a; + --color-gray-50: #fafafa; + --color-gray-100: #eeedef; + --color-gray-200: #d5d4d8; + --color-gray-300: #bdbcc2; + --color-gray-400: #a5a4ab; + --color-gray-500: #8c8a93; + --color-gray-600: #726f7b; + --color-gray-700: #615e6b; + --color-gray-800: #4e4a59; + --color-gray-900: #3a3647; +} + +/* src/styles/tokens.css */ +:root { + --winter-border-radius-s: 0.1875rem; + --winter-border-radius-m: 0.25rem; + --winter-border-radius-l: 0.5rem; + --winter-border-radius-xl: 1rem; + --winter-border-radius-circle: 50%; + --winter-border-radius-pill: 9999px; + --winter-shadow-color-hsl: + 261, + 32%, + 28%; + --winter-shadow-xs: 1px 1px 1px 0 hsl(var(--winter-shadow-color-hsl), 0.2), 0 0 10px 0 hsl(var(--winter-shadow-color-hsl), 0.1); + --winter-shadow-s: 3px 3px 2px 0 hsl(var(--winter-shadow-color-hsl), 0.2), 0 0 10px 0 hsl(var(--winter-shadow-color-hsl), 0.15); + --winter-shadow-m: 6px 6px 3px 0 hsl(var(--winter-shadow-color-hsl), 0.3), 0 0 10px 0 hsl(var(--winter-shadow-color-hsl), 0.2); + --winter-shadow-l: 10px 10px 3px 0 hsl(var(--winter-shadow-color-hsl), 0.3), 0 0 10px 0 hsl(var(--winter-shadow-color-hsl), 0.2); + --winter-spacing-xxxs: 0.125rem; + --winter-spacing-xxs: 0.25rem; + --winter-spacing-xs: 0.5rem; + --winter-spacing-s: 0.75rem; + --winter-spacing-m: 1rem; + --winter-spacing-l: 1.25rem; + --winter-spacing-xl: 1.75rem; + --winter-spacing-xxl: 2.25rem; + --winter-spacing-xxxl: 3rem; + --winter-spacing-xxxxl: 4.5rem; + --winter-duration-xs: 50ms; + --winter-duration-s: 150ms; + --winter-duration-m: 250ms; + --winter-duration-l: 500ms; + --winter-duration-xl: 1000ms; + --winter-font-serif: + "Nunito", + Georgia, + "Times New Roman", + serif; + --winter-font-sans: + "Nunito Sans", + system-ui, + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + Roboto, + Oxygen, + Ubuntu, + Cantarell, + "Open Sans", + "Helvetica Neue", + sans-serif; + --winter-font-mono: + "IBM Plex Mono", + ui-monospace, + SFMono-Regular, + SF Mono, + Menlo, + Consolas, + Liberation Mono, + monospace; + --winter-font-decorative: "Space Grotesk", system-ui; + --winter-font-size-base: 20px; + --winter-font-size-xxs: 0.625rem; + --winter-font-size-xs: 0.75rem; + --winter-font-size-s: 0.875rem; + --winter-font-size-m: 1rem; + --winter-font-size-l: 1.25rem; + --winter-font-size-xl: 1.5rem; + --winter-font-size-xxl: 1.75rem; + --winter-font-size-xxxl: 2rem; + --winter-font-size-xxxxl: 2.25rem; + --winter-font-weight-light: 300; + --winter-font-weight-normal: 400; + --winter-font-weight-semibold: 500; + --winter-font-weight-bold: 700; + --winter-letter-spacing-xs: -0.03em; + --winter-letter-spacing-s: -0.015em; + --winter-letter-spacing-m: normal; + --winter-letter-spacing-l: 0.075em; + --winter-letter-spacing-xl: 0.15em; + --winter-line-height-xs: 1; + --winter-line-height-s: 1.25; + --winter-line-height-m: 1.6; + --winter-line-height-l: 1.8; + --winter-line-height-xl: 2.2; + --winter-focus-outline-color: var(--color-not-quite-black); + --winter-focus-outline: 1px solid var(--focus-outline-color); + --winter-focus-outline-offset: 2px; + --winter-bg: var(--winter-white); + --winter-fg: var(--winter-not-quite-black); + --winter-header-font: var(--winter-font-decorative); + --winter-header-font-size: var(--winter-font-size-l); + --winter-header-font-weight: var(--winter-font-weight-normal); + --winter-header-line-height: var(--winter-line-height-m); + --winter-header-icon-size: var(--winter-font-size-xl); + --winter-header-block-spacing-top: 2rem; + --winter-header-block-spacing-bottom: 0rem; + --winter-header-bg: transparent; + --winter-header-fg: var(--winter-purple-1); + --winter-header-accent: var(--winter-teal-1); + --winter-header-divider: 0.15rem solid var(--winter-header-fg); + --winter-header-name-font-size: var(--winter-font-size-xxxxl); + --winter-header-name-font-weight: var(--winter-font-weight-bold); + --winter-footer-font: var(--winter-font-decorative); + --winter-footer-font-size: var(--winter-font-size-xs); + --winter-footer-font-weight: var(--winter-font-weight-normal); + --winter-footer-line-height: var(--winter-line-height-s); + --winter-footer-block-spacing-top: 2rem; + --winter-footer-block-spacing-bottom: 3rem; + --winter-footer-fg: var(--winter-purple-1); + --winter-footer-accent: var(--winter-teal-1); + --winter-footer-divider: 0.15rem solid var(--winter-footer-fg); + --winter-heading-spacing: var(--winter-spacing-xxl); + --winter-heading-fg: var(--winter-purple-1); + --winter-heading-font: var(--winter-font-decorative); + --winter-heading-font-weight: var(--winter-font-weight-semibold); + --winter-heading-line-height: var(--winter-line-height-s); + --winter-heading-link-fg: var(--winter-teal-4); + --winter-link-fg: var(--color-mint-600); + --winter-link-bg: transparent; + --winter-link-decoration: underline; + --winter-link-hover-fg: var(--color-pink-600); + --winter-link-hover-bg: transparent; + --winter-link-hover-decoration: underline; + --winter-code-font-size: 85%; + --winter-code-padding: 0.12em 0.5em; + --winter-code-fg: var(--winter-white); + --winter-code-bg: var(--winter-not-quite-black); + --winter-code-border-radius: var(--winter-border-radius-s); + --winter-code-shadow: var(--winter-shadow-s); + --winter-kbd-font: var(--winter-font-mono); + --winter-kbd-font-size: 90%; + --winter-kbd-font-weight: var(--winter-font-weight-semibold); + --winter-kbd-font-style: italic; + --winter-kbd-padding: 0.12em 0.5em 0.12em 0.4em; + --winter-kbd-fg: var(--winter-white); + --winter-kbd-bg: var(--color-purple-600); + --winter-kbd-combinator-fg: var(--color-gray-600); + --winter-kbd-border-radius: var(--winter-border-radius-s); + --winter-kbd-shadow: var(--winter-shadow-s); + --winter-mark-fg: inherit; + --winter-mark-bg: var(--color-yellow-100); + --winter-abbr-border: 0.1em dashed color-mix(in srgb, currentColor 40%, white); + --winter-block-spacing: var(--winter-spacing-l); + --winter-pre-font-size: var(--winter-font-size-m); + --winter-pre-line-height: var(--winter-line-height-s); + --winter-pre-padding: 1rem; + --winter-pre-fg: var(--winter-white); + --winter-pre-bg: var(--winter-not-quite-black); + --winter-pre-scrollbar: var(--color-gray-500); + --winter-pre-scrollbar-hover: var(--winter-purple-3); + --winter-list-indent: var(--winter-spacing-m); + --winter-list-spacing: var(--winter-spacing-xxs); + --winter-desc-list-block-spacing: var(--winter-spacing-m); + --winter-desc-list-padding: var(--winter-spacing-s); + --winter-desc-term-font: var(--winter-font-decorative); + --winter-desc-term-font-size: var(--winter-font-size-l); + --winter-desc-term-fg: var(--winter-teal-1); + --winter-table-font-size: var(--winter-font-size-m); + --winter-table-border: var(--color-purple-200); + --winter-table-heading-border: var(--winter-purple-2); + --winter-table-padding: var(--winter-spacing-xxs) var(--winter-spacing-xs); + --winter-table-striped-bg: var(--color-purple-50); + --winter-table-hover-bg: var(--color-purple-100); + --winter-blockquote-padding: var(--winter-spacing-m); + --winter-blockquote-font: var(--winter-font-serif); + --winter-blockquote-font-size: var(--winter-font-size-m); + --winter-blockquote-fg: var(--winter-not-quite-black); + --winter-blockquote-bg: var(--color-white); + --winter-hr-border-color: var(--winter-purple-3); + --winter-hr-border: 0.15rem solid var(--winter-hr-border-color); + --winter-admonition-font: var(--winter-font-serif); + --winter-admonition-font-size: var(--winter-font-size-m); + --winter-admonition-fg: var(--winter-fg); + --winter-admonition-bg: var(--winter-bg); + --winter-admonition-accent: var(--winter-teal-1); + --winter-admonition-icon: "info"; + --winter-admonition-padding: var(--winter-spacing-xs) var(--winter-spacing-s); + --winter-admonition-title-font: var(--winter-font-decorative); + --winter-admonition-title-font-size: var(--winter-font-size-l); + --winter-admonition-body-spacing: var(--winter-spacing-s); + --winter-admonition-note-accent: var(--winter-teal-1); + --winter-admonition-note-fg: var(--winter-admonition-fg); + --winter-admonition-note-bg: var(--winter-admonition-bg); + --winter-admonition-note-icon: "stylus"; + --winter-admonition-info-accent: var(--winter-teal-2); + --winter-admonition-info-fg: var(--winter-admonition-fg); + --winter-admonition-info-bg: var(--winter-admonition-bg); + --winter-admonition-info-icon: "info"; + --winter-admonition-tip-accent: var(--winter-teal-2); + --winter-admonition-tip-fg: var(--winter-admonition-fg); + --winter-admonition-tip-bg: var(--winter-admonition-bg); + --winter-admonition-tip-icon: "lightbulb"; + --winter-admonition-success-accent: var(--color-green-400); + --winter-admonition-success-fg: var(--winter-admonition-fg); + --winter-admonition-success-bg: var(--winter-admonition-bg); + --winter-admonition-success-icon: "check"; + --winter-admonition-question-accent: var(--color-mint-400); + --winter-admonition-question-fg: var(--winter-admonition-fg); + --winter-admonition-question-bg: var(--winter-admonition-bg); + --winter-admonition-question-icon: "help"; + --winter-admonition-warning-accent: var(--color-yellow-300); + --winter-admonition-warning-fg: var(--winter-admonition-fg); + --winter-admonition-warning-bg: var(--winter-admonition-bg); + --winter-admonition-warning-icon: "warning"; + --winter-admonition-failure-accent: var(--color-red-500); + --winter-admonition-failure-fg: var(--winter-admonition-fg); + --winter-admonition-failure-bg: var(--winter-admonition-bg); + --winter-admonition-failure-icon: "close"; + --winter-admonition-danger-accent: var(--color-red-600); + --winter-admonition-danger-fg: var(--winter-admonition-fg); + --winter-admonition-danger-bg: var(--winter-admonition-bg); + --winter-admonition-danger-icon: "report"; + --winter-admonition-bug-accent: var(--color-violet-500); + --winter-admonition-bug-fg: var(--winter-admonition-fg); + --winter-admonition-bug-bg: var(--winter-admonition-bg); + --winter-admonition-bug-icon: "bug_report"; + --winter-admonition-example-accent: var(--color-purple-500); + --winter-admonition-example-fg: var(--winter-admonition-fg); + --winter-admonition-example-bg: var(--winter-admonition-bg); + --winter-admonition-example-icon: "developer_guide"; + --winter-admonition-quote-accent: var(--color-gray-600); + --winter-admonition-quote-fg: var(--winter-admonition-fg); + --winter-admonition-quote-bg: var(--winter-admonition-bg); + --winter-admonition-quote-icon: "format_quote"; + --winter-admonition-fairy-accent: var(--color-pink-500); + --winter-admonition-fairy-fg: var(--winter-admonition-fg); + --winter-admonition-fairy-bg: var(--winter-admonition-bg); + --winter-admonition-fairy-icon: "\1f9da"; + --winter-footnote-font-size: var(--winter-font-size-s); + --winter-footnote-fg: var(--color-gray-700); + --winter-footnote-divider-color: var(--color-gray-200); + --winter-footnote-divider: 0.1rem solid var(--winter-footnote-divider-color); +} +@media screen { + html.dark { + --winter-near-black: color-mix( in srgb, var(--color-purple-900) 30%, var(--winter-bg) ); + --winter-bg: var(--winter-black); + --winter-fg: var(--winter-white); + --winter-header-fg: var(--winter-purple-3); + --winter-header-accent: var(--winter-teal-3); + --winter-footer-fg: var(--winter-purple-3); + --winter-heading-fg: var(--winter-purple-3); + --winter-heading-link-fg: var(--winter-teal-1); + --winter-link-fg: var(--color-mint-300); + --winter-link-hover-fg: var(--color-pink-300); + --winter-code-fg: var(--winter-white); + --winter-code-bg: var(--winter-not-quite-black); + --winter-kbd-fg: var(--winter-white); + --winter-kbd-bg: var(--color-purple-600); + --winter-kbd-combinator-fg: var(--color-gray-600); + --winter-mark-fg: inherit; + --winter-mark-bg: var(--color-yellow-600); + --winter-pre-fg: var(--winter-white); + --winter-pre-bg: var(--winter-not-quite-black); + --winter-desc-term-fg: var(--winter-teal-1); + --winter-table-border: var(--color-purple-900); + --winter-table-heading-border: var(--color-purple-400); + --winter-table-striped-bg: var(--winter-near-black); + --winter-table-hover-bg: var(--color-purple-900); + --winter-blockquote-fg: var(--color-purple-200); + --winter-blockquote-bg: var(--winter-near-black); + --winter-hr-border-color: var(--color-purple-900); + --winter-desc-term-fg: var(--winter-teal-4); + --winter-admonition-fg: var(--winter-fg); + --winter-admonition-bg: var(--winter-near-black); + --winter-admonition-accent: var(--winter-teal-3); + --winter-admonition-note-accent: var(--winter-teal-3); + --winter-admonition-info-accent: var(--winter-teal-4); + --winter-admonition-tip-accent: var(--winter-teal-4); + --winter-admonition-success-accent: var(--color-green-300); + --winter-admonition-question-accent: var(--color-mint-300); + --winter-admonition-warning-accent: var(--color-yellow-200); + --winter-admonition-failure-accent: var(--color-red-400); + --winter-admonition-danger-accent: var(--color-red-500); + --winter-admonition-bug-accent: var(--color-violet-400); + --winter-admonition-example-accent: var(--color-purple-500); + --winter-admonition-quote-accent: var(--color-gray-400); + --winter-admonition-fairy-accent: var(--color-pink-400); + --winter-admonition-fairy-icon: "\1f9da"; + --winter-footnote-fg: var(--color-gray-500); + --winter-footnote-divider-color: var(--color-gray-900); + } +} + +/* src/styles/globals.css */ +.hidden, +[hidden] { + display: none !important; +} + +/* src/styles/layout.css */ +body { + width: 100%; + margin: 0; + overflow-x: hidden; +} +body :is(header, main, footer) { + display: block; + width: 100%; + max-width: 980px; + margin-right: auto; + margin-left: auto; +} + +/* src/styles/nav.css */ +header { + padding-top: var(--winter-header-block-spacing-top); + margin-bottom: var(--winter-header-block-spacing-bottom); + font-family: var(--winter-header-font); + font-size: var(--winter-header-font-size); + font-weight: var(--winter-header-font-weight); + line-height: var(--winter-header-line-height); + color: var(--winter-header-fg); + background: var(--winter-header-bg); +} +header > nav:first-of-type { + font-size: var(--winter-header-name-font-size); + font-weight: var(--winter-header-name-font-weight); + border-bottom: var(--winter-header-divider); +} +header > nav:first-of-type ul a { + margin-bottom: -0.25lh; + --outline-color: var(--winter-bg); + --outline-size: 0.15em; + text-shadow: + calc(var(--outline-size) * -1) 0px 0px var(--outline-color), + calc(var(--outline-size) * -0.5) 0px 0px var(--outline-color), + calc(var(--outline-size) * 0.5) 0px 0px var(--outline-color), + var(--outline-size) 0px 0px var(--outline-color); +} +header > nav:first-of-type ul img.logo { + margin-bottom: -0.15lh; + height: 0.5lh; + width: auto; +} +header > nav:first-of-type :is(a, [role=link]) { + color: var(--winter-header-fg); + display: inline-block; + text-decoration: none; +} +header > nav:first-of-type :is(a, [role=link]):hover { + text-decoration: none; +} +nav { + display: flex; + justify-content: space-between; +} +nav ul { + display: flex; + align-items: center; + margin-block: 0; + padding: 0; + list-style: none; +} +nav li { + display: flex; + align-items: center; +} +nav :is(a, [role=link]) { + color: var(--winter-header-fg); + background: var(--winter-header-bg); + display: inline-block; + text-decoration: none; +} +nav :is(a, [role=link]):is([aria-current], :hover, :active, :focus) { + color: var(--winter-header-fg); + background: var(--winter-header-bg); + text-decoration: underline; + text-decoration-thickness: 0.08em; +} +nav ul.has-dividers li:not(:first-child) { + margin-inline-start: 1.2em; +} +nav ul.has-dividers li:not(:last-child) a::after { + color: var(--winter-header-fg); + position: absolute; + margin-inline-start: 0.4em; + content: "/"; + text-align: center; + pointer-events: none; +} +nav :is(winter-icon, winter-dark-mode) { + font-size: var(--winter-header-icon-size); +} +nav winter-dark-mode:hover { + color: var(--winter-header-accent); +} + +/* src/styles/footer.css */ +body > footer { + margin-top: var(--winter-footer-block-spacing-top); + padding-top: 0.5em; + padding-bottom: var(--winter-footer-block-spacing-bottom); + font-family: var(--winter-footer-font); + font-size: var(--winter-footer-font-size); + font-weight: var(--winter-footer-font-weight); + line-height: var(--winter-footer-line-height); + color: var(--winter-footer-fg); + background: var(--winter-footer-bg); + border-top: var(--winter-footer-divider); + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: flex-start; +} +body > footer ul { + display: flex; + flex-direction: column; + align-items: center; + margin-block: 0; + padding: 0; + list-style: none; +} +body > footer ul:first-child { + align-items: flex-start; +} +body > footer ul:last-child { + align-items: flex-end; +} +body > footer :is(a, [role=link]) { + color: var(--winter-footer-fg); + background: transparent; + display: inline-block; + text-decoration: none; +} +body > footer :is(a, [role=link]):is([aria-current], :hover, :active, :focus) { + color: var(--winter-footer-fg); + background: transparent; + text-decoration: underline; + text-decoration-thickness: 0.08em; +} + +/* src/styles/content.css */ +html, +body { + font-family: var(--winter-font-serif); + font-size: var(--winter-font-size-base); + font-weight: var(--winter-font-weight-normal); + font-feature-settings: "kern", "liga"; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + letter-spacing: var(--winter-letter-spacing-normal); + line-height: var(--winter-line-height-m); +} +body { + color: var(--winter-fg); + background: var(--winter-bg); +} +main :is(h1, h2, h3, h4, h5, h6) { + display: block flow-root; + width: 100%; + position: relative; + font-family: var(--winter-heading-font); + font-weight: var(--winter-heading-font-weight); + line-height: var(--winter-heading-line-height); + color: var(--winter-heading-fg); +} +main :is(h1, h2, h3, h4, h5, h6):not(:first-child) { + margin-block-start: var(--winter-heading-spacing); +} +main :is(h1, h2, h3, h4, h5, h6) .headerlink { + position: absolute; + top: 0; + left: -1.25ch; + height: 100%; + display: inline-flex; + align-items: center; + color: var(--winter-heading-link-fg); + text-decoration: none; + font-size: 75%; +} +main :is(h1, h2, h3, h4, h5, h6) .headerlink:is([aria-current], :hover, :active, :focus) { + text-decoration: none; +} +main h1 { + font-size: var(--winter-font-size-xxxl); +} +main h2 { + font-size: var(--winter-font-size-xxxl); +} +main h3 { + font-size: var(--winter-font-size-xxl); +} +main h4 { + font-size: var(--winter-font-size-xl); +} +main h5 { + font-size: var(--winter-font-size-l); +} +main h6 { + font-size: var(--winter-font-size-l); +} +main :is(h2 + :is(h2, h3, h4, h5, h6), h3 + :is(h3, h4, h5, h6), h4 + :is(h4, h5, h6), h5 + :is(h5, h6), h6 + :is(h6)) { + margin-block-start: 0; +} +main :is(h2 + :is(h2, h3, h4, h5, h6), h3 + :is(h3, h4, h5, h6), h4 + :is(h4, h5, h6), h5 + :is(h5, h6), h6 + :is(h6)):not(:first-child) { + margin-block-start: 0; +} +main.hide-title h1 { + display: none; +} +main :is(p, ol, ul, pre, blockquote, figure, hr, dl) { + margin-block: var(--winter-block-spacing); +} +main :is(ol, ul) { + padding: 0; + margin-inline-start: var(--winter-list-indent); +} +main :is(ol, ul):not([hidden]) { + display: flow-root; +} +main :is(ol, ul) ol { + list-style-type: lower-alpha; +} +main :is(ol, ul) ol ol { + list-style-type: lower-roman; +} +main :is(ol, ul) li { + margin-inline-start: var(--winter-list-indent); + margin-bottom: var(--winter-list-spacing); +} +main :is(ol, ul) li:last-child { + margin-bottom: 0; +} +main :is(ol, ul) li :is(ul, ol) { + margin-block: var(--winter-list-spacing); +} +main code { + font-family: var(--winter-font-mono); + font-size: var(--winter-code-font-size); + color: var(--winter-code-fg); + background: var(--winter-code-bg); + padding: var(--winter-code-padding); + border: 1px solid transparent; + border-radius: var(--winter-code-border-radius); + box-shadow: var(--winter-code-shadow); + word-break: break-word; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; +} +main pre { + -webkit-overflow-scrolling: touch; + white-space: pre; + word-wrap: normal; + overflow-x: auto; + font-family: var(--winter-font-mono); + font-size: var(--winter-pre-font-size); + line-height: var(--winter-pre-line-height); + color: var(--winter-pre-fg); + background: var(--winter-pre-bg); + padding: var(--winter-pre-padding); + box-shadow: var(--winter-code-shadow); + scrollbar-width: thin; + scrollbar-color: var(--winter-pre-scrollbar) transparent; +} +main pre code { + font-size: 1em; + color: currentColor; + padding: 0; + background: transparent; + border: none; +} +main pre:hover { + scrollbar-color: var(--winter-pre-scrollbar-hover) transparent; +} +main pre:hover::-webkit-scrollbar-thumb { + background-color: var(--winter-pre-scrollbar-hover); +} +main pre::-webkit-scrollbar { + width: 0.25rem; + height: 0.25rem; +} +main pre::-webkit-scrollbar-thumb { + background-color: var(--winter-pre-scrollbar); +} +main blockquote { + font-family: var(--winter-blockquote-font); + font-size: var(--winter-blockquote-font-size); + color: var(--winter-blockquote-fg); + background: var(--winter-blockquote-bg); + border-inline-start: 0.15rem solid var(--winter-blockquote-fg); + padding: var(--winter-blockquote-padding); + box-shadow: var(--winter-shadow-s); +} +main blockquote p:first-child { + margin-block-start: 0; +} +main blockquote p:last-child { + margin-block-end: 0; +} +main hr { + display: flow-root; + border: none; + border-bottom: var(--winter-hr-border); +} +main dl dt { + margin-block-start: var(--winter-desc-list-block-spacing); + font-family: var(--winter-desc-term-font); + font-size: var(--winter-desc-term-font-size); + color: var(--winter-desc-term-fg); + border-left: 0.15rem solid var(--winter-desc-term-fg); + padding-inline: var(--winter-desc-list-padding); +} +main dl dd { + border-left: 0.15rem solid var(--winter-desc-term-fg); + padding-inline: var(--winter-desc-list-padding); + padding-block-end: 0; +} +main :is(a, [role=link]) { + color: var(--winter-link-fg); + background: var(--winter-link-bg); + text-decoration: var(--winter-link-decoration); +} +main :is(a, [role=link]):is([aria-current], :hover, :active, :focus) { + color: var(--winter-link-hover-fg); + background: var(--winter-link-hover-bg); + text-decoration: var(--winter-link-hover-decoration); +} +main mark { + color: var(--winter-mark-fg); + background-color: var(--winter-mark-bg); + word-break: break-word; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; +} +main small { + font-size: 0.8em; + line-height: inherit; +} +main :is(sub, sup) { + position: relative; + font-size: 0.8em; + line-height: 0; + vertical-align: baseline; +} +main sub { + bottom: -0.25em; +} +main sup { + top: -0.5em; +} +main abbr { + text-decoration: none; + cursor: help; + border-bottom: var(--winter-abbr-border); +} +main kbd { + font-family: var(--winter-kbd-font); + font-size: var(--winter-kbd-font-size); + font-style: var(--winter-kbd-font-style); + font-weight: var(--winter-kbd-font-weight); + color: var(--winter-kbd-fg); + background: var(--winter-kbd-bg); + padding: var(--winter-kbd-padding); + border-radius: var(--winter-kbd-border-radius); + box-shadow: var(--winter-kbd-shadow); + border: 1px solid transparent; + word-break: break-word; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; +} +main :is(img, svg, video, canvas, audio, object) { + margin-block: var(--winter-block-spacing); + margin-inline: auto; + max-width: 100%; + height: auto; + box-shadow: var(--winter-shadow-s); +} +main img.inline { + float: unset; + display: inline; + margin: 0.5em; + vertical-align: middle; +} +main img[align] { + margin: 1em; + max-width: 50%; +} +main img[align=left] { + margin-left: 0; +} +main img[align=right] { + margin-right: 0; +} +main img.small { + max-width: 10%; +} +main img.quarter { + max-width: 25%; +} +main img.half { + max-width: 50%; +} +main img[src$=".svg"] { + box-shadow: none; +} +main svg { + box-shadow: none; +} +.dark main img[src$=".svg"]:not(.no-invert) { + filter: invert(1) hue-rotate(180deg); +} +main table { + margin-block: var(--winter-block-spacing); + max-width: 100%; + overflow: auto; + border-collapse: collapse; + border-spacing: 0; + font-size: var(--winter-table-font-size); + border-color: var(--winter-table-border); + border-style: solid; + border-width: 0; +} +main table tr { + border-color: inherit; + border-style: inherit; + border-width: 0; +} +main table tr:nth-child(2n) { + background: var(--winter-table-striped-bg); +} +main table tr:is(:hover, [aria-selected]) { + background: var(--winter-table-hover-bg); +} +main table :is(th, td) { + border-color: inherit; + border-style: inherit; + padding: var(--winter-table-padding); + background: transparent; + min-width: 8rem; +} +main table :is(th, td):not([align]) { + text-align: left; +} +main table th { + border-width: 0 0 2px; +} +main table td { + border-width: 0 0 1px; +} +main table :is(thead, tbody) { + border-color: inherit; + border-style: inherit; + border-width: 0; +} +main table thead { + border-color: var(--winter-table-heading-border); +} +main div:has(> table.is-page-width) { + position: relative; + width: 100svw; + max-width: 100svw; + margin-inline: -50svw; + left: 50%; + right: 50%; + overflow-x: auto; + overflow-y: hidden; + padding: 0; + padding-inline: 1rem; + margin-block: var(--winter-block-spacing); +} +main table.is-page-width { + margin: 0; + padding: 0; + max-width: unset; +} +main table.is-high-density { + white-space: wrap; + font-family: var(--winter-font-mono); + font-size: var(--winter-font-size-xs); + padding: 0.25em 0.5em; +} +main table.is-high-density :is(th, td) { + width: fit-content; + min-width: 100px; +} +main .inline { + float: inline-start; + width: 40%; + margin-inline-end: var(--winter-block-spacing); + margin-top: 0; +} +main .inline.end { + float: inline-end; + margin-inline: var(--winter-block-spacing); +} + +/* src/styles/admonitions.css */ +.admonition { + --fg: var(--winter-admonition-fg); + --bg: var(--winter-admonition-bg); + --accent: var(--winter-admonition-accent); + --icon: var(--winter-admonition-icon); + display: flow-root; + margin-block: var(--winter-block-spacing); + padding: var(--winter-admonition-padding); + font-family: var(--winter-admonition-font); + font-size: var(--winter-admonition-font-size); + border-inline-start: 0.15rem solid var(--accent); + color: var(--fg); + background: var(--bg); + page-break-inside: avoid; + box-shadow: var(--winter-shadow-s); +} +.admonition .admonition-title { + color: var(--accent); + display: flex; + align-items: center; + height: 1lh; + font-family: var(--winter-admonition-title-font); + font-size: var(--winter-admonition-title-font-size); + white-space: pre-wrap; + margin-block: 0; +} +.admonition .admonition-title::before { + content: var(--icon); + display: inline-flex; + align-items: center; + padding-inline-end: 0.15ch; + font-family: "Material Symbols Outlined"; + font-weight: normal; + font-style: normal; + font-size: inherit; + letter-spacing: normal; + text-transform: none; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-feature-settings: "liga"; + -moz-font-feature-settings: "liga"; + font-feature-settings: "liga"; + -webkit-font-smoothing: antialiased; + user-select: none; +} +.admonition .admonition-title abbr { + border-bottom: none; +} +.admonition p { + margin-block: var(--winter-admonition-body-spacing); +} +.admonition p:last-child { + margin-block-end: 0; +} +.admonition.note { + --fg: var(--winter-admonition-note-fg, var(--winter-admonition-fg)); + --bg: var(--winter-admonition-note-bg, var(--winter-admonition-bg)); + --accent: var( --winter-admonition-note-accent, var(--winter-admonition-accent) ); + --icon: var( --winter-admonition-note-icon, var(--winter-admonition-icon) ); +} +.admonition.info { + --fg: var(--winter-admonition-info-fg, var(--winter-admonition-fg)); + --bg: var(--winter-admonition-info-bg, var(--winter-admonition-bg)); + --accent: var( --winter-admonition-info-accent, var(--winter-admonition-accent) ); + --icon: var( --winter-admonition-info-icon, var(--winter-admonition-icon) ); +} +.admonition.tip { + --fg: var(--winter-admonition-tip-fg, var(--winter-admonition-fg)); + --bg: var(--winter-admonition-tip-bg, var(--winter-admonition-bg)); + --accent: var( --winter-admonition-tip-accent, var(--winter-admonition-accent) ); + --icon: var( --winter-admonition-tip-icon, var(--winter-admonition-icon) ); +} +.admonition.success { + --fg: var(--winter-admonition-success-fg, var(--winter-admonition-fg)); + --bg: var(--winter-admonition-success-bg, var(--winter-admonition-bg)); + --accent: var( --winter-admonition-success-accent, var(--winter-admonition-accent) ); + --icon: var( --winter-admonition-success-icon, var(--winter-admonition-icon) ); +} +.admonition.question { + --fg: var(--winter-admonition-question-fg, var(--winter-admonition-fg)); + --bg: var(--winter-admonition-question-bg, var(--winter-admonition-bg)); + --accent: var( --winter-admonition-question-accent, var(--winter-admonition-accent) ); + --icon: var( --winter-admonition-question-icon, var(--winter-admonition-icon) ); +} +.admonition.warning { + --fg: var(--winter-admonition-warning-fg, var(--winter-admonition-fg)); + --bg: var(--winter-admonition-warning-bg, var(--winter-admonition-bg)); + --accent: var( --winter-admonition-warning-accent, var(--winter-admonition-accent) ); + --icon: var( --winter-admonition-warning-icon, var(--winter-admonition-icon) ); +} +.admonition.failure { + --fg: var(--winter-admonition-failure-fg, var(--winter-admonition-fg)); + --bg: var(--winter-admonition-failure-bg, var(--winter-admonition-bg)); + --accent: var( --winter-admonition-failure-accent, var(--winter-admonition-accent) ); + --icon: var( --winter-admonition-failure-icon, var(--winter-admonition-icon) ); +} +.admonition.danger { + --fg: var(--winter-admonition-danger-fg, var(--winter-admonition-fg)); + --bg: var(--winter-admonition-danger-bg, var(--winter-admonition-bg)); + --accent: var( --winter-admonition-danger-accent, var(--winter-admonition-accent) ); + --icon: var( --winter-admonition-danger-icon, var(--winter-admonition-icon) ); +} +.admonition.bug { + --fg: var(--winter-admonition-bug-fg, var(--winter-admonition-fg)); + --bg: var(--winter-admonition-bug-bg, var(--winter-admonition-bg)); + --accent: var( --winter-admonition-bug-accent, var(--winter-admonition-accent) ); + --icon: var( --winter-admonition-bug-icon, var(--winter-admonition-icon) ); +} +.admonition.example { + --fg: var(--winter-admonition-example-fg, var(--winter-admonition-fg)); + --bg: var(--winter-admonition-example-bg, var(--winter-admonition-bg)); + --accent: var( --winter-admonition-example-accent, var(--winter-admonition-accent) ); + --icon: var( --winter-admonition-example-icon, var(--winter-admonition-icon) ); +} +.admonition.quote { + --fg: var(--winter-admonition-quote-fg, var(--winter-admonition-fg)); + --bg: var(--winter-admonition-quote-bg, var(--winter-admonition-bg)); + --accent: var( --winter-admonition-quote-accent, var(--winter-admonition-accent) ); + --icon: var( --winter-admonition-quote-icon, var(--winter-admonition-icon) ); +} +.admonition.fairy { + --fg: var(--winter-admonition-fairy-fg, var(--winter-admonition-fg)); + --bg: var(--winter-admonition-fairy-bg, var(--winter-admonition-bg)); + --accent: var( --winter-admonition-fairy-accent, var(--winter-admonition-accent) ); + --icon: var( --winter-admonition-fairy-icon, var(--winter-admonition-icon) ); +} + +/* src/styles/footnotes.css */ +.footnote-ref { + text-decoration: none; +} +.footnote-backref { + text-decoration: none; +} +.footnote { + font-size: var(--winter-footnote-font-size); + color: var(--winter-footnote-fg); +} +.footnote hr { + border-bottom: var(--winter-footnote-divider); +} +.footnote > ol { + margin-inline-start: 0; +} +.footnote > ol > li:first-child p { + margin-block-start: 0; +} + +/* src/styles/keys.css */ +main .keys span { + margin-inline: 0.1em; + color: var(--winter-kbd-combinator-fg); +} +main .keys kbd::before, +main .keys kbd::after { + font-family: var(--winter-font-sans); + display: inline-flex; + align-items: center; + justify-content: center; + width: 1em; + user-select: none; +} +main .keys kbd::before { + margin-right: 0.25ch; +} +main .keys kbd::after { + margin-left: 0.25ch; +} +main .keys :is(.key-alt, .key-left-alt, .key-right-alt)::before { + content: "\2387"; +} +main .keys :is(.key-command, .key-left-command, .key-right-command)::before { + content: "\2318"; +} +main .keys :is(.key-control, .key-left-control, .key-right-control)::before { + content: "\2303"; +} +main .keys :is(.key-meta, .key-left-meta, .key-right-meta)::before { + content: "\25c6"; +} +main .keys :is(.key-option, .key-left-option, .key-right-option)::before { + content: "\2325"; +} +main .keys :is(.key-shift, .key-left-shift, .key-right-shift)::before { + content: "\21e7"; +} +main .keys :is(.key-super, .key-left-super, .key-right-super)::before { + content: "\2756"; +} +main .keys :is(.key-windows, .key-left-windows, .key-right-windows)::before { + content: "\229e"; +} +main .keys .key-arrow-left::before { + content: "\2190"; +} +main .keys .key-arrow-right::before { + content: "\2192"; +} +main .keys .key-arrow-up::before { + content: "\2191"; +} +main .keys .key-arrow-down::before { + content: "\2193"; +} +main .keys .key-backspace::before { + content: "\232b"; +} +main .keys .key-backtab::before { + content: "\21e4"; +} +main .keys .key-caps-lock::before { + content: "\21ea"; +} +main .keys .key-clear::before { + content: "\2327"; +} +main .keys .key-context-menu::before { + content: "\2630"; +} +main .keys .key-delete::before { + content: "\2326"; +} +main .keys .key-eject::before { + content: "\23cf"; +} +main .keys .key-end::before { + content: "\2913"; +} +main .keys .key-escape::before { + content: "\238b"; +} +main .keys .key-home::before { + content: "\2912"; +} +main .keys .key-insert::before { + content: "\2380"; +} +main .keys .key-page-down::before { + content: "\21df"; +} +main .keys .key-page-up::before { + content: "\21de"; +} +main .keys .key-print-screen::before { + content: "\2399"; +} +main .keys .key-tab::after { + content: "\21e5"; +} +main .keys .key-enter::after { + content: "\23ce"; +} +main .keys .key-num-enter::after { + content: "\2324"; +} + +/* src/styles/components.css */ +main :is(winter-audio-player, winter-carousel, winter-image-map) { + --elevation-shadow: var(--winter-shadow-s); +} +main winter-audio-player { + width: 640px; + max-width: 80%; + margin: 2em auto; +} +main winter-carousel img { + margin: 0; +} +main winter-pcb-assembly canvas { + border-radius: 10px; +} +main winter-pcb-assembly canvas.back { + transform: scaleX(-1); +} +main winter-pcb-assembly table.bom-table { + width: 100%; +} +main winter-pcb-assembly table.bom-table :is(th:first-child, td:first-child) { + min-width: unset; + width: 2rem; + white-space: nowrap; +} + +/* src/styles/responsive.css */ +@media screen and (max-width: 980px) { + body { + padding-inline: var(--winter-spacing-xs); + } + body > header { + padding-top: 0.5rem; + border-bottom: var(--winter-header-divider); + } + body > header nav:first-of-type ul img.logo { + display: none; + } + body > header nav ul.has-dividers { + flex-direction: column; + align-items: flex-start; + } + body > header nav ul.has-dividers :is(li, li:not(:last-child)) { + margin-inline-start: 0; + } + body > header nav ul.has-dividers :is(li, li:not(:last-child)) a::after { + content: ""; + } + body > header nav ul:last-child { + align-items: flex-start; + } + body > footer { + flex-direction: column; + align-items: center; + } + body > footer :is(ul, ul:first-child) { + align-items: center; + } + main :is(h1, h2, h3, h4, h5, h6) .headerlink { + display: none; + } + main winter-audio-player { + max-width: 100%; + } +} + +/* src/styles/index.css */ +/*# sourceMappingURL=winter.css.map */ diff --git a/winter.css.map b/winter.css.map new file mode 100644 index 0000000..26096d4 --- /dev/null +++ b/winter.css.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/styles/reset.css", "../src/styles/colors.css", "../src/styles/tokens.css", "../src/styles/globals.css", "../src/styles/layout.css", "../src/styles/nav.css", "../src/styles/footer.css", "../src/styles/content.css", "../src/styles/admonitions.css", "../src/styles/footnotes.css", "../src/styles/keys.css", "../src/styles/components.css", "../src/styles/responsive.css"], + "sourcesContent": ["/*\n Copyright (c) 2024 Winterbloom LLC, Alethea Katherine Flowers\n Published under the standard MIT License.\n Full text available at: https://opensource.org/licenses/MIT\n*/\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n* {\n margin: 0;\n}\n\nbody {\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n text-rendering: optimizeLegibility;\n -webkit-text-size-adjust: 100%;\n -moz-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n text-size-adjust: 100%;\n}\n\nimg,\npicture,\nvideo,\ncanvas,\nsvg {\n display: block;\n max-width: 100%;\n}\n\ninput,\nbutton,\ntextarea,\nselect {\n font: inherit;\n}\n\np,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n overflow-wrap: break-word;\n}\n\n#root,\n#__next {\n isolation: isolate;\n}\n", "/*\n Copyright (c) 2024 Winterbloom LLC, Alethea Katherine Flowers\n Published under the standard MIT License.\n Full text available at: https://opensource.org/licenses/MIT\n*/\n\n:root {\n --winter-white: #fff;\n --winter-black: #000;\n --winter-not-quite-black: #333;\n --winter-yellow-1: rgb(184, 125, 33);\n --winter-yellow-2: rgb(219, 161, 64);\n --winter-yellow-3: rgb(250, 194, 105);\n --winter-yellow-4: rgb(255, 214, 143);\n --winter-yellow-5: rgb(255, 229, 186);\n --winter-red-1: rgb(191, 36, 54);\n --winter-red-2: rgb(217, 74, 92);\n --winter-red-3: rgb(245, 115, 128);\n --winter-red-4: rgb(250, 153, 163);\n --winter-red-5: rgb(252, 194, 201);\n --winter-teal-1: rgb(38, 120, 128);\n --winter-teal-2: rgb(64, 140, 148);\n --winter-teal-3: rgb(102, 173, 181);\n --winter-teal-4: rgb(153, 209, 214);\n --winter-teal-5: rgb(204, 237, 240);\n --winter-purple-1: rgb(94, 64, 158);\n --winter-purple-2: rgb(125, 97, 186);\n --winter-purple-3: rgb(163, 138, 214);\n --winter-purple-4: rgb(199, 184, 237);\n --winter-purple-5: rgb(235, 227, 250);\n}\n\n/*\nhttps://accessiblepalette.com/?lightness=98.2,93.95,85.1,76.5,67.65,57.8,47.6,40.4,32.4,23.55&gb(245,%20115,%20128)=1,0&f76707=0,12&f1d152=0,7&78ec90=0,0&gb(129,%20255,%20190)=0,5&gb(129,%20238,%20255)=0,0&97d2ff=0,0&ae82ff=0,0&9939b3=1,0&gb(254,%20129,%20173)=0,0&292537=0,0\n\nlet colors = [\"red\", \"orange\", \"yellow\", \"green\", \"mint\", \"cyan\", \"blue\", \"purple\", \"violet\", \"pink\", \"gray\"];\nlet shades = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900];\nlet out = \"\";\n\ndocument.querySelectorAll(\".palette_colors\").forEach((column, n) => {\n column.querySelectorAll(\".hex\").forEach((row, i) => {\n out += `--color-${colors[n]}-${shades[i]}: ${row.innerText};\\n`;\n });\n});\n\nconsole.log(out);\n*/\n\n:root {\n --color-red-50: #fff8f8;\n --color-red-100: #ffe9e9;\n --color-red-200: #ffc7c9;\n --color-red-300: #fea5a9;\n --color-red-400: #f8818b;\n --color-red-500: #d96772;\n --color-red-600: #b0555d;\n --color-red-700: #93494f;\n --color-red-800: #753b40;\n --color-red-900: #542d2f;\n --color-orange-50: #fff9f5;\n --color-orange-100: #fdeadd;\n --color-orange-200: #facca8;\n --color-orange-300: #f6ad72;\n --color-orange-400: #f18c30;\n --color-orange-500: #de6a00;\n --color-orange-600: #b35800;\n --color-orange-700: #964b00;\n --color-orange-800: #773d00;\n --color-orange-900: #582d00;\n --color-yellow-50: #fdfaec;\n --color-yellow-100: #f9eebf;\n --color-yellow-200: #eed45a;\n --color-yellow-300: #d3bd4a;\n --color-yellow-400: #b7a540;\n --color-yellow-500: #9a8c36;\n --color-yellow-600: #7c722c;\n --color-yellow-700: #686025;\n --color-yellow-800: #534d1e;\n --color-yellow-900: #3d3916;\n --color-green-50: #f1fdf3;\n --color-green-100: #cef8d6;\n --color-green-200: #79ec91;\n --color-green-300: #6bd280;\n --color-green-400: #5db770;\n --color-green-500: #4f9b5e;\n --color-green-600: #407e4d;\n --color-green-700: #366a41;\n --color-green-800: #2b5534;\n --color-green-900: #203f26;\n --color-mint-50: #e9fff4;\n --color-mint-100: #abffd6;\n --color-mint-200: #73ebb1;\n --color-mint-300: #65d19e;\n --color-mint-400: #58b68b;\n --color-mint-500: #499a75;\n --color-mint-600: #3b7d60;\n --color-mint-700: #316a51;\n --color-mint-800: #275541;\n --color-mint-900: #1d3e30;\n --color-cyan-50: #eefdff;\n --color-cyan-100: #c2f7ff;\n --color-cyan-200: #7ce4f4;\n --color-cyan-300: #6ecad9;\n --color-cyan-400: #60b1bd;\n --color-cyan-500: #5195a0;\n --color-cyan-600: #427982;\n --color-cyan-700: #37666e;\n --color-cyan-800: #2c5258;\n --color-cyan-900: #213c41;\n --color-blue-50: #f5fbff;\n --color-blue-100: #ddf0ff;\n --color-blue-200: #abdaff;\n --color-blue-300: #8cc3ed;\n --color-blue-400: #7aaacf;\n --color-blue-500: #678fae;\n --color-blue-600: #54758e;\n --color-blue-700: #476278;\n --color-blue-800: #394f60;\n --color-blue-900: #2a3a46;\n --color-purple-50: #fbf9ff;\n --color-purple-100: #f2eaff;\n --color-purple-200: #deccff;\n --color-purple-300: #cbafff;\n --color-purple-400: #b791ff;\n --color-purple-500: #9d75e6;\n --color-purple-600: #8060bc;\n --color-purple-700: #6c519e;\n --color-purple-800: #56417f;\n --color-purple-900: #40305d;\n --color-violet-50: #fcf9fd;\n --color-violet-100: #f5eaf7;\n --color-violet-200: #e7ccec;\n --color-violet-300: #d8afe0;\n --color-violet-400: #c991d5;\n --color-violet-500: #b770c7;\n --color-violet-600: #a34cba;\n --color-violet-700: #9037a8;\n --color-violet-800: #722e85;\n --color-violet-900: #53255f;\n --color-pink-50: #fff8fb;\n --color-pink-100: #ffe8f0;\n --color-pink-200: #ffc5d9;\n --color-pink-300: #fea2c2;\n --color-pink-400: #f77ea8;\n --color-pink-500: #d16a8e;\n --color-pink-600: #aa5674;\n --color-pink-700: #8f4962;\n --color-pink-800: #733a4e;\n --color-pink-900: #552b3a;\n --color-gray-50: #fafafa;\n --color-gray-100: #eeedef;\n --color-gray-200: #d5d4d8;\n --color-gray-300: #bdbcc2;\n --color-gray-400: #a5a4ab;\n --color-gray-500: #8c8a93;\n --color-gray-600: #726f7b;\n --color-gray-700: #615e6b;\n --color-gray-800: #4e4a59;\n --color-gray-900: #3a3647;\n}\n", ":root {\n /* Border radius */\n --winter-border-radius-s: 0.1875rem;\n --winter-border-radius-m: 0.25rem;\n --winter-border-radius-l: 0.5rem;\n --winter-border-radius-xl: 1rem;\n --winter-border-radius-circle: 50%;\n --winter-border-radius-pill: 9999px;\n\n /* Elevation */\n --winter-shadow-color-hsl: 261, 32%, 28%;\n --winter-shadow-xs: 1px 1px 1px 0 hsl(var(--winter-shadow-color-hsl), 0.2),\n 0 0 10px 0 hsl(var(--winter-shadow-color-hsl), 0.1);\n --winter-shadow-s: 3px 3px 2px 0 hsl(var(--winter-shadow-color-hsl), 0.2),\n 0 0 10px 0 hsl(var(--winter-shadow-color-hsl), 0.15);\n --winter-shadow-m: 6px 6px 3px 0 hsl(var(--winter-shadow-color-hsl), 0.3),\n 0 0 10px 0 hsl(var(--winter-shadow-color-hsl), 0.2);\n --winter-shadow-l: 10px 10px 3px 0 hsl(var(--winter-shadow-color-hsl), 0.3),\n 0 0 10px 0 hsl(var(--winter-shadow-color-hsl), 0.2);\n\n /* Generic spacing */\n --winter-spacing-xxxs: 0.125rem;\n --winter-spacing-xxs: 0.25rem;\n --winter-spacing-xs: 0.5rem;\n --winter-spacing-s: 0.75rem;\n --winter-spacing-m: 1rem;\n --winter-spacing-l: 1.25rem;\n --winter-spacing-xl: 1.75rem;\n --winter-spacing-xxl: 2.25rem;\n --winter-spacing-xxxl: 3rem;\n --winter-spacing-xxxxl: 4.5rem;\n\n /* Transitons/duration */\n --winter-duration-xs: 50ms;\n --winter-duration-s: 150ms;\n --winter-duration-m: 250ms;\n --winter-duration-l: 500ms;\n --winter-duration-xl: 1000ms;\n\n /* Typography */\n --winter-font-serif: \"Nunito\", Georgia, \"Times New Roman\", serif;\n --winter-font-sans: \"Nunito Sans\", system-ui, -apple-system,\n BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell,\n \"Open Sans\", \"Helvetica Neue\", sans-serif;\n --winter-font-mono: \"IBM Plex Mono\", ui-monospace, SFMono-Regular, SF Mono,\n Menlo, Consolas, Liberation Mono, monospace;\n --winter-font-decorative: \"Space Grotesk\", system-ui;\n\n --winter-font-size-base: 20px;\n --winter-font-size-xxs: 0.625rem;\n --winter-font-size-xs: 0.75rem;\n --winter-font-size-s: 0.875rem;\n --winter-font-size-m: 1rem;\n --winter-font-size-l: 1.25rem;\n --winter-font-size-xl: 1.5rem;\n --winter-font-size-xxl: 1.75rem;\n --winter-font-size-xxxl: 2rem;\n --winter-font-size-xxxxl: 2.25rem;\n\n --winter-font-weight-light: 300;\n --winter-font-weight-normal: 400;\n --winter-font-weight-semibold: 500;\n --winter-font-weight-bold: 700;\n\n --winter-letter-spacing-xs: -0.03em;\n --winter-letter-spacing-s: -0.015em;\n --winter-letter-spacing-m: normal;\n --winter-letter-spacing-l: 0.075em;\n --winter-letter-spacing-xl: 0.15em;\n\n --winter-line-height-xs: 1;\n --winter-line-height-s: 1.25;\n --winter-line-height-m: 1.6;\n --winter-line-height-l: 1.8;\n --winter-line-height-xl: 2.2;\n\n /* Focus */\n --winter-focus-outline-color: var(--color-not-quite-black);\n --winter-focus-outline: 1px solid var(--focus-outline-color);\n --winter-focus-outline-offset: 2px;\n\n /* Page colors */\n --winter-bg: var(--winter-white);\n --winter-fg: var(--winter-not-quite-black);\n\n /*
and