summaryrefslogtreecommitdiff
path: root/keyboards/jj40/keymaps/stevexyz
diff options
context:
space:
mode:
authorStefano <warste@gmail.com>2019-08-24 18:08:54 +0200
committerDrashna Jaelre <drashna@live.com>2019-08-24 09:08:54 -0700
commitc9c33978ce4a86452503711a580107af13fa947d (patch)
tree4ed7c7ad29f785788ce8107af666e4661b082aea /keyboards/jj40/keymaps/stevexyz
parent2c8d8be7187e800cfd465674449255b25e5d02b9 (diff)
[Keymap] a keymap to "transform" a jj40 info a simil Alpha28, to enjoy its simplicity and power (#6599)
Diffstat (limited to 'keyboards/jj40/keymaps/stevexyz')
-rw-r--r--keyboards/jj40/keymaps/stevexyz/config.h45
-rw-r--r--keyboards/jj40/keymaps/stevexyz/keyboard-layout-editor-raw-data.txt4
-rw-r--r--keyboards/jj40/keymaps/stevexyz/keymap.c292
-rw-r--r--keyboards/jj40/keymaps/stevexyz/readme.md20
-rw-r--r--keyboards/jj40/keymaps/stevexyz/rules.mk22
5 files changed, 383 insertions, 0 deletions
diff --git a/keyboards/jj40/keymaps/stevexyz/config.h b/keyboards/jj40/keymaps/stevexyz/config.h
new file mode 100644
index 0000000000..4d4825f9b6
--- /dev/null
+++ b/keyboards/jj40/keymaps/stevexyz/config.h
@@ -0,0 +1,45 @@
+
+// Behaviors That Can Be Configured
+
+#define TAPPING_TERM 250
+ // how long before a tap becomes a hold, if set above 500, a key tapped during the tapping term will turn it into a hold too
+
+#define PERMISSIVE_HOLD
+ // makes tap and hold keys trigger the hold if another key is pressed before releasing, even if it hasn't hit the TAPPING_TERM
+#define IGNORE_MOD_TAP_INTERRUPT
+ // makes it possible to do rolling combos (zx) with keys that convert to other keys on hold, by enforcing the TAPPING_TERM for both keys.
+
+/*
+ #define TAPPING_TERM_PER_KEY
+ // enables handling for per key TAPPING_TERM settings
+ #define RETRO_TAPPING
+ // tap anyway, even after TAPPING_TERM, if there was no other key interruption between press and release
+ // See Retro Tapping for details
+ #define TAPPING_TOGGLE 2
+ // how many taps before triggering the toggle
+ #define TAPPING_FORCE_HOLD
+ // makes it possible to use a dual role key as modifier shortly after having been tapped
+ // See Hold after tap
+ // Breaks any Tap Toggle functionality (TT or the One Shot Tap Toggle)
+ #define LEADER_TIMEOUT 300
+ // how long before the leader key times out
+ // If you're having issues finishing the sequence before it times out, you may need to increase the timeout setting. Or you may want to enable the LEADER_PER_KEY_TIMING option, which resets the timeout after each key is tapped.
+ #define LEADER_PER_KEY_TIMING
+ // sets the timer for leader key chords to run on each key press rather than overall
+ #define LEADER_KEY_STRICT_KEY_PROCESSING
+ // Disables keycode filtering for Mod-Tap and Layer-Tap keycodes. Eg, if you enable this, you would need to specify MT(MOD_CTL, KC_A) if you want to use KC_A.
+ #define ONESHOT_TIMEOUT 300
+ // how long before oneshot times out
+ #define ONESHOT_TAP_TOGGLE 2
+ // how many taps before oneshot toggle is triggered
+ #define QMK_KEYS_PER_SCAN 4
+ // Allows sending more than one key per scan. By default, only one key event gets sent via process_record() per scan. This has little impact on most typing, but if you're doing a lot of chords, or your scan rate is slow to begin with, you can have some delay in processing key events. Each press and release is a separate event. For a keyboard with 1ms or so scan times, even a very fast typist isn't going to produce the 500 keystrokes a second needed to actually get more than a few ms of delay from this. But if you're doing chording on something with 3-4ms scan times? You probably want this.
+ #define COMBO_COUNT 2
+ // Set this to the number of combos that you're using in the Combo feature.
+ #define COMBO_TERM 200
+ // how long for the Combo keys to be detected. Defaults to TAPPING_TERM if not defined.
+ #define TAP_CODE_DELAY 100
+ // Sets the delay between register_code and unregister_code, if you're having issues with it registering properly (common on VUSB boards). The value is in milliseconds.
+ #define TAP_HOLD_CAPS_DELAY 80
+ // Sets the delay for Tap Hold keys (LT, MT) when using KC_CAPSLOCK keycode, as this has some special handling on MacOS. The value is in milliseconds, and defaults to 80 ms if not defined. For macOS, you may want to set this to 200 or higher.
+*/
diff --git a/keyboards/jj40/keymaps/stevexyz/keyboard-layout-editor-raw-data.txt b/keyboards/jj40/keymaps/stevexyz/keyboard-layout-editor-raw-data.txt
new file mode 100644
index 0000000000..0117b5e2ee
--- /dev/null
+++ b/keyboards/jj40/keymaps/stevexyz/keyboard-layout-editor-raw-data.txt
@@ -0,0 +1,4 @@
+[{c:"#eeddcc",g:true,a:7},"","","","","","","","","","","",""],
+["",{c:"#cccccc",g:false,a:4,fa:[2,1,5,5,8]},"F11\nF1\n!\n1\nQ","F12\nF2\n@\n2\nW","Layer Num\nF3\n#\n3\nE","Layer Light\nF4\n$\n4\nR","\nF5\n%\n5\nT","\nF6\n^\n6\nY","\nF7\n&\n7\nU","\nF8\n*\n8\nI","Layer Mouse\nF9\n(\n9\nO","\nF10\n)\n0\nP",{c:"#eeddcc",g:true,a:7},""],
+["",{c:"#cccccc",t:"#000000\n\n\n\n\n\n\n\n\n\n#804020",g:false,a:4,fa:[2,1,5,5,8,0,2,2,0,0,1]},"Caps\n\n\n\nA\n\nEsc\nTab\n\n\nshift",{fa:[2,2,5,5,8,0,2,2,0,0,1]},"<i class='fa fa-volume-off'></i>\n<i class='fa fa-angle-double-left'></i>\n~\n`\nS\n\n\n\n\n\nfn","<i class='fa fa-volume-down'></i>\n<i class='fa fa-angle-double-down'></i>\n_\n-\nD\n\n\n\n\n\nnum",{t:"#000000"},"<i class='fa fa-volume-up'></i>\n<i class='fa fa-angle-double-up'></i>\n+\n=\nF",{t:"#000000\n\n\n\n\n\n\n\n\n\n#804020"},"<i class='fa fa-play'></i>\n<i class='fa fa-angle-double-right'></i>\n{\n[\nG\n\n\n\n\n\n<i class='fa fa-apple'></i>","<i class='fa fa-step-forward'></i>\n<i class='fa fa-arrow-left'></i>\n}\n]\nH\n\n\n\n\n\n<i class='fa fa-apple'></i>",{t:"#000000"},"\n<i class='fa fa-arrow-down'></i>\n|\n\\\nJ",{t:"#000000\n\n\n\n\n\n\n\n\n\n#804020"},"\n<i class='fa fa-arrow-up'></i>\n:\n;\nK\n\n\n\n\n\nfn","\n<i class='fa fa-arrow-right'></i>\n\"\n'\nL\n\n\n\n\n\nnum",{c:"#eeddcc",f:1,fa:[2,2,5,5,8,0,2,2,0,0,0]},"Ins\n\n\n\n\n\nBS\nDel\n\n\nshift",{t:"#000000",g:true,a:7,f:3},""],
+["","",{c:"#cccccc",t:"#000000\n#804020",g:false,a:5,fa:[0,1,0,0,8]},"\nctrl\n\n\nZ","\nalt\n\n\nX",{t:"#000000\n\n\n\n\n\n\n\n\n\n#804020",a:4,fa:[2,1,0,0,8,0,0,0,0,0,1]},"^\n\n\n\nC\n\n\n\n\n\nfn","^\n\n\n\nV\n\n\n\n\n\nnum",{fa:[2,1,5,5,8,0,0,0,0,0,1]},"Prnt Scrn\n\n<\n,\nB\n\n\n\n\n\nshift","Scr Lock\n\n>\n.\nN\n\n\n\n\n\nalt","Paus\n\n?\n/\nM\n\n\n\n\n\nctrl",{t:"#000000\n#804020",a:5},"\nshift",{c:"#eeddcc",t:"#000000",g:true,a:7},"",""]
diff --git a/keyboards/jj40/keymaps/stevexyz/keymap.c b/keyboards/jj40/keymaps/stevexyz/keymap.c
new file mode 100644
index 0000000000..4045d07109
--- /dev/null
+++ b/keyboards/jj40/keymaps/stevexyz/keymap.c
@@ -0,0 +1,292 @@
+/* Copyright 2019 Stefano Marago'
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+/*
+ * This file is the QMK keymap to configure an ortholinear 40% keyboard
+ * (with 48 keys) into an ortholinear alpha-vderm 28 keys inspired layout
+ * "rules.mk" and "config.h" complete the configuration
+ */
+
+
+#include QMK_KEYBOARD_H
+
+enum layers {
+ LAYER_HOME, // home base layer
+ LAYER_FUNC, // function keys and cursors
+ LAYER_NUMSYM, // numbers and other characters
+ LAYER_SYST, // media and other system keys
+ LAYER_NUMONLY, // numeric keypad
+ LAYER_LIGHTS, // numeric keypad
+ LAYER_MOUSE, // mouse layer
+};
+
+enum custom_keycodes {
+ CK_TRIPLEZERO = SAFE_RANGE,
+};
+
+enum {
+ TD_ENT_BSPC = 0,
+ TD_KPENT_BSPC,
+ TD_E_GRAVE,
+ TD_A_GRAVE,
+ TD_O_GRAVE,
+ TD_U_GRAVE,
+ TD_I_GRAVE,
+ TD_E_ACUTE,
+};
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_ENT_BSPC] = ACTION_TAP_DANCE_DOUBLE(KC_ENT, KC_BSPC),
+ [TD_KPENT_BSPC] = ACTION_TAP_DANCE_DOUBLE(KC_KP_ENTER, KC_BSPC),
+ [TD_E_GRAVE] = ACTION_TAP_DANCE_DOUBLE(KC_E, KC_E),
+};
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/*
+ * LEGEND:
+ *
+ * ,--------------------------------.
+ * | Top row: shifted character |
+ * | Central row: standard char |
+ * | Bottom row: hold modifier |
+ * `--------------------------------'
+ *
+ * "____" means free to be assigned
+ *
+ */
+
+
+/* Qwerty Home Layer
+ * ,-----------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * | | Q | W | E | R | T | Y | U | I | O | P | |
+ * | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * | | A | S | D | F | G | H | J | K | L | Enter| |
+ * | | Shift| FnNav|NumSym| ____ | OSkey| OSkey| ____ | FnNav|NumSym| Shift| |
+ * |------+------+------+------+------+------+------|------+------+------+------+------+
+ * | | | | | | | | | | | | |
+ * | | | Z | X | C | V | B | N | M | Space| | |
+ * | | | Ctrl | Alt | FnNav|NumSym| Shift| Alt | Ctrl | Shift| | |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [LAYER_HOME] = LAYOUT_ortho_4x12(
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, XXXXXXX,
+ XXXXXXX, MT(MOD_LSFT, KC_A), LT(LAYER_FUNC, KC_S), LT(LAYER_NUMSYM, KC_D), KC_F, MT(MOD_LGUI, KC_G), MT(MOD_RGUI, KC_H), KC_J, LT(LAYER_FUNC, KC_K), LT(LAYER_NUMSYM, KC_L), MT(MOD_RSFT, KC_ENT), XXXXXXX,
+ XXXXXXX, XXXXXXX, MT(MOD_LCTL, KC_Z), MT(MOD_LALT, KC_X), LT(LAYER_FUNC, KC_C), LT(LAYER_NUMSYM, KC_V), MT(MOD_LSFT, KC_B), MT(MOD_RALT, KC_N), MT(MOD_RCTL, KC_M), MT(MOD_RSFT, KC_SPC), XXXXXXX, XXXXXXX ),
+
+/* Function and Navigation Layer
+ * ,-----------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | |
+ * | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * | | ESC | Home | PgDn | PgUp | End | Left | Down | Up | Right| Baksp| |
+ * | | Shift|xxxxxx|SysLay| ____ | ____ | ____ | ____ |xxxxxx|SysLay| Shift| |
+ * |------+------+------+------+------+------+------|------+------+------+------+------+
+ * | | | | | | | | | | | | |
+ * | | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | | |
+ * | | | Ctrl | Alt |xxxxxx|SysLay| Shift| Alt | Ctrl | Shift| | |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [LAYER_FUNC] = LAYOUT_ortho_4x12(
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX,
+ XXXXXXX, MT(MOD_LSFT, KC_ESC), KC_HOME, LT(LAYER_SYST, KC_PGDN), KC_PGUP, KC_END, KC_LEFT, KC_DOWN, KC_UP, LT(LAYER_SYST, KC_RGHT), MT(MOD_RSFT, KC_BSPC), XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_LCTL, KC_LALT, KC_TRNS, MO(LAYER_SYST), KC_LSFT, KC_RALT, KC_RCTL, MT(MOD_RSFT, KC_SPC), XXXXXXX, XXXXXXX ),
+
+/* Number and Symbols Layer
+ * ,-----------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | ! | @ | # | $ | % | ^ | & | * | ( | ) | |
+ * | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | |
+ * | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | ~ | _ | + | { | } | | | : | " | | |
+ * | | TAB | ` | - | = | [ | ] | \ | ; | ' | | |
+ * | | Shift|SysLay|xxxxxx| ____ | ____ | ____ | ____ |SysLay|xxxxxx| Shift| |
+ * |------+------+------+------+------+------+------|------+------+------+------+------+
+ * | | | | | | | < | > | ? | | | |
+ * | | | ____ | ____ | ____ | ____ | , | . | / | ____ | | |
+ * | | | Ctrl | Alt |SysLay|xxxxxx| Shift| ____ | ____ | Shift| | |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [LAYER_NUMSYM] = LAYOUT_ortho_4x12(
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, XXXXXXX,
+ XXXXXXX, MT(MOD_LSFT, KC_TAB), LT(LAYER_SYST, KC_GRV), KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, LT(LAYER_SYST, KC_SCLN), KC_QUOT, MT(MOD_RSFT, KC_DEL), XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_LCTL, KC_LALT, MO(LAYER_SYST), KC_TRNS, MT(MOD_LSFT, KC_COMM), KC_DOT, KC_SLSH, MT(MOD_RSFT, KC_SPC), XXXXXXX, XXXXXXX ),
+
+/* System Layer
+ * ,-----------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * | | F11 | F12 |NumLay|LghLay| ____ | ____ | ____ | ____ |MouLay|Backsp| |
+ * | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * | | Caps | Mute | Vol- | Vol+ | Play | Next | ____ | ____ | ____ | Ins | |
+ * | | Shift| ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | Shift| |
+ * |------+------+------+------+------+------+------|------+------+------+------+------+
+ * | | | | | | | | | | | | |
+ * | | | ____ | ____ | ____ | ____ |PrnScr|ScrLck|Pause | ____ | | |
+ * | | | Ctrl | Alt | ____ | ____ | ____ | ____ | ____ | Shift| | |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [LAYER_SYST] = LAYOUT_ortho_4x12(
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_F11, KC_F12, TG(LAYER_NUMONLY), TG(LAYER_LIGHTS), KC_NO, KC_NO, KC_NO, KC_NO, TG(LAYER_MOUSE), KC_BSPC, XXXXXXX,
+ XXXXXXX, MT(MOD_LSFT, KC_CAPS), KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY, KC_MNXT, KC_NO, KC_NO, KC_NO, MT(MOD_RSFT, KC_INS), XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_LCTL, KC_LALT, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, MT(MOD_RSFT, KC_SPC), XXXXXXX, XXXXXXX ),
+
+/* Numeric Keypad
+ * ,-----------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * | |NumLck| ____ |NumLay| / | * | - | 7 | 8 | 9 |Backsp| |
+ * | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * | | Tab | ( | ) | = | , | + | 4 | 5 | 6 | Enter| |
+ * | | Shift| ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | Shift| |
+ * |------+------+------+------+------+------+------|------+------+------+------+------+
+ * | | | | | | | | | | | | |
+ * | | | ____ | ____ | 000 | . | 0 | 1 | 2 | 3 | | |
+ * | | | Ctrl | Alt | ____ | ____ | ____ | ____ | ____ | Shift| | |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [LAYER_NUMONLY] = LAYOUT_ortho_4x12(
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_NLCK, KC_NO, TG(LAYER_NUMONLY), KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, KC_P7, KC_P8, KC_P9, KC_BSPC, XXXXXXX,
+ XXXXXXX, MT(MOD_LSFT, KC_TAB), KC_LPRN, KC_RPRN, KC_EQUAL, KC_KP_COMMA, KC_KP_PLUS, KC_P4, KC_P5, KC_P6, MT(MOD_LSFT, KC_KP_ENTER), XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_LCTL, KC_LALT, CK_TRIPLEZERO, KC_KP_DOT, KC_P0, KC_P1, KC_P2, MT(MOD_LSFT, KC_P3), XXXXXXX, XXXXXXX ),
+
+/* Backlight adjustment Layer
+ * ,-----------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * | | ____ | ____ | ____ |LghLay| ____ | Hue+ | Sat+ | Val+ | ____ | Plain| |
+ * | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * | | ____ | ____ |ModeFw|ModeBw| ____ | Hue- | Sat- | Val- | ____ |Toggle| |
+ * | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | |
+ * |------+------+------+------+------+------+------|------+------+------+------+------+
+ * | | | | | | | | | | | | |
+ * | | |Breath|Rainbw| Swirl| Snake|Knight| XMas |Gradnt| Test | | |
+ * | | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [LAYER_LIGHTS] = LAYOUT_ortho_4x12(
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_NO, KC_NO, KC_NO, TG(LAYER_LIGHTS), KC_NO, RGB_HUI, RGB_SAI, RGB_VAI, KC_NO, RGB_M_P, XXXXXXX,
+ XXXXXXX, KC_NO, KC_NO, RGB_MOD, RGB_RMOD, KC_NO, RGB_HUD, RGB_SAD, RGB_VAD, KC_NO, RGB_TOG, XXXXXXX,
+ XXXXXXX, XXXXXXX, RGB_MODE_BREATHE, RGB_MODE_RAINBOW, RGB_MODE_SWIRL, RGB_MODE_SNAKE, RGB_MODE_KNIGHT, RGB_MODE_XMAS, RGB_MODE_GRADIENT, RGB_MODE_RGBTEST, XXXXXXX, XXXXXXX ),
+
+/* Mouse emulation Layer
+ * ,-----------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * | | Btn1 | Up | Btn2 | Whl+ | Accl0| Accl1| Accl2| ____ |MouLay| ____ | |
+ * | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * | | Left | Down | Right| Whl- | ____ | ____ | ____ | ____ | ____ | Enter| |
+ * | | ____ | ____ | ____ | ____ | OSkey| OSkey| ____ | ____ | ____ | ____ | |
+ * |------+------+------+------+------+------+------|------+------+------+------+------+
+ * | | | | | | | | | | | | |
+ * | | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | Space| | |
+ * | | | Ctrl | Alt | ____ | ____ | Shift| Alt | Ctrl | Shift| | |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [LAYER_MOUSE] = LAYOUT_ortho_4x12(
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, KC_MS_WH_UP, KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, KC_NO, TG(LAYER_MOUSE), KC_NO, XXXXXXX,
+ XXXXXXX, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_DOWN, KC_LGUI, KC_RGUI, KC_NO, KC_NO, KC_NO, KC_ENT, XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_LCTL, KC_LALT, KC_NO, KC_NO, KC_LSFT, KC_RALT, KC_RCTL, MT(MOD_RSFT, KC_SPC), XXXXXXX, XXXXXXX ),
+
+};
+
+
+void matrix_init_user(void) {
+ // set num lock on at start independently of state (for numonly layer to work)
+ if (!(host_keyboard_leds() & (1<<USB_LED_NUM_LOCK))) {
+ SEND_STRING(SS_TAP(X_NUMLOCK)); //register_code(KC_NUMLOCK); unregister_code(KC_NUMLOCK);
+ }
+}
+
+void matrix_scan_user(void) {
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case CK_TRIPLEZERO:
+ if (record->event.pressed) {
+ SEND_STRING("000");
+ } // else { when released... }
+ break;
+ }
+ return true;
+};
+
+
+/* Empty keyboard template
+ * ,-----------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | |
+ * | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | |
+ * | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | |
+ * |------+------+------+------+------+------+------|------+------+------+------+------+
+ * | | | | | | | | | | | | |
+ * | | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | | |
+ * | | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | | |
+ * `-----------------------------------------------------------------------------------'
+ */
diff --git a/keyboards/jj40/keymaps/stevexyz/readme.md b/keyboards/jj40/keymaps/stevexyz/readme.md
new file mode 100644
index 0000000000..d404bcc0bd
--- /dev/null
+++ b/keyboards/jj40/keymaps/stevexyz/readme.md
@@ -0,0 +1,20 @@
+# jj28 (aka jj40 super micro edition :))
+
+With this configuration a 4x12 jj40 (with 48 keys) is transformed into an ortholinear PyroL-vderm 28 keys inspired layout one. This keyboard can be actually called jj28!
+
+![Bare layout](https://i.ibb.co/7GK1LY7/layout-0.jpg)
+
+![Fully described](https://i.ibb.co/kxTfTXH/layout-4.jpg)
+
+Why you should want to do something like this?
+There are many valid reasons.
+The main one to me might just be to be able to test such an "extreme" configuration for real if you have this easily available board on hand.
+But also because this setup might be even more confortable than the original 2u space one (for muscle memory having bnm letters nearer to zxcv).
+Or just more nice looking.
+Surely you have an additional option, and personally, after using it as a daily driver, I liked it, even if I was a bit slower in processing complicated sequences! :)
+
+Notes on layout:
+After few tests I found out that the space at the end is the best for people that are very used to “standard” keyboards (basically almost everybody), retaining years of muscle memory.
+Moreover, also shift, fn and numsym layer keys are good to be replicated on central line (and also keeping in the order will allow a single finger shift+fn on the left and also shift+num on the right).
+
+[Keyboard layout editor](http://www.keyboard-layout-editor.com/#/) raw data in keyboard-layout-editor-raw-data.txt file.
diff --git a/keyboards/jj40/keymaps/stevexyz/rules.mk b/keyboards/jj40/keymaps/stevexyz/rules.mk
new file mode 100644
index 0000000000..612e5d7750
--- /dev/null
+++ b/keyboards/jj40/keymaps/stevexyz/rules.mk
@@ -0,0 +1,22 @@
+# Build Options (yes/no)
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = no # Console for debug(+400)
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # USB Nkey Rollover (see: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work)
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+RGBLIGHT_CUSTOM_DRIVER = yes
+MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400)
+
+TAP_DANCE_ENABLE = yes
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend