From 548d4b3034e38cc2a5fdd9a0566e34724fd413d2 Mon Sep 17 00:00:00 2001 From: Jay Liu Date: Sat, 30 Sep 2017 14:10:20 -0400 Subject: [PATCH] Release 0.3 --- app/index.pug | 2 +- app/pages/dynamic-macros.pug | 2 +- docs/index.html | 47 ++++++++++++++++++++++++++++++++---- docs/styles/app.css | 2 +- 4 files changed, 45 insertions(+), 8 deletions(-) diff --git a/app/index.pug b/app/index.pug index 3bfb1f4..142eb2a 100644 --- a/app/index.pug +++ b/app/index.pug @@ -1,5 +1,5 @@ doctype html -- var version = 0.21 +- var version = 0.3 html(lang="en") head title QMK Firmware Cheatsheet #{version} diff --git a/app/pages/dynamic-macros.pug b/app/pages/dynamic-macros.pug index 70ef06a..3012416 100644 --- a/app/pages/dynamic-macros.pug +++ b/app/pages/dynamic-macros.pug @@ -4,7 +4,7 @@ section +section-head('Dynamic Macros', 'dynamic-macros', 'https://docs.qmk.fm/dynamic_macros.html') .intro - p Record and play keystrokes + p Record and play back sequences of keystrokes. #[strong Note: macros are not kept in memory after the keyboard is unplugged.] .block h3 Step 1: Setup diff --git a/docs/index.html b/docs/index.html index 49a592f..21291d4 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,4 +1,4 @@ -QMK Firmware Cheatsheet 0.21

QMK Firmware

    Up to 32 layers
    Modifiers
    Macros
    Dynamic Macros
    Tap Dance
    Leader Key
    Mouse Keys

Setting up a layer

Full Docs

Step 1: Declare

Create each layer as an entry in an enum. Replace YOUR_LAYER_1, YOUR_LAYER_2, etc., below, with names of your layers.

// Layer Declarations
+QMK Firmware Cheatsheet 0.3

QMK Firmware

    Up to 32 layers
    Modifiers
    Macros
    Dynamic Macros
    Tap Dance
    Leader Key
    Unicode
    Mouse Keys

Setting up a layer

Full Docs

Step 1: Declare

Create each layer as an entry in an enum. Replace YOUR_LAYER_1, YOUR_LAYER_2, etc., below, with names of your layers.

// Layer Declarations
 enum {
     YOUR_LAYER_1 = 0,
     YOUR_LAYER_2,
@@ -16,7 +16,7 @@
 
   // ..., the rest of your layers
 
-};

Step 3: Use

Here are a variety of ways to change the layer.

Keycode Description
MO(YOUR_LAYER)
While held, MOmentarily switch to YOUR_LAYER.
LT(YOUR_LAYER, KC_XXXX)
Layer Tap. When held: go to YOUR_LAYER.
When tapped: send KC_XXXX
TG(YOUR_LAYER)
Layer Toggle. When tapped, toggles YOUR_LAYER on or off
TO(YOUR_LAYER)
When tapped, goes to YOUR_LAYER
TT(YOUR_LAYER)
When tapped, toggles YOUR_LAYER on or off.
When held, activates YOUR_LAYER.
OSL(YOUR_LAYER)
One-Shot Layer. Sends key on YOUR_LAYER

Light LEDs according to layer

Create a function called matrix_scan_user, and add a case for each layer. Note, you will have to look up which function your keyboard calls to turn LEDs on/off, and insert them to the code, below.

// Runs constantly in the background, in a loop.
+};

Step 3: Use

Here are a variety of ways to change the layer.

