浏览代码

33-key layout, AltGr-based

Fabien Cazenave 1 年之前
父节点
当前提交
b2ccf926a6
共有 7 个文件被更改,包括 1797 次插入0 次删除
  1. 107 0
      README.md
  2. 290 0
      img/base.svg
  3. 308 0
      img/navigation.svg
  4. 315 0
      img/numrow.svg
  5. 321 0
      img/symbols.svg
  6. 378 0
      img/symbols39.svg
  7. 78 0
      kanata.kbd

+ 107 - 0
README.md

@@ -0,0 +1,107 @@
+Selenium
+================================================================================
+
+A [Miryoku](https://github.com/manna-harbour/miryoku)-like approach to minimize
+finger movements without changing the keyboard layout:
+
+![base layer on a 33-key keyboard](img/base.svg)
+
+- 3 home-row mods per hand for <kbd>Ctrl</kbd>, <kbd>Alt</kbd>, <kbd>Super</kbd>
+- 3 layer-tap keys under the thumbs
+    - left: <kbd>Shift</kbd> / <kbd>Backspace</kbd>
+    - center: <kbd>Navigation</kbd> / <kbd>Space</kbd>
+    - right: <kbd>Symbols</kbd> / <kbd>Return</kbd>
+
+The idea behind these layers is to **bring the characters under the fingers,
+rather than moving the fingers over the keys**. This approach is what makes
+those 34-key keyboards so comfortable, and the goal here is to get a comparable
+experience with any other keyboard — including your laptop’s.
+
+
+Main Benefits
+--------------------------------------------------------------------------------
+
+- <kbd>Shift</kbd>, <kbd>Backspace</kbd>, <kbd>Return</kbd> under the thumbs!
+- all programming symbols are moved to the comfortable 3×10 zone
+- symmetrical modifiers on the home row
+- Vim-like navigation in all apps
+- easier left-hand shortcuts
+- works with any keyboard
+
+
+Suitable for *all* keyboards
+--------------------------------------------------------------------------------
+
+… well, all keyboards that have at least 3×10 finger keys and 3 thumb keys. So
+yes, pretty much every computer keyboard out there.
+
+Miryoku requires 6 thumb keys, which tends to limit its use to ergonomic
+keyboards. Selenium works with 3, which means it’s usable with any standard ANSI
+or ISO keyboard (spacebar + Alt/Cmd keys), even non-programmable ones thanks to
+[kanata](https://github.com/jtroo/kanata); and it also works with minimalist
+keyboards like the [Ferris](https://github.com/pierrechevalier83/ferris) (only 4
+thumb keys).
+
+Of course, Selenium can be implemented in programmable keyboards with QMK, ZMK,
+Kaleidoscope, etc.
+
+
+Navigation Layer
+--------------------------------------------------------------------------------
+
+A long press on the <kbd>Space</kbd> bar brings up the Navigation layer:
+
+![navigation layer on a 33-key keyboard](img/navigation.svg)
+
+- left: one-hand shortcuts (<kbd>Ctrl</kbd>-<kbd>WASZXCV</kbd>),
+<kbd>Tab</kbd>/<kbd>Shift</kbd>-<kbd>Tab</kbd>, prev/next
+- right: Vim-like arrows on <kbd>HJKL</kbd>, home/end page up/down, mouse scroll
+- bottom: <kbd>Delete</kbd> and <kbd>Escape</kbd>
+
+
+Symbols Layer
+--------------------------------------------------------------------------------
+
+A long press on the <kbd>Return</kbd> key brings up the Symbols layer:
+
+![symbols layer on a 33-key keyboard](img/symbols.svg)
+
+- all symbols are on the same layer, arranged for comfort
+- the <kbd>Shift</kbd> key becomes a <kbd>Num</kbd> layer key
+
+
+NumRow Layer
+--------------------------------------------------------------------------------
+
+If your keyboard has no number row, we got you covered! From <kbd>Symbols</kbd>
+mode, pressing the <kbd>Num</kbd> key brings up the NumRow layer:
+
+![NumRow layer on a 33-key keyboard](img/numrow.svg)
+
+- all digits are on the home row, in the order you already know
+- the upper row helps with <kbd>Shift</kbd>-digit shortcuts
+- the lower row has dash, comma, dot and slash signs to help with number / date
+inputs
+
+
+TODO
+--------------------------------------------------------------------------------
+
+The main idea is settled (3 home-row mods + 3 layer-taps), but Selenium is still
+a work in progress in an early stage. Expect refinements.
+
+- NumPad layer
+- macOS support (KMonad / Karabiner)
+- sample QMK / ZMK implementations for common keyboards
+- variants for specific keyboard layouts
+
+
+Why the name?
+--------------------------------------------------------------------------------
+
+I believe 34-key keyboards like the [Ferris](https://github.com/pierrechevalier83/ferris)
+are the end game of ergonomic keyboards, and 34 is selenium’s atomic number. All
+other keyboards I’ve tried feel like unstable isotopes of the Ferris experience.
+
+[Other cultural biases](https://en.wikipedia.org/wiki/Evolution_(2001_film))
+might have been involved as well, though this remains to be proven. :-)

+ 290 - 0
img/base.svg

@@ -0,0 +1,290 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="gnu" viewBox="0 60 900 240">
+
+  <style>
+    rect, path {
+      stroke: #666;
+      stroke-width: .5px;
+      fill: #fff;
+    }
+    .specialKey,
+    .specialKey rect {
+      fill: #e4e4e4;
+    }
+    .specialKey text {
+      fill: #333;
+    }
+    text {
+      fill: #333;
+      fill: #ccc;
+      font: normal 20px sans-serif;
+      text-align: center;
+    }
+    .shortcut {
+      font-size: 12px;
+      font-weight: normal;
+      text-anchor: end;
+      transform: translateX(10px);
+    }
+
+    #row_AD { transform: translate(64px,  64px); }
+    #row_AC { transform: translate(64px, 124px); }
+    #row_AB { transform: translate(64px, 184px); }
+    #row_AA { transform: translate(64px, 244px); }
+
+    #row_AA .homeKey text,
+    .specialKey .win,
+    .specialKey .gnu {
+      font-size: 14px;
+    }
+    .specialKey .win,
+    .specialKey .mac,
+    .specialKey .gnu {
+      display: none;
+    }
+    .mac .specialKey .mac,
+    .gnu .specialKey .gnu,
+    .win .specialKey .win { display: block; }
+
+    .level3 { fill: #333; }
+    @media (prefers-color-scheme: dark) {
+      text       { fill: #888; }
+      rect, path { fill: #555; }
+      .level3    { fill: #ccc; }
+    }
+  </style>
+
+  <g id="row_AD">
+    <g class="left">
+      <g transform="translate(90)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">Q</text>
+        </g>
+      </g>
+      <g transform="translate(150)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">W</text>
+        </g>
+      </g>
+      <g transform="translate(210)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">E</text>
+        </g>
+      </g>
+      <g transform="translate(270)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">R</text>
+        </g>
+      </g>
+      <g transform="translate(330)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">T</text>
+        </g>
+      </g>
+    </g>
+    <g class="right">
+      <g transform="translate(390)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">Y</text>
+        </g>
+      </g>
+      <g transform="translate(450)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">U</text>
+        </g>
+      </g>
+      <g transform="translate(510)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">I</text>
+        </g>
+      </g>
+      <g transform="translate(570)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">O</text>
+        </g>
+      </g>
+      <g transform="translate(630)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">P</text>
+        </g>
+      </g>
+    </g>
+  </g>
+
+  <g id="row_AC">
+    <g class="left">
+      <g transform="translate(90)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">A</text>
+        </g>
+      </g>
+      <g transform="translate(150)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">S</text>
+          <text x="38.0" y="43.4" class="level3 shortcut">super</text>
+        </g>
+      </g>
+      <g transform="translate(210)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">D</text>
+          <text x="38.0" y="43.4" class="level3 shortcut">alt</text>
+        </g>
+      </g>
+      <g transform="translate(270)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">F</text>
+          <text x="38.0" y="43.4" class="level3 shortcut">ctrl</text>
+        </g>
+      </g>
+      <g transform="translate(330)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">G</text>
+        </g>
+      </g>
+    </g>
+    <g class="right">
+      <g transform="translate(390)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">H</text>
+        </g>
+      </g>
+      <g transform="translate(450)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">J</text>
+          <text x="38.0" y="43.4" class="level3 shortcut">ctrl</text>
+        </g>
+      </g>
+      <g transform="translate(510)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">K</text>
+          <text x="38.0" y="43.4" class="level3 shortcut">alt</text>
+        </g>
+      </g>
+      <g transform="translate(570)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">L</text>
+          <text x="38.0" y="43.4" class="level3 shortcut">super</text>
+        </g>
+      </g>
+      <g transform="translate(630)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">;</text>
+          <text x="12.8" y="20.6" class="level2">:</text>
+        </g>
+      </g>
+    </g>
+  </g>
+
+  <g id="row_AB">
+    <g class="left">
+      <g transform="translate(90)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">Z</text>
+        </g>
+      </g>
+      <g transform="translate(150)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">X</text>
+        </g>
+      </g>
+      <g transform="translate(210)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">C</text>
+        </g>
+      </g>
+      <g transform="translate(270)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">V</text>
+        </g>
+      </g>
+      <g transform="translate(330)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">B</text>
+        </g>
+      </g>
+    </g>
+    <g class="right">
+      <g transform="translate(390)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">N</text>
+        </g>
+      </g>
+      <g transform="translate(450)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">M</text>
+        </g>
+      </g>
+      <g transform="translate(510)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">,</text>
+          <text x="12.8" y="20.6" class="level2">&lt;</text>
+        </g>
+      </g>
+      <g transform="translate(570)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">.</text>
+          <text x="12.8" y="20.6" class="level2">&gt;</text>
+        </g>
+      </g>
+      <g transform="translate(630)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">/</text>
+          <text x="12.8" y="20.6" class="level2">?</text>
+        </g>
+      </g>
+    </g>
+  </g>
+
+  <g id="row_AA">
+    <g class="left">
+      <g class="specialKey" transform="translate(180)">
+        <rect width="82" height="52" rx="5" ry="5"/>
+        <text x="64.8" y="18.6" text-anchor="middle" style="font-size: 12px;">⌫</text>
+        <text x="11.0" y="42.8" class="win gnu">Shift</text>
+        <text x="16.4" y="42.8" class="mac" text-anchor="middle">⌥</text>
+      </g>
+    </g>
+    <g class="homeKey" transform="translate(270)">
+      <rect width="232" height="52" rx="5" ry="5"/>
+      <text x="11.0" y="42.8" class="win gnu" style="fill: red;">Navigation</text>
+    </g>
+    <g class="right">
+      <g class="specialKey" transform="translate(510)">
+        <rect width="82" height="52" rx="5" ry="5"/>
+        <text x="64.8" y="20.6" text-anchor="middle">⏎</text>
+        <text x="11.0" y="42.8" class="win gnu" style="fill: blue;">Symbols</text>
+        <text x="16.4" y="42.8" class="mac" text-anchor="middle">⌥</text>
+      </g>
+    </g>
+  </g>
+
+</svg>

+ 308 - 0
img/navigation.svg

@@ -0,0 +1,308 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="gnu" viewBox="0 60 900 240">
+
+  <style>
+    rect, path {
+      stroke: #666;
+      stroke-width: .5px;
+      fill: #fff;
+    }
+    .specialKey,
+    .specialKey rect {
+      fill: #e4e4e4;
+    }
+    .specialKey text {
+      fill: #333;
+    }
+    text {
+      fill: #333;
+      fill: #ccc;
+      font: normal 20px sans-serif;
+      text-align: center;
+    }
+    .shortcut {
+      font-size: smaller;
+    }
+
+    #row_AD { transform: translate(64px,  64px); }
+    #row_AC { transform: translate(64px, 124px); }
+    #row_AB { transform: translate(64px, 184px); }
+    #row_AA { transform: translate(64px, 244px); }
+
+    #row_AA .homeKey text,
+    .specialKey .win,
+    .specialKey .win,
+    .specialKey .gnu {
+      font-size: 14px;
+    }
+    .specialKey .win,
+    .specialKey .mac,
+    .specialKey .gnu {
+      display: none;
+    }
+    .mac .specialKey .mac,
+    .gnu .specialKey .gnu,
+    .win .specialKey .win { display: block; }
+
+    .level3 { fill: #e83; font-weight: bold; }
+    @media (prefers-color-scheme: dark) {
+      text       { fill: #888; }
+      rect, path { fill: #555; }
+    }
+  </style>
+
+  <g id="row_AD">
+    <g class="left">
+      <g transform="translate(90)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">Q</text>
+        </g>
+      </g>
+      <g transform="translate(150)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">W</text>
+          <text x="38.0" y="43.4" class="level3 shortcut">^w</text>
+        </g>
+      </g>
+      <g transform="translate(210)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">E</text>
+          <text x="38.0" y="43.4" class="level3">⎗</text>
+        </g>
+      </g>
+      <g transform="translate(270)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">R</text>
+          <text x="38.0" y="43.4" class="level3">⎘</text>
+        </g>
+      </g>
+      <g transform="translate(330)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">T</text>
+        </g>
+      </g>
+    </g>
+    <g class="right">
+      <g transform="translate(390)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">Y</text>
+          <text x="38.0" y="43.4" class="level3">⇱</text>
+        </g>
+      </g>
+      <g transform="translate(450)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">U</text>
+          <text x="38.0" y="43.4" class="level3">⇟</text>
+        </g>
+      </g>
+      <g transform="translate(510)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">I</text>
+          <text x="38.0" y="43.4" class="level3">⇞</text>
+        </g>
+      </g>
+      <g transform="translate(570)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">O</text>
+          <text x="38.0" y="43.4" class="level3">⇲</text>
+        </g>
+      </g>
+      <g transform="translate(630)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">P</text>
+        </g>
+      </g>
+    </g>
+  </g>
+
+  <g id="row_AC">
+    <g class="left">
+      <g transform="translate(90)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">A</text>
+          <text x="38.0" y="43.4" class="level3 shortcut">^a</text>
+        </g>
+      </g>
+      <g transform="translate(150)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">S</text>
+          <text x="38.0" y="43.4" class="level3 shortcut">^s</text>
+        </g>
+      </g>
+      <g transform="translate(210)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">D</text>
+          <text x="38.0" y="43.4" class="level3">⇤</text>
+        </g>
+      </g>
+      <g transform="translate(270)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">F</text>
+          <text x="38.0" y="43.4" class="level3">⇥</text>
+        </g>
+      </g>
+      <g transform="translate(330)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">G</text>
+        </g>
+      </g>
+    </g>
+    <g class="right">
+      <g transform="translate(390)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">H</text>
+          <text x="38.0" y="43.4" class="level3">←</text>
+        </g>
+      </g>
+      <g transform="translate(450)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">J</text>
+          <text x="38.0" y="43.4" class="level3">↓</text>
+        </g>
+      </g>
+      <g transform="translate(510)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">K</text>
+          <text x="38.0" y="43.4" class="level3">↑</text>
+        </g>
+      </g>
+      <g transform="translate(570)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">L</text>
+          <text x="38.0" y="43.4" class="level3">→</text>
+        </g>
+      </g>
+      <g transform="translate(630)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">;</text>
+          <text x="12.8" y="20.6" class="level2">:</text>
+        </g>
+      </g>
+    </g>
+  </g>
+
+  <g id="row_AB">
+    <g class="left">
+      <g transform="translate(90)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">Z</text>
+          <text x="38.0" y="43.4" class="level3 shortcut">^z</text>
+        </g>
+      </g>
+      <g transform="translate(150)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">X</text>
+          <text x="38.0" y="43.4" class="level3 shortcut">^x</text>
+        </g>
+      </g>
+      <g transform="translate(210)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">C</text>
+          <text x="38.0" y="43.4" class="level3 shortcut">^c</text>
+        </g>
+      </g>
+      <g transform="translate(270)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">V</text>
+          <text x="38.0" y="43.4" class="level3 shortcut">^v</text>
+        </g>
+      </g>
+      <g transform="translate(330)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">B</text>
+        </g>
+      </g>
+    </g>
+    <g class="right">
+      <g transform="translate(390)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">N</text>
+          <text x="30.0" y="43.4" class="level3">🖰</text>
+          <text x="38.0" y="43.4" class="level3">←</text>
+        </g>
+      </g>
+      <g transform="translate(450)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">M</text>
+          <text x="30.0" y="43.4" class="level3">🖰</text>
+          <text x="42.0" y="43.4" class="level3">↓</text>
+        </g>
+      </g>
+      <g transform="translate(510)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">,</text>
+          <text x="12.8" y="20.6" class="level2">&lt;</text>
+          <text x="30.0" y="43.4" class="level3">🖰</text>
+          <text x="42.0" y="43.4" class="level3">↑</text>
+        </g>
+      </g>
+      <g transform="translate(570)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">.</text>
+          <text x="12.8" y="20.6" class="level2">&gt;</text>
+          <text x="30.0" y="43.4" class="level3">🖰</text>
+          <text x="38.0" y="43.4" class="level3">→</text>
+        </g>
+      </g>
+      <g transform="translate(630)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">/</text>
+          <text x="12.8" y="20.6" class="level2">?</text>
+        </g>
+      </g>
+    </g>
+  </g>
+
+  <g id="row_AA">
+    <g class="left">
+      <g class="specialKey" transform="translate(180)">
+        <rect width="82" height="52" rx="5" ry="5"/>
+        <text x="64.8" y="18.6" text-anchor="middle" style="fill: red; font-size: 12px;">⌦</text>
+        <text x="11.0" y="42.8" class="win gnu">Shift</text>
+        <text x="16.4" y="42.8" class="mac" text-anchor="middle">⌥</text>
+      </g>
+    </g>
+    <g class="homeKey" transform="translate(270)">
+      <rect width="232" height="52" rx="5" ry="5" style="fill: #fd7;"/>
+      <text x="11.0" y="42.8" class="win gnu" style="fill: red;">Navigation</text>
+    </g>
+    <g class="right">
+      <g class="specialKey" transform="translate(510)">
+        <rect width="82" height="52" rx="5" ry="5"/>
+        <text x="64.8" y="20.6" style="fill: red;" text-anchor="middle">⎋</text>
+        <text x="11.0" y="42.8" class="win gnu" style="fill: blue;">Symbols</text>
+        <text x="16.4" y="42.8" class="mac" text-anchor="middle">⌥</text>
+      </g>
+    </g>
+  </g>
+
+</svg>

+ 315 - 0
img/numrow.svg

@@ -0,0 +1,315 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="gnu"
+    viewBox="0 60 900 240">
+    <!-- viewBox="60 60 780 240"> -->
+
+<!--
+  <link xmlns="http://www.w3.org/1999/xhtml" rel="stylesheet"
+      href="42_style.css" type="text/css"/>
+-->
+
+  <style>
+    rect, path {
+      stroke: #666;
+      stroke-width: .5px;
+      fill: #fff;
+    }
+    .specialKey,
+    .specialKey rect {
+      fill: #e4e4e4;
+    }
+    .specialKey text {
+      fill: #333;
+    }
+    text {
+      fill: #333;
+      fill: #ccc;
+      font: normal 20px sans-serif;
+      text-align: center;
+    }
+
+    #row_AD { transform: translate(64px,  64px); }
+    #row_AC { transform: translate(64px, 124px); }
+    #row_AB { transform: translate(64px, 184px); }
+    #row_AA { transform: translate(64px, 244px); }
+
+    /*
+    .left   { transform: translate(-15px, 0); }
+    .right  { transform: translate(+15px, 0); }
+    */
+
+    #row_AA .homeKey text,
+    .specialKey .win,
+    .specialKey .win,
+    .specialKey .gnu {
+      font-size: 14px;
+    }
+    .specialKey .win,
+    .specialKey .mac,
+    .specialKey .gnu {
+      display: none;
+    }
+    .mac .specialKey .mac,
+    .gnu .specialKey .gnu,
+    .win .specialKey .win { display: block; }
+
+    .level3 { fill: green; }
+    @media (prefers-color-scheme: dark) {
+      text       { fill: #888; }
+      .level3    { fill: #6d6; }
+      rect, path { fill: #555; }
+    }
+  </style>
+
+  <g id="row_AD">
+    <g class="left">
+      <g transform="translate(90)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">Q</text>
+          <text x="38.0" y="43.4" class="level3">!</text>
+        </g>
+      </g>
+      <g transform="translate(150)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">W</text>
+          <text x="38.0" y="43.4" class="level3">@</text>
+        </g>
+      </g>
+      <g transform="translate(210)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">E</text>
+          <text x="38.0" y="43.4" class="level3">#</text>
+        </g>
+      </g>
+      <g transform="translate(270)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">R</text>
+          <text x="38.0" y="43.4" class="level3">$</text>
+        </g>
+      </g>
+      <g transform="translate(330)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">T</text>
+          <text x="38.0" y="43.4" class="level3">%</text>
+        </g>
+      </g>
+    </g>
+    <g class="right">
+      <g transform="translate(390)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">Y</text>
+          <text x="38.0" y="43.4" class="level3">^</text>
+        </g>
+      </g>
+      <g transform="translate(450)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">U</text>
+          <text x="38.0" y="43.4" class="level3">&amp;</text>
+        </g>
+      </g>
+      <g transform="translate(510)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">I</text>
+          <text x="38.0" y="43.4" class="level3">*</text>
+        </g>
+      </g>
+      <g transform="translate(570)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">O</text>
+          <text x="38.0" y="43.4" class="level3">(</text>
+        </g>
+      </g>
+      <g transform="translate(630)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">P</text>
+          <text x="38.0" y="43.4" class="level3">)</text>
+        </g>
+      </g>
+    </g>
+  </g>
+
+  <g id="row_AC">
+    <g class="left">
+      <g transform="translate(90)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">A</text>
+          <text x="38.0" y="43.4" class="level3">1</text>
+        </g>
+      </g>
+      <g transform="translate(150)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">S</text>
+          <text x="38.0" y="43.4" class="level3">2</text>
+        </g>
+      </g>
+      <g transform="translate(210)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">D</text>
+          <text x="38.0" y="43.4" class="level3">3</text>
+        </g>
+      </g>
+      <g transform="translate(270)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">F</text>
+          <text x="38.0" y="43.4" class="level3">4</text>
+        </g>
+      </g>
+      <g transform="translate(330)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">G</text>
+          <text x="38.0" y="43.4" class="level3">5</text>
+        </g>
+      </g>
+    </g>
+    <g class="right">
+      <g transform="translate(390)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">H</text>
+          <text x="38.0" y="43.4" class="level3">6</text>
+        </g>
+      </g>
+      <g transform="translate(450)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">J</text>
+          <text x="38.0" y="43.4" class="level3">7</text>
+        </g>
+      </g>
+      <g transform="translate(510)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">K</text>
+          <text x="38.0" y="43.4" class="level3">8</text>
+        </g>
+      </g>
+      <g transform="translate(570)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">L</text>
+          <text x="38.0" y="43.4" class="level3">9</text>
+        </g>
+      </g>
+      <g transform="translate(630)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">;</text>
+          <text x="12.8" y="20.6" class="level2">:</text>
+          <text x="38.0" y="43.4" class="level3">0</text>
+        </g>
+      </g>
+    </g>
+  </g>
+
+  <g id="row_AB">
+    <g class="left">
+      <g transform="translate(90)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">Z</text>
+        </g>
+      </g>
+      <g transform="translate(150)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">X</text>
+        </g>
+      </g>
+      <g transform="translate(210)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">C</text>
+        </g>
+      </g>
+      <g transform="translate(270)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">V</text>
+        </g>
+      </g>
+      <g transform="translate(330)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">B</text>
+        </g>
+      </g>
+    </g>
+    <g class="right">
+      <g transform="translate(390)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">N</text>
+        </g>
+      </g>
+      <g transform="translate(450)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">M</text>
+          <text x="38.0" y="43.4" class="level3">-</text>
+        </g>
+      </g>
+      <g transform="translate(510)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">,</text>
+          <text x="12.8" y="20.6" class="level2">&lt;</text>
+          <text x="38.0" y="43.4" class="level3">,</text>
+        </g>
+      </g>
+      <g transform="translate(570)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">.</text>
+          <text x="12.8" y="20.6" class="level2">&gt;</text>
+          <text x="38.0" y="43.4" class="level3">.</text>
+        </g>
+      </g>
+      <g transform="translate(630)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">/</text>
+          <text x="12.8" y="20.6" class="level2">?</text>
+          <text x="38.0" y="43.4" class="level3">/</text>
+        </g>
+      </g>
+    </g>
+  </g>
+
+  <g id="row_AA">
+    <g class="left">
+      <g class="specialKey" transform="translate(180)">
+        <rect width="82" height="52" rx="5" ry="5" style="fill: #ada;"/>
+        <!-- <text x="64.8" y="18.6" text-anchor="middle" style="font-size: 12px;">⌫</text> -->
+        <text x="11.0" y="42.8" class="win gnu">Num</text>
+        <!-- <text x="16.4" y="42.8" class="mac" text-anchor="middle">⌥</text> -->
+      </g>
+    </g>
+    <g class="homeKey" transform="translate(270)">
+      <rect width="232" height="52" rx="5" ry="5"/>
+      <!-- <text x="11.0" y="42.8" class="win gnu">Nav</text> -->
+    </g>
+    <g class="right">
+      <g class="specialKey" transform="translate(510)">
+        <rect width="82" height="52" rx="5" ry="5"/>
+        <text x="64.8" y="20.6" text-anchor="middle">⏎</text>
+        <text x="11.0" y="42.8" class="win gnu" style="fill: blue;">Symbols</text>
+        <text x="16.4" y="42.8" class="mac" text-anchor="middle">⌥</text>
+      </g>
+    </g>
+  </g>
+
+</svg>

+ 321 - 0
img/symbols.svg

@@ -0,0 +1,321 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="gnu"
+    viewBox="0 60 900 240">
+    <!-- viewBox="60 60 780 240"> -->
+
+<!--
+  <link xmlns="http://www.w3.org/1999/xhtml" rel="stylesheet"
+      href="42_style.css" type="text/css"/>
+-->
+
+  <style>
+    rect, path {
+      stroke: #666;
+      stroke-width: .5px;
+      fill: #fff;
+    }
+    .specialKey,
+    .specialKey rect {
+      fill: #e4e4e4;
+    }
+    .specialKey text {
+      fill: #333;
+    }
+    text {
+      fill: #333;
+      fill: #ccc;
+      font: normal 20px sans-serif;
+      text-align: center;
+    }
+
+    #row_AD { transform: translate(64px,  64px); }
+    #row_AC { transform: translate(64px, 124px); }
+    #row_AB { transform: translate(64px, 184px); }
+    #row_AA { transform: translate(64px, 244px); }
+
+    /*
+    .left   { transform: translate(-15px, 0); }
+    .right  { transform: translate(+15px, 0); }
+    */
+
+    #row_AA .homeKey text,
+    .specialKey .win,
+    .specialKey .win,
+    .specialKey .gnu {
+      font-size: 14px;
+    }
+    .specialKey .win,
+    .specialKey .mac,
+    .specialKey .gnu {
+      display: none;
+    }
+    .mac .specialKey .mac,
+    .gnu .specialKey .gnu,
+    .win .specialKey .win { display: block; }
+
+    .level3 { fill: blue; }
+    @media (prefers-color-scheme: dark) {
+      text       { fill: #888; }
+      .level3    { fill: #66d; }
+      rect, path { fill: #555; }
+    }
+  </style>
+
+  <g id="row_AD">
+    <g class="left">
+      <g transform="translate(90)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">Q</text>
+          <text x="38.0" y="43.4" class="level3">1</text>
+        </g>
+      </g>
+      <g transform="translate(150)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">W</text>
+          <text x="38.0" y="43.4" class="level3">[</text>
+        </g>
+      </g>
+      <g transform="translate(210)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">E</text>
+          <text x="38.0" y="43.4" class="level3">]</text>
+        </g>
+      </g>
+      <g transform="translate(270)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">R</text>
+          <text x="38.0" y="43.4" class="level3">$</text>
+        </g>
+      </g>
+      <g transform="translate(330)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">T</text>
+          <text x="38.0" y="43.4" class="level3">%</text>
+        </g>
+      </g>
+    </g>
+    <g class="right">
+      <g transform="translate(390)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">Y</text>
+          <text x="38.0" y="43.4" class="level3">^</text>
+        </g>
+      </g>
+      <g transform="translate(450)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">U</text>
+          <text x="38.0" y="43.4" class="level3">&amp;</text>
+        </g>
+      </g>
+      <g transform="translate(510)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">I</text>
+          <text x="38.0" y="43.4" class="level3">*</text>
+        </g>
+      </g>
+      <g transform="translate(570)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">O</text>
+          <text x="38.0" y="43.4" class="level3">'</text>
+        </g>
+      </g>
+      <g transform="translate(630)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">P</text>
+          <text x="38.0" y="43.4" class="level3">0</text>
+        </g>
+      </g>
+    </g>
+  </g>
+
+  <g id="row_AC">
+    <g class="left">
+      <g transform="translate(90)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">A</text>
+          <text x="38.0" y="43.4" class="level3">{</text>
+        </g>
+      </g>
+      <g transform="translate(150)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">S</text>
+          <text x="38.0" y="43.4" class="level3">(</text>
+        </g>
+      </g>
+      <g transform="translate(210)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">D</text>
+          <text x="38.0" y="43.4" class="level3">)</text>
+        </g>
+      </g>
+      <g transform="translate(270)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">F</text>
+          <text x="38.0" y="43.4" class="level3">}</text>
+        </g>
+      </g>
+      <g transform="translate(330)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">G</text>
+          <text x="38.0" y="43.4" class="level3">=</text>
+        </g>
+      </g>
+    </g>
+    <g class="right">
+      <g transform="translate(390)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">H</text>
+          <text x="38.0" y="43.4" class="level3">+</text>
+        </g>
+      </g>
+      <g transform="translate(450)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">J</text>
+          <text x="38.0" y="43.4" class="level3">-</text>
+        </g>
+      </g>
+      <g transform="translate(510)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">K</text>
+          <text x="38.0" y="43.4" class="level3">&lt;</text>
+        </g>
+      </g>
+      <g transform="translate(570)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">L</text>
+          <text x="38.0" y="43.4" class="level3">&gt;</text>
+        </g>
+      </g>
+      <g transform="translate(630)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">;</text>
+          <text x="12.8" y="20.6" class="level2">:</text>
+          <text x="38.0" y="43.4" class="level3">"</text>
+        </g>
+      </g>
+    </g>
+  </g>
+
+  <g id="row_AB">
+    <g class="left">
+      <g transform="translate(90)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">Z</text>
+          <text x="38.0" y="43.4" class="level3">~</text>
+        </g>
+      </g>
+      <g transform="translate(150)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">X</text>
+          <text x="38.0" y="43.4" class="level3">`</text>
+        </g>
+      </g>
+      <g transform="translate(210)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">C</text>
+          <text x="38.0" y="43.4" class="level3">|</text>
+        </g>
+      </g>
+      <g transform="translate(270)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">V</text>
+          <text x="38.0" y="43.4" class="level3">_</text>
+        </g>
+      </g>
+      <g transform="translate(330)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">B</text>
+          <text x="38.0" y="43.4" class="level3">/</text>
+        </g>
+      </g>
+    </g>
+    <g class="right">
+      <g transform="translate(390)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">N</text>
+          <text x="38.0" y="43.4" class="level3">\</text>
+        </g>
+      </g>
+      <g transform="translate(450)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">M</text>
+          <text x="38.0" y="43.4" class="level3">@</text>
+        </g>
+      </g>
+      <g transform="translate(510)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">,</text>
+          <text x="12.8" y="20.6" class="level2">&lt;</text>
+          <text x="38.0" y="43.4" class="level3">#</text>
+        </g>
+      </g>
+      <g transform="translate(570)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">.</text>
+          <text x="12.8" y="20.6" class="level2">&gt;</text>
+          <text x="38.0" y="43.4" class="level3">!</text>
+        </g>
+      </g>
+      <g transform="translate(630)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">/</text>
+          <text x="12.8" y="20.6" class="level2">?</text>
+          <text x="38.0" y="43.4" class="level3">?</text>
+        </g>
+      </g>
+    </g>
+  </g>
+
+  <g id="row_AA">
+    <g class="left">
+      <g class="specialKey" transform="translate(180)">
+        <rect width="82" height="52" rx="5" ry="5"/>
+        <!-- <text x="64.8" y="18.6" text-anchor="middle" style="font-size: 12px;">⌫</text> -->
+        <text x="11.0" y="42.8" class="win gnu">Num</text>
+        <!-- <text x="16.4" y="42.8" class="mac" text-anchor="middle">⌥</text> -->
+      </g>
+    </g>
+    <g class="homeKey" transform="translate(270)">
+      <rect width="232" height="52" rx="5" ry="5"/>
+      <!-- <text x="11.0" y="42.8" class="win gnu">Nav</text> -->
+    </g>
+    <g class="right">
+      <g class="specialKey" transform="translate(510)">
+        <rect width="82" height="52" rx="5" ry="5" style="fill: #aad;"/>
+        <!-- <text x="64.8" y="20.6" text-anchor="middle">⏎</text> -->
+        <text x="11.0" y="42.8" class="win gnu" style="fill: blue;">Symbols</text>
+        <text x="16.4" y="42.8" class="mac" text-anchor="middle">⌥</text>
+      </g>
+    </g>
+  </g>
+
+</svg>

+ 378 - 0
img/symbols39.svg

@@ -0,0 +1,378 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="gnu"
+    viewBox="0 60 900 240">
+    <!-- viewBox="60 60 780 240"> -->
+
+<!--
+  <link xmlns="http://www.w3.org/1999/xhtml" rel="stylesheet"
+      href="42_style.css" type="text/css"/>
+-->
+
+  <style>
+    rect, path {
+      stroke: #666;
+      stroke-width: .5px;
+      fill: #fff;
+    }
+    .specialKey,
+    .specialKey rect {
+      fill: #e4e4e4;
+    }
+    .specialKey text {
+      fill: #333;
+    }
+    text {
+      fill: #333;
+      fill: #ccc;
+      font: normal 20px sans-serif;
+      text-align: center;
+    }
+
+    #row_AD { transform: translate(64px,  64px); }
+    #row_AC { transform: translate(64px, 124px); }
+    #row_AB { transform: translate(64px, 184px); }
+    #row_AA { transform: translate(64px, 244px); }
+
+    /* .left   { transform: translate(-15px, 0); } */
+    /* .right  { transform: translate(+15px, 0); } */
+
+    .specialKey .win,
+    .specialKey .gnu {
+      font-size: 14px;
+    }
+    .specialKey .win,
+    .specialKey .mac,
+    .specialKey .gnu {
+      display: none;
+    }
+    .mac .specialKey .mac,
+    .gnu .specialKey .gnu,
+    .win .specialKey .win { display: block; }
+
+    /* dimmed AltGr + bold dead keys */
+    .level3, .level4 { fill: blue; }
+    .level5, .level6 { fill: green; }
+    .deadKey {
+      /* fill: red; */
+      font-size: 16px;
+      transform: translateY(-3px);
+    }
+    .diacritic {
+      font-size: 24px;
+      font-weight: bolder;
+      transform: translateY(8px);
+    }
+
+    /* hide Level4 (Shift+AltGr) unless AltGr is pressed */
+    .level4        { display: none; }
+    .altgr .level4 { display: block; }
+
+    /* highlight AltGr + Dead Keys */
+    .dk .level1, .altgr .level1,
+    .dk .level2, .altgr .level2 { opacity: 0.25; }
+    .dk .level5, .altgr .level3,
+    .dk .level6, .altgr .level4 { opacity: 1; }
+    .dk .level3,
+    .dk .level4 { display: none; }
+  </style>
+
+  <g id="row_AD">
+    <g class="left">
+      <g transform="translate(30)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="16.4" y="42.8">↹</text>
+          <text x="38.0" y="43.4" class="level3">~</text>
+        </g>
+      </g>
+      <g transform="translate(90)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">Q</text>
+          <text x="38.0" y="43.4" class="level3">!</text>
+        </g>
+      </g>
+      <g transform="translate(150)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">W</text>
+          <text x="38.0" y="43.4" class="level3">@</text>
+        </g>
+      </g>
+      <g transform="translate(210)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">E</text>
+          <text x="38.0" y="43.4" class="level3">#</text>
+        </g>
+      </g>
+      <g transform="translate(270)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">R</text>
+          <text x="38.0" y="43.4" class="level3">$</text>
+        </g>
+      </g>
+      <g transform="translate(330)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">T</text>
+          <text x="38.0" y="43.4" class="level3">%</text>
+        </g>
+      </g>
+    </g>
+    <g class="right">
+      <g transform="translate(390)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">Y</text>
+          <text x="38.0" y="43.4" class="level3">^</text>
+        </g>
+      </g>
+      <g transform="translate(450)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">U</text>
+          <text x="38.0" y="43.4" class="level3">&amp;</text>
+        </g>
+      </g>
+      <g transform="translate(510)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">I</text>
+          <text x="38.0" y="43.4" class="level3">*</text>
+        </g>
+      </g>
+      <g transform="translate(570)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">O</text>
+          <text x="38.0" y="43.4" class="level3">(</text>
+        </g>
+      </g>
+      <g transform="translate(630)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">P</text>
+          <text x="38.0" y="43.4" class="level3">)</text>
+        </g>
+      </g>
+      <g transform="translate(690)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="16.4" y="42.8" style="font-size: 12px;">⌫</text>
+          <text x="38.0" y="43.4" class="level3">"</text>
+        </g>
+      </g>
+    </g>
+  </g>
+
+  <g id="row_AC">
+    <g class="left">
+      <g transform="translate(30)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="16.4" y="42.8">⎋</text>
+          <text x="38.0" y="43.4" class="level3">`</text>
+        </g>
+      </g>
+      <g transform="translate(90)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">A</text>
+          <text x="38.0" y="43.4" class="level3">1</text>
+        </g>
+      </g>
+      <g transform="translate(150)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">S</text>
+          <text x="38.0" y="43.4" class="level3">2</text>
+        </g>
+      </g>
+      <g transform="translate(210)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">D</text>
+          <text x="38.0" y="43.4" class="level3">3</text>
+        </g>
+      </g>
+      <g transform="translate(270)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">F</text>
+          <text x="38.0" y="43.4" class="level3">4</text>
+        </g>
+      </g>
+      <g transform="translate(330)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">G</text>
+          <text x="38.0" y="43.4" class="level3">5</text>
+        </g>
+      </g>
+    </g>
+    <g class="right">
+      <g transform="translate(390)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">H</text>
+          <text x="38.0" y="43.4" class="level3">6</text>
+        </g>
+      </g>
+      <g transform="translate(450)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">J</text>
+          <text x="38.0" y="43.4" class="level3">7</text>
+        </g>
+      </g>
+      <g transform="translate(510)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">K</text>
+          <text x="38.0" y="43.4" class="level3">8</text>
+        </g>
+      </g>
+      <g transform="translate(570)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">L</text>
+          <text x="38.0" y="43.4" class="level3">9</text>
+        </g>
+      </g>
+      <g transform="translate(630)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">;</text>
+          <text x="12.8" y="20.6" class="level2">:</text>
+          <text x="38.0" y="43.4" class="level3">0</text>
+        </g>
+      </g>
+      <g transform="translate(690)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="16.4" y="42.8">⏎</text>
+          <text x="38.0" y="43.4" class="level3">'</text>
+        </g>
+      </g>
+    </g>
+  </g>
+
+  <g id="row_AB">
+    <g class="left">
+      <g transform="translate(30)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="16.4" y="42.8">⇧</text>
+          <text x="38.0" y="43.4" class="level3">&lt;</text>
+        </g>
+      </g>
+      <g transform="translate(90)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">Z</text>
+          <text x="38.0" y="43.4" class="level3">{</text>
+        </g>
+      </g>
+      <g transform="translate(150)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">X</text>
+          <text x="38.0" y="43.4" class="level3">[</text>
+        </g>
+      </g>
+      <g transform="translate(210)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">C</text>
+          <text x="38.0" y="43.4" class="level3">]</text>
+        </g>
+      </g>
+      <g transform="translate(270)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">V</text>
+          <text x="38.0" y="43.4" class="level3">}</text>
+        </g>
+      </g>
+      <g transform="translate(330)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">B</text>
+          <text x="38.0" y="43.4" class="level3">&gt;</text>
+        </g>
+      </g>
+    </g>
+    <g class="right">
+      <g transform="translate(390)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">N</text>
+          <text x="38.0" y="43.4" class="level3">\</text>
+        </g>
+      </g>
+      <g transform="translate(450)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="20.6" class="level2">M</text>
+          <text x="38.0" y="43.4" class="level3">=</text>
+        </g>
+      </g>
+      <g transform="translate(510)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">,</text>
+          <text x="12.8" y="20.6" class="level2">&lt;</text>
+          <text x="38.0" y="43.4" class="level3">-</text>
+        </g>
+      </g>
+      <g transform="translate(570)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">.</text>
+          <text x="12.8" y="20.6" class="level2">&gt;</text>
+          <text x="38.0" y="43.4" class="level3">+</text>
+        </g>
+      </g>
+      <g transform="translate(630)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="12.8" y="43.4" class="level1">/</text>
+          <text x="12.8" y="20.6" class="level2">?</text>
+          <text x="38.0" y="43.4" class="level3">_</text>
+        </g>
+      </g>
+      <g transform="translate(690)">
+        <rect width="52" height="52" rx="5" ry="5"/>
+        <g class="key" text-anchor="middle">
+          <text x="16.4" y="42.8">⇧</text>
+          <text x="38.0" y="43.4" class="level3">|</text>
+        </g>
+      </g>
+    </g>
+  </g>
+
+  <g id="row_AA">
+    <g class="left">
+      <g class="specialKey" transform="translate(180)">
+        <rect width="82" height="52" rx="5" ry="5"/>
+        <text x="64.8" y="18.6" text-anchor="middle" style="font-size: 12px;">⌫</text>
+        <text x="11.0" y="42.8" class="win gnu">Shift</text>
+        <text x="16.4" y="42.8" class="mac" text-anchor="middle">⌥</text>
+      </g>
+    </g>
+    <g class="homeKey" transform="translate(270)">
+      <rect width="232" height="52" rx="5" ry="5"/>
+      <text x="11.0" y="42.8" class="win gnu">Nav</text>
+    </g>
+    <g class="right">
+      <g class="specialKey" transform="translate(510)">
+        <rect width="82" height="52" rx="5" ry="5" style="fill: #aad;"/>
+        <text x="64.8" y="20.6" text-anchor="middle">⏎</text>
+        <text x="11.0" y="42.8" class="win gnu">Sym</text>
+        <text x="16.4" y="42.8" class="mac" text-anchor="middle">⌥</text>
+      </g>
+    </g>
+  </g>
+
+</svg>

+ 78 - 0
kanata.kbd

@@ -0,0 +1,78 @@
+;; ANSI sub-layer (let kanata ignore all other keys)
+(defsrc
+  q    w    e    r    t    y    u    i    o    p
+  a    s    d    f    g    h    j    k    l    ;
+  z    x    c    v    b    n    m    ,    .    /
+       lalt           spc            ralt
+)
+
+;; Base layer (active by default when kanata starts up):
+;;  - home-row mods on SDF and JKL
+;;  - the 3 main thumb keys become mod/taps
+(deflayer qwerty
+  _    _    _    _    _    _    _    _    _    _
+  _    @ss  @dd  @ff  _    _    @jj  @kk  @ll  _
+  _    _    _    _    _    _    _    _    _    _
+       @sft           @nav           @sym
+)
+
+;; Navigation layer:
+;;  - right: Vim-like arrows on HJKL, home/end page up/down, mouse scroll
+;;  - left: one-hand shortcuts (Ctrl-WASZXCV), Tab/Shift-Tab, prev/next
+(deflayer vimnav
+  lrld C-w  bck  fwd  _    home pgdn pgup end  _
+  C-a  C-s S-tab tab  _    lft  down up   rght _
+  C-z  C-x  C-c  C-v  _    @mwl @mwd @mwu @mwr _
+       del            _              esc
+)
+
+;; Symbol layer (just an AltGr layer for now)
+(deflayer symbols
+  RA-q RA-w RA-e RA-r RA-t RA-y RA-u RA-i RA-o RA-p
+  RA-a RA-s RA-d RA-f RA-g RA-h RA-j RA-k RA-l RA-;
+  RA-z RA-x RA-c RA-v RA-b RA-n RA-m RA-, RA-. RA-/
+       @num           spc            -
+)
+
+;; Numrow layer
+(deflayer numrow
+  S-1  S-2  S-3  S-4  S-5  S-6  S-7  S-8  S-9  S-0
+  1    2    3    4    5    6    7    8    9    0
+  _    _    _    _    _    _    -    ,    .    /
+       @sft           S-spc          @alt
+)
+
+;; Special key aliases
+(defalias
+  ;; Main mod-tap: VimNav layer when hold, Space when tapped.
+  ;; The space key must be hold long enough (200ms) to become a layer shift.
+  nav (tap-hold 200 200 spc (layer-toggle vimnav))
+
+  ;; Space-cadet thumb keys: Shift/BackSpace, AltGr/Return
+  ;;  - acts as a modifier by default, or as BS/Ret when tapped separately;
+  ;;  - works great with Qwerty-Lafayette and Ergo-L keyboard layouts, where
+  ;;    neither Shift nor AltGr are used outside of the 3×10 main alpha keys.
+  sft (tap-hold-press 200 200 bspc lsft)
+  alt (tap-hold-press 200 200 ret ralt)
+  sym (tap-hold-press 200 200 ret (layer-toggle symbols))
+
+  ;; NumRow layer shifter
+  num (layer-toggle numrow)
+
+  ;; Home-row mods
+  ;; Must be hold long enough (200ms) to become a modifier.
+  ss (tap-hold 200 200 s lmet)
+  dd (tap-hold 200 200 d lalt)
+  ff (tap-hold 200 200 f lctl)
+  jj (tap-hold 200 200 j rctl)
+  kk (tap-hold 200 200 k lalt)
+  ll (tap-hold 200 200 l rmet)
+
+  ;; Mouse wheel emulation
+  mwu (mwheel-up    50 120)
+  mwd (mwheel-down  50 120)
+  mwl (mwheel-left  50 120)
+  mwr (mwheel-right 50 120)
+)
+
+;; vim: set ft=lisp