Keycode Description
MO(YOUR_LAYER)
While held, MOmentarily switch to YOUR_LAYER.
LT(YOUR_LAYER, KC_XXXX)
Layer Tap. When held: go to YOUR_LAYER.
When tapped: send KC_XXXX
TG(YOUR_LAYER)
Layer Toggle. When tapped, toggles YOUR_LAYER on or off
TO(YOUR_LAYER)
When tapped, goes to YOUR_LAYER
TT(YOUR_LAYER)
When tapped, toggles YOUR_LAYER on or off.
When held, activates YOUR_LAYER.
OSL(YOUR_LAYER)
One-Shot Layer. Goes to YOUR_LAYER for the next keypress

Light LEDs according to layer

Create a function called matrix_scan_user, and add a case for each layer. Note, you will have to look up which function your keyboard calls to turn LEDs on/off, and insert them to the code, below.

// Runs constantly in the background, in a loop.
 void matrix_scan_user(void) {
 
     uint8_t layer = biton32(layer_state);
@@ -63,7 +63,7 @@
     //
   }
   return MACRO_NONE;
-};

Step 3: Use

M(YOUR_MACRO_1)

Dynamic Macros

Full Docs

Record and play keystrokes

Step 1: Setup

enum planck_keycodes {
+};

Step 3: Use

M(YOUR_MACRO_1)

Dynamic Macros

Full Docs

Record and play back sequences of keystrokes. Note: macros are not kept in memory after the keyboard is unplugged.

Step 1: Setup

enum planck_keycodes {
     QWERTY = SAFE_RANGE,
     COLEMAK,
     DVORAK,
@@ -81,7 +81,14 @@
 }
 
 #include "dynamic_macro.h"`
-

Step 2: Use

Keycode Description
DYN_REC_START1
start recording the macro 1
DYN_REC_START2
start recording the macro 2
DYN_MACRO_PLAY1
replay the macro 1
DYN_MACRO_PLAY2
replay the macro 2
DYN_REC_STOP
finish the macro that is currently being recorded.

Tap Dance

Full Docs

Send different key codes depending on how many times key is tapped. Tap key once does one thing, tap twice does another thing, etc.

Step 1: Setup

TAP_DANCE_ENABLE = yes
+
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+    if (!process_record_dynamic_macro(keycode, record)) {
+        return false;
+    }
+    return true;
+}
+
+

Step 2: Use

Keycode Description
DYN_REC_START1
Start recording Macro 1
DYN_REC_START2
Start recording Macro 2
DYN_REC_STOP
Stop recording current Macro
DYN_MACRO_PLAY1
Replay Macro 1
DYN_MACRO_PLAY2
Replay Macro 2

Tap Dance

Full Docs

Send different key codes depending on how many times key is tapped. Tap key once does one thing, tap twice does another thing, etc.

Step 1: Setup

TAP_DANCE_ENABLE = yes
 
#define TAPPING_TERM 200
 

Step 2: Declare

Create an entry for each tap dance in an enum. Replace YOUR_TAPDANCE_1, YOUR_TAPDANCE_2, etc., with the names of your tap dances.

// Tap Dance Declarations
 enum {
@@ -103,5 +110,35 @@
 #define MOUSEKEY_TIME_TO_MAX                        20
 #define MOUSEKEY_WHEEL_MAX_SPEED                    8
 #define MOUSEKEY_WHEEL_MAX_TIME_TO_MAX              40
-

Step 2: Use

Keycode Description
KC_MS_UP
Mouse Cursor Up
KC_MS_DOWN
Mouse Cursor Down
KC_MS_LEFT
Mouse Cursor Left
KC_MS_RIGHT
Mouse Cursor Right
KC_MS_BTN1
Mouse Button 1
KC_MS_BTN2
Mouse Button 2
KC_MS_BTN3
Mouse Button 3
KC_MS_BTN4
Mouse Button 4
KC_MS_BTN5
Mouse Button 5
KC_MS_WH_UP
Mouse Wheel Up
KC_MS_WH_DOWN
Mouse Wheel Down
KC_MS_WH_LEFT
Mouse Wheel Left
KC_MS_WH_RIGHT
Mouse Wheel Right
KC_MS_ACCEL0
Set Mouse Acceleration Speed to 0
KC_MS_ACCEL1
Set Mouse Acceleration Speed to 1
KC_MS_ACCEL2
Set Mouse Acceleration Speed to 2

Leader Key

Full Docs

Coming soon

Version 0.21 by Jay Liu +

Step 2: Use

Keycode Description
KC_MS_UP
Mouse Cursor Up
KC_MS_DOWN
Mouse Cursor Down
KC_MS_LEFT
Mouse Cursor Left
KC_MS_RIGHT
Mouse Cursor Right
KC_MS_BTN1
Mouse Button 1
KC_MS_BTN2
Mouse Button 2
KC_MS_BTN3
Mouse Button 3
KC_MS_BTN4
Mouse Button 4
KC_MS_BTN5
Mouse Button 5
KC_MS_WH_UP
Mouse Wheel Up
KC_MS_WH_DOWN
Mouse Wheel Down
KC_MS_WH_LEFT
Mouse Wheel Left
KC_MS_WH_RIGHT
Mouse Wheel Right
KC_MS_ACCEL0
Set Mouse Acceleration Speed to 0
KC_MS_ACCEL1
Set Mouse Acceleration Speed to 1
KC_MS_ACCEL2
Set Mouse Acceleration Speed to 2

Unicode

Full Docs

Set up your keyboard to input Unicode, working through additional, required software.

NOTE: The instructions here only apply for characters up to 0xFFFF. For higher characters, please consult the official docs.

Prerequisites: Configure OS and Software

Windows

Install WinCompose.

MacOS

In System Preferences -> Keyboard -> Input Sources ->, add a new layout. In the Others menu, select Unicode Hex Input. Note: Enable Unicode Hex Input each time you want to input Unicode. Check the box for "Show Input menu in menu bar" to switch to this quickly.

Linux

Add the Unicode input method for your distro. Note: Enable Unicode Hex Input each time you want to input Unicode. Should work almost anywhere on ibus enabled distros. Without ibus, this works under GTK apps, but rarely anywhere else.

Step 1: Setup

UNICODE_ENABLE = yes
+
void matrix_init_user(void) {
+    set_unicode_input_mode(UC_XXXX); // REPLACE UC_XXXX with the Unicode Input Mode for your OS. See table below.
+};
+
Unicode Input ModeDescription
UC_WINC
Windows using WinCompose.
UC_OSX
MacOS using Unicode Hex Input. Can also send `UC_OSX_RALT` to use the Right Alt key.
UC_LNX
Linux using Unicode input method.

Step 2: Define

#define STAR 0x2605 // ★
+// ...,repeat for all characters
+

Step 3: Use

UC(STAR)
+

Leader Key

Full Docs

Press a sequence of keys to trigger functionality, in the style of Vim.

Step 1: Setup

LEADER_EXTERNS();
+

Step 2: Define

void matrix_scan_user(void) {
+    LEADER_DICTIONARY() {
+        leading = false;
+        leader_end();
+
+        // for single key sequences
+        SEQ_ONE_KEY(KC_XXXX) {
+            // INSERT CODE HERE: anything you can do in a macro https://docs.qmk.fm/macros.html
+        }
+
+        // for two-key sequences
+        SEQ_TWO_KEYS(KC_XXXX, KC_YYYY) {
+            // INSERT CODE HERE: anything you can do in a macro https://docs.qmk.fm/macros.html
+        }
+
+        // for three-key sequences
+        SEQ_THREE_KEYS(KC_XXXX, KC_YYYY, KC_ZZZZ) {
+            // INSERT CODE HERE: anything you can do in a macro https://docs.qmk.fm/macros.html
+        }
+
+        // ..., the rest of your Leader Key definitions.
+    }
+}

Step 3: Use

Tap the `KC_LEAD` followed by the sequence of keys, to access your functionality.

KC_LEAD
\ No newline at end of file diff --git a/docs/styles/app.css b/docs/styles/app.css index 614585d..e46cf80 100644 --- a/docs/styles/app.css +++ b/docs/styles/app.css @@ -1 +1 @@ -/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */@import url("http://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700");html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}code[class*="language-"],pre[class*="language-"]{color:#000;background:none;text-shadow:0 1px white;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*="language-"]::-moz-selection,pre[class*="language-"] ::-moz-selection,code[class*="language-"]::-moz-selection,code[class*="language-"] ::-moz-selection{text-shadow:none;background:#b3d4fc}pre[class*="language-"]::selection,pre[class*="language-"] ::selection,code[class*="language-"]::selection,code[class*="language-"] ::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*="language-"],pre[class*="language-"]{text-shadow:none}}pre[class*="language-"]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*="language-"],pre[class*="language-"]{background:#f5f2f0}:not(pre)>code[class*="language-"]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{color:#905}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:#690}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string{color:#a67f59;background:rgba(255,255,255,0.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function{color:#dd4a68}.token.regex,.token.important,.token.variable{color:#e90}.token.important,.token.bold{font-weight:bold}.token.italic{font-style:italic}.token.entity{cursor:help}body,h1,h2,h4,p{font-family:"Open Sans", sans-serif}html{font-size:14px;line-height:1.4}@media (min-width: 2000px){html{font-size:16px}}h1{font-size:2em;line-height:normal;margin-bottom:1rem}h2{font-size:1.6em;line-height:normal;margin-bottom:1rem}h2{font-size:1.3em;line-height:normal;margin-bottom:1rem}h4{font-size:1.2em;line-height:normal;margin-bottom:1rem}p{font-size:1em}aside{color:#32313f;font-style:italic}a{text-decoration:none;color:#c62c0a}a:hover{text-decoration:underline}li{line-height:normal}section{background:#fafafa;max-width:55rem;margin:0.25em auto 0;padding-bottom:1em}@media (min-width: 1300px){section{max-width:70rem}}section .section-head{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline;padding:0.02em 1.5em;background:#2d3586}section .section-head h2{color:#fff;-webkit-box-flex:1;-ms-flex:1;flex:1}section .section-head a{color:#fff}section .intro{font-size:1.2em;font-style:italic;margin:0 1.5rem}section .block{margin:2rem 3rem}.feature-overview{padding:0.5em 0 1em}.feature-overview h1{text-align:center;padding:1em 0 1.5em}.feature-overview .features{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1em;padding:0 1em}.feature-overview .feature{width:30%;margin-left:3%;margin-bottom:1em;font-style:normal}.feature-overview .feature a{font-weight:700}.feature-overview .feature aside{color:#5b5f62;font-size:0.8rem;line-height:normal}table thead td{background:#fafafa;padding:0.5em}table thead td :not(aside){font-weight:700}table pre[class*="language-"]{padding:0.5em;margin:0 0.25rem 0.25rem 0.25rem}footer{margin:2em 0 1em;text-align:center}@media print{.no-print{display:none}html{font-size:8px}.feature-overview{-webkit-column-span:all;column-span:all;background:transparent}main{-webkit-columns:3;columns:3;-webkit-column-gap:12px;column-gap:12px}footer{-webkit-column-span:all;column-span:all}section .section-head{background:none}section .section-head h2{color:#2d3586;font-size:2em}section .section-head a{color:#2d3586}table{-webkit-column-break-inside:auto;break-inside:auto}table thead{display:none}table tbody{-webkit-column-break-inside:auto;break-inside:auto}table tr{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-column-break-inside:auto;break-inside:auto;margin-bottom:1em}table td:nth-child(2){padding-left:1.5em}table pre[class*="language-"]{padding:0.25em 0.5em}a:after{content:" (" attr(href) ") "}a[name],a[name]:after{display:none}code[class*="language-"]{white-space:pre-wrap;word-wrap:break-word}} +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */@import url("http://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700");html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}code[class*="language-"],pre[class*="language-"]{color:#000;background:none;text-shadow:0 1px white;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*="language-"]::-moz-selection,pre[class*="language-"] ::-moz-selection,code[class*="language-"]::-moz-selection,code[class*="language-"] ::-moz-selection{text-shadow:none;background:#b3d4fc}pre[class*="language-"]::selection,pre[class*="language-"] ::selection,code[class*="language-"]::selection,code[class*="language-"] ::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*="language-"],pre[class*="language-"]{text-shadow:none}}pre[class*="language-"]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*="language-"],pre[class*="language-"]{background:#f5f2f0}:not(pre)>code[class*="language-"]{padding:.1em;border-radius:.3em;white-space:normal}.token.comment,.token.prolog,.token.doctype,.token.cdata{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{color:#905}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:#690}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string{color:#a67f59;background:rgba(255,255,255,0.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.function{color:#dd4a68}.token.regex,.token.important,.token.variable{color:#e90}.token.important,.token.bold{font-weight:bold}.token.italic{font-style:italic}.token.entity{cursor:help}body,h1,h2,h3,h4,p{font-family:"Open Sans", sans-serif}html{font-size:14px;line-height:1.4}@media (min-width: 2000px){html{font-size:16px}}h1{font-size:2em;line-height:normal;margin-bottom:1rem}h2{font-size:1.6em;line-height:normal;margin-bottom:1rem}h3{font-size:1.3em;line-height:normal;margin-bottom:1rem}h4{font-size:1.2em;line-height:normal;margin-bottom:1rem}p{font-size:1em}aside{color:#32313f;font-style:italic}a{text-decoration:none;color:#c62c0a}a:hover{text-decoration:underline}li{line-height:normal}section{background:#fafafa;max-width:55rem;margin:0.25em auto 0;padding-bottom:1em}@media (min-width: 1300px){section{max-width:70rem}}section .section-head{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline;padding:0.02em 1.5em;background:#2d3586}section .section-head h2{color:#fff;-webkit-box-flex:1;-ms-flex:1;flex:1}section .section-head a{color:#fff}section .intro{font-size:1.2em;font-style:italic;margin:0 1.5rem}section .block{margin:2rem 3rem}.feature-overview{padding:0.5em 0 1em}.feature-overview h1{text-align:center;padding:1em 0 1.5em}.feature-overview .features{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1em;padding:0 1em}.feature-overview .feature{width:30%;margin-left:3%;margin-bottom:1em;font-style:normal}.feature-overview .feature a{font-weight:700}.feature-overview .feature aside{color:#5b5f62;font-size:0.8rem;line-height:normal}table thead td{background:#fafafa;padding:0.5em}table thead td :not(aside){font-weight:700}table pre[class*="language-"]{padding:0.5em;margin:0 0.25rem 0.25rem 0.25rem}footer{margin:2em 0 1em;text-align:center}@media print{.no-print{display:none}html{font-size:8px}.feature-overview{-webkit-column-span:all;column-span:all;background:transparent}main{-webkit-columns:3;columns:3;-webkit-column-gap:12px;column-gap:12px}footer{-webkit-column-span:all;column-span:all}section .section-head{background:none}section .section-head h2{color:#2d3586;font-size:2em}section .section-head a{color:#2d3586}table{-webkit-column-break-inside:auto;break-inside:auto}table thead{display:none}table tbody{-webkit-column-break-inside:auto;break-inside:auto}table tr{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-column-break-inside:auto;break-inside:auto;margin-bottom:1em}table td:nth-child(2){padding-left:1.5em}table pre[class*="language-"]{padding:0.25em 0.5em}a:after{content:" (" attr(href) ") "}a[name],a[name]:after{display:none}code[class*="language-"]{white-space:pre-wrap;word-wrap:break-word}}