/*
 * License (GPL):
  
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/>.

 * © 2019,2020 by Jos Boersema
 *
 */


// ------------------------------------- ⬇ --------------------------------------
//                                 Configuration:
// ------------------------------------- ⬇ --------------------------------------

  // (For the non-coders: 
  // “_Remove_” means to place ‛//’ in front of a line. The rest of the line becomes a comment.
  // Placing ‛//’ in front of a line, means whatever follows it will be ignored during compilation.
  // “_Activate_”   means to *delete* the two ‛//’ in front. Now the rest of the line *will* be compiled
  // /* ... */ is another a way to turn “...” into being a comment which is ignored during compilation.
  // (The documentation here is geared toward people who have no understanding about programming.)

       /*
        --------------------------------------------------------------------------------------
                                                                                          ----
                                                                                            --
                                                                                             -
          Table of Contents:
         
                            -0- ➡ Compact configuration file ⬅

                            -1- ➡ Letters / Numbers & Symbols layouts ⬅
                    • Qwerty
                    • Qwerty with Base arrows
                    • Dvorak
                    • Dvorak descramble mode
                    • Colemak
                    • Workman
                    • Numpad

                            -2- ➡ Eviscerations ( ① / ② ) ⬅
                    • Single layout

                            -3- ➡ Startup settings ⬅
                    • Alternate Base
                    • Leds on/off at startup.
                    • Speed measuring
                    • Text size counting ⬅

                            -4- ➡ How many hardware keys 1st row ⬅

                            -5- ⚠ ≠ Minivan ⬅

                            -6- ➡ Defining the meaning of the additional hardware keys ⬅
                    • Defining the additional key for 'South paw' (also called 'Command')
                    • Defining 'Arrow' hardware layout additional keys

                            -7- ➡ Arrows/Navigation cluster ⬅
                    • Navigation cluster configuration
                    • VI editor arrows

                            -8- ➡ Number pad Configuration⬅

                            -9- ➡ Speed measuring ⬅

                           -10- ➡ Some alternative keys ⬅
                    • Right Alt or hold(_RAR) on Base
                    • GUI left/right
                    • Alternate currency symbol
                    • Check boxes or Pointers
                    • Switch _ACC/_BON ⬅➡ *left* side _NSY/_DRA hold keys
                    • Switch _PAD ⬅➡ _MOV on Left Shift toggle
                    • Switch _FUN ⬅➡ _RAR on Right Shift toggle
                    • “Switch spacebars”: ‛Space-bar’ ⬅➡ “‛Enter’ + ‛layer-hold _MOV’”

                           -11- ➡ Eviscerations ( ② / ② ) ⬅
                    • Removing the numbers pad _PAD layer
                    • Removing one or more of the Unicode layers _ACC, _DRA or_BON
                    • Removing groups of characters

                           -12- ➡ Leds ⬅
        - 
        --
        ----
        --------------------------------------------------------------------------------------
        */

       /*                   -0- ➡ Compact configuration file ⬅
        *
        * If you _activate_ this, this whole heavily documented configuration block below
        * gets skipped, and instead a bare bones configuration file with all these same options
        * gets read. There is no functional difference.
        * 
        * (You can use the compact configuration if you like that better. It can make communicating
        * a configuration easier. The fully documented configuration is left in a state of default
        * when uploaded to QMK, so that it gives the most commonly used layout: Qwerty with Numpad,
        * basic 44 Minivan keys. The compact version its state is whatever it is.)
        */
//#define MINIFAN_CONFIG_COMPACT // _Activate_ this, to load the configuration in ./minifan_config_compact.h (note: mini‛f’an).
#ifndef MINIFAN_CONFIG_COMPACT // (don't alter this)

      
       /*                   -1- ➡ Letters / Numbers & Symbols layouts ⬅
        *
        * Here you can configure what letters layer (BASE layer), and number&symbols layer you
        * want. This is a dual layout system, so you can choose a second pair as well. You can
        * switch between them with a key on the _RAR layer. All the other layers are the same,
        * regardless of your choice in letter/number&symbol layers.
        *
        * The letters layer is the BASE layer, from which you also reach all other layers.
        * The letters it has is the alphabet in its simplest form: abcdefghijklmnopqrstuvwxyz.
        * The numbers & symbols layer has what you find on any regular keyboard: 123… !@#… []/…
        * The numbers & symbols layer is made to fit the Letters layer, due to small differences
        * between layouts like Qwerty and Dvorak (in this case the symbols ‛-’, ‛/’, ‛?’, and ‛_’).
        *
        * Example: A Qwerty letters layer, with a fitting numbers & symbols layer, as ‛Default’.
        *          A Dvorak letters layer, with a fitting numbers & symbols layer, as ‛Alternate’.
        *
        * You will be asked to configure one layout as ‛Default’ and another as ‛Alternate’.
        *
        * A bases layout may have locally re-defined one or more of the common layers. If you
        * choose two bases layouts who re-define the same common layer locally, you will need
        * to choose either one by commenting out the other.
        */
        // 
        //          • Qwerty
        //                   (a regular Qwerty layout)
        //  _Activate_ one of these two, _remove_ the other.
  #define BASE_QWERTY__DEF_BASE // _Activate_ if you want Qwerty on the ‛Default’ spot
//#define BASE_QWERTY__ALT_BASE // _Activate_ if you want Qwerty on the ‛Alternate’ spot
        //                   Note: you still need to set if you have the additional ‛arrow’ hardware key. You
        //                         can ignore what it should be defined as, because it will be a plain arrow on Base.
        // 
        //          • Qwerty with Base arrows
        //                   (provides direct access to arrows)
        //  _Activate_ one of these two, _remove_ the other.
//#define BASE_QWERTY_BASEARROW__DEF_BASE // _Activate_ if you want Qwerty with Base arrows on the ‛Default’ spot
//#define BASE_QWERTY_BASEARROW__ALT_BASE // _Activate_ if you want Qwerty with Base arrows on the ‛Alternate’ spot
        //
        //          • Dvorak
        //                  (a regular Dvorak layout)
        // _Activate_ one of these two, _remove_ the other.
//#define BASE_DVORAK__DEF_BASE // _Activate_ if you want Dvorak on the ‛Default’ spot
//#define BASE_DVORAK__ALT_BASE // _Activate_ if you want Dvorak on the ‛Alternate’ spot
        // 
        //          • Dvorak descramble mode
        //                  (Dvorak for a computer already remapping to Dvorak)
        //  This layout is only available on ‛Alternate’, because of the special _HALF_ descramble mode.
//#define BASE_DVORAK_DESCRAMBLE__ALT_BASE // _Activate_ if you want Dvorak on the ‛Alternate’ spot
        // 
        //          • Colemak
        //                   (a regular Colemak layout)
        //  _Activate_ one of these two, _remove_ the other.
//#define BASE_COLEMAK__DEF_BASE // _Activate_ if you want Colemak on the ‛Default’ spot
//#define BASE_COLEMAK__ALT_BASE // _Activate_ if you want Colemak on the ‛Alternate’ spot
        // 
        //          • Workman
        //                   (a regular Workman layout)
        //  _Activate_ one of these two, _remove_ the other.
//#define BASE_WORKMAN__DEF_BASE // _Activate_ if you want Workman on the ‛Default’ spot
//#define BASE_WORKMAN__ALT_BASE // _Activate_ if you want Workman on the ‛Alternate’ spot
        // 
        //          • Numpad
        //                   (a numerical keypad, one for left hand and one for right hand)
        //  _Activate_ to get Numpad on Alternate. There is no option for Numpad on ‛Default’ base.
  #define BASE_NUMPAD__ALT_BASE // _Activate_ if you want Numpad on the ‛Alternate’ spot
        // ➡ ➡ ➡ This Base layer has configuration options at the top of its file. See ./base_numpad.c
        //
        /*                  -2- ➡ Eviscerations ( ① / ② ) ⬅
         */
        /*          • Single layout
         *
         * Removes the ‛Alternate’ base layers, and removes the switch key on _RAR.
         * ⚠ You have to not define a ‛Alternate’ base layer pair. Define only a ‛Default’ pair.
         */
//#define MINIFAN_SINGLE_LAYOUT // _Activate_ to only have the ‛Default’ base layers, _remove_ to also have ‛Alternate’.


        /*                  -3- ➡ Startup settings ⬅
         */
        /*          • Alternate Base
         *
         * You can define which of the two BASE layers is on when powering up the keyboard.
         */
//#define STARTUP_ALTERNATE // Example: For BASES_QWERTY_DVORAK defined: _remove_ is startup in Qwerty, _active_ is
                            //          startup in Dvorak
        /*          • Leds on/off at startup.
         */
//#define STARTUP_SIDE_LEDS_OFF // _Activate_ to have side leds be off at keyboard startup (when you plug it in / computer powers on).
//#define STARTUP_MID_LED_OFF // _Activate_ to have middle led be off at keyboard startup.
        //
        /*          • Speed measuring
         */
//#define STARTUP_SPEED // _Activate_ for default speed measuring on, _remove_ to set off at startup.
        //
        /*          • Text size counting ⬅
         */
//#define STARTUP_COUNT // _Activate_ for default character/word counting on, _remove_ to set off at startup.



        /*                  -4- ➡ How many hardware keys 1st row ⬅
         *
         * Define how many keys your keyboard has.
         */
         // Default               (12x12x12x8 keys)
         //'Command'              (12x12x12x9 keys) + key on the left
         //'Arrow'                (12x12x12x9 keys) + key on the right
         //'South paw' + 'Arrow'  (12x12x12x10 keys)
//#define MORE_KEY__COMMAND // Additional key 1st row on the left. This hardware layout is called 'Command' or 'South paw'.
//#define MORE_KEY__ARROW   // Additional key 1st row (counting from row with space-bar) on the right, called 'Arrow' layout. 
         //
         // See below for how to define your additional key(s).


        /*                  -5- ⚠ ≠ Minivan ⬅
         *
         * This section is for when you want to flash this keymap unto a board with more
         * keys than the Minivan has. 
         *
         *       Trans-Minivan keymap: 12x12x12x11, 12x12x12x12, 12x12x12x13 keys
         *                                          Example board: Planck (12x12x12x12)
         *
         * It is assumed that you enabled MORE_KEY__ARROW and
         * MORE_KEY__COMMAND, to get to 12x12x12x10 keys. With this you
         * can get to one, two or three more keys on row 1, without manually
         * editing all layers. You could first edit the definition on layers that you have
         * a specific meaning for these keys, and let the rest be patched with the definitions
         * here.
         *
         * It can help to inspect the preprocessing with > gcc -E keymap.c | less
         *
         *                        Planck keyboard
         *
         * The identifier TRANSMINIVAN_MIDLEFT could help compile the layout on a Planck keyboard,
         * if it has a two unit large spacebar. You compile without TRANSMINIVAN_LEFTSIDE in that case.
         * All keys on the left, row 1 (closest to the user) shift one unit to the left, with TRANS_MIDLEFT
         * inserted on what would be the left key of the two unit spacebar (assuming that is a key).
         *
         *                         Other keyboards formats
         *
         * It is always possible to just padd the rows somewhere, if you have even more keys. On the other
         * hand, to try to cut this layout down to fewer keys than it has at minimum (12x12x12x8), is likely
         * going to reduce its functionality, and will require some puzzling to keep a well organized BASE
         * layer, and have “hold key” layer switching work correctly.
         *
         * FIXME: not been compiled or tested for any boards.
         */
//#define TRANSMINIVAN_LAYOUT ....... // Set this to something with the needed amount of keycodes.
                          // Your values are inserted here: [ _LTR ] = LAYOUT_redefined (
                          //                                           ^^^^^^^^^^^^^^^^ (throughout all layers)
//#define TRANSMINIVAN_LEFTSIDE  // _Activate_ to get yet one more key on the left side row 1
  #define TRANS_LEFT XXXXXXX     // Define what the TRANSMINIVAN_LEFTSIDE key should be, where it is not otherwise defined.
                                 // (Ignored if TRANSMINIVAN_LEFTSIDE is _removed_).
                                 //
//#define TRANSMINIVAN_MIDLEFT   // _Activate_ to get yet one more key on the first key from center, row 1.
  #define TRANS_MIDLEFT XXXXXXX  // Define what the TRANSMINIVAN_RIGHTSIDE key should be on all layers at once.
                                 // (Ignored if TRANSMINIVAN_MIDLEFT is _removed_).
                                 //
//#define TRANSMINIVAN_RIGHTSIDE // _Activate_ to get yet one more key on the right side row 1
  #define TRANS_RIGHT XXXXXXX    // Define what the TRANSMINIVAN_RIGHTSIDE key should be, where it is not otherwise defined.
                                 // (Ignored if TRANSMINIVAN_RIGHTSIDE is _removed_).


        /*                  -6- ➡ Defining the meaning of the additional hardware keys ⬅
         *
         * Some possibilities you might like:
         *
         * ① Number-pad and F-keys layers are only on a toggle. If you want them accessible on a hold key, you can use
         *   these additional hardware keys. Make sure to use a transparent key on that location on those layers.
         *
         * ② You can use the right side additional key for quick access to an arrow/navigation cluster (see below).
         *
         * ③ Other uses, such as a delete key and/or a special interface key your system needs.
         */
        /*          • Defining the additional key for 'South paw' (also called 'Command')
         *
         * Left side additional key. This is ignored if MORE_KEY__COMMAND is not defined.
         */
        // Configure here what this key is on the BASE layers (excluding Base Numpad compile option).
//#define MORE_key1_BASE TG ( _RAR ) // _Activate_ this to get a toggle to layer _RAR.  MO(_RAR) does not follow a BASE switch by ‛Other Base’.
//#define MORE_key1_BASE KC_DEL      // Could be useful if you like to toggle to certain layers and stay there for a while.
  #define MORE_key1_BASE KC__XGUI    // (Default) (Using KC__XGUI makes sure it is the *other* GUI, relative to KC__YGUI.)
        //
        // Configure here what this key is on all other layers
//#define MORE_key1      KC_DEL   // Configure here what this key is on all other layers (and Base Numpad).
  #define MORE_key1      KC__XGUI // (Default)
        //
        //
        /*          • Defining 'Arrow' hardware layout additional keys
         *
         * You can create an arrow-cluster with your additional MORE_key2 hardware key on the _MOV layer.
         * Either way: this new key can toggle to _MOV layer, with the key that on the _MOV layer becomes the down-arrow,
         * in the middle of an arrow cluster. To do that, uncomment MOREKEY2_ARROW_CLUSTER.
         * The keys that are by default defined on those keys on _MOV layer, will now be overwritten (they are not typically
         * that much used there).
         *
         * Arrow cluster for 'arrow' layout: _activate_ MOREKEY2_ARROW_CLUSTER and _activate_ #define MORE_key2 _MOV_UP
         * No arrow cluster for 'arrow' layout: _remove_ MOREKEY2_ARROW_CLUSTER, and set MORE_key2 to whatever you want.
         */
  #define MOREKEY2_ARROW_CLUSTER // Arrow cluster on _MOV layer. This is ignored if MORE_KEY__ARROW is not defined.
                             // This will cost you 'Right Alt' and 'GUI' on the _MOV layer.
//#define MOREKEY2_ADD_NAVIGATION // Additional navigation keys around arrow cluster MOREKEY2_ARROW_CLUSTER. Ignored if MOREKEY2_ARROW_CLUSTER is not defined.
                                // Note: this will cause mouse buttons 'BTN4' and 'BTN5' on the _MOV layer to be moved.
        /*
         * Define the key you want on the additional key. Leave it to _MOV_UP if you want an arrow cluster, easily
         * accessed with this key.
         *
         * If you want to be able to type all arrow cluster keys with both GUI keys, than you cannot have this additional
         * arrow cluster around the ‛arrow’ additional hardware key, because it eats away the GUI just to the left of
         * that additional hardware key. 
         *
         * For typing both GUIs with the navigation cluster, you also need the left side additional hardware key. In this
         * case, you can still set the optional hardware key on the right to _MOV_UP, but that is marginally useful
         * as you already have that on Left Shift. 
         *
         * When aiming to type all normally available keys on a 100% keyboard with all modifiers including GUIs, you
         * could use the right hand side optional hardware key (‛arrow’), because it causes the right side GUI to be
         * available there. (This kind of stuff affects rare or even never used keyboard shortcuts.)
         */
  #define MORE_key2 _MOV_UP // Right side additional key. This is ignored if MORE_KEY__ARROW is not defined.
//#define MORE_key2 KC_DEL  // More or less a random suggestion. Harmonizes well with “.DEL” on Numbers Pad.
                            // It is convenient to have an uncluttered Delete key on the Base layer.
//#define MORE_key2 <...your choice...> // Right side additional key.
        //


        /*                  -7- ➡ Arrows/Navigation cluster ⬅
         */
        /*          • Navigation cluster configuration
         * 
         * _Activate_ below line to use a "WASD" type layout (on the spot where WASD is in Qwerty).
         * _Remove_ if you prefer a flat type layout, with arrows in a row, on the right hand.
         */
  #define ARROWS_TRIANGLE // Implies mouse is also similarly in a triangle.
        /*
         *          • VI editor arrows
         *
         * Vi is a famous editor, with its own peculiar text cursor movement arrangement (arrows).
         * This option modifies the flat arrows layout on the right hand, to be like the “HJKL” 
         * arrows in the editor vi(1). “HJKL” meaning: the 7th to 10th key on the 3rd row.
         * The arrows on the additional MOREKEY2_ARROW_CLUSTER also get harmonized to be like vi.
         */
//#define VI_SWITCHERYDOO //  You have to _remove_ ARROWS_TRIANGLE, or this gets ignored.


        /*                  -8- ➡ Number pad Configuration⬅
         *
         * This concerns the Numbers Pad layer, which is part of the common layers (not the Bse
         * layer, which also has a Numbers Pad option).
         *
         * There are two compile versions for the number pad layer ‛_PAD’, in the common layers. 
         *
         * _Activate_ the below to have the numbers pad _PAD layer resemble the squared layout of
         * a numerical keyboard, allowing to type all numbers with the right hand.
         * _Remove_ the below to have the numbers in this layer follow the layout of the _NSY layer,
         * with the numbers on a line from left to right on the home row, across both hands.
         */
//#define NUMPAD_COMMON_SQUARE // _Activate_ to resemble a one handed numerical keyboard.


        /*                  -9- ➡ Speed measuring ⬅
         */
        /*
         * Led color configuration. You can see the speed you have configured below directly on the keyboard,
         * after you compiled and flashed it.
         * Set speed measuring to <off>.
         * Hold the 'Report' key for one second, then release. The keyboard prints a number, which is the
         * amount of characters per second for which that color is then being shown. Hold it again for
         * a second, and it increments. Toggle speed measuring on/off to restart.
         * You can play with the below settings until you like the result.
         *
         * The default values (8, 160 respectively) are starting at blue, avoiding confusion with default
         * cyan for BASE layer, going to purple and further avoiding confusion with text size counting.
         * Very fast typers could reach red, and then it goes further to yellow, etc.
         */
  #define SPEED_COUNTDOWN 25 // After how many keypresses to update the effect(s).
  #define SPEED_HUE_STEP 8 // For each key/sec faster, the hue value of HSV goes this step further.
  #define SPEED_HUE_START 160 // The starting hue for 0 k/s (0 = 255 = red).
        /*
         * Speed report in words-per-minute (wpm) rather than keystrokes-per-second (k/s). wpm = k/s * ⁶⁰/₅ = k/s * 12
         */
  #define WORDS_PER_MINUTE // _Activate_ to get speed report in words-per-minute, _remove_ to get it in keystrokes-per-second (k/s).


        /*                 -10- ➡ Some alternative keys ⬅
         */
        /*
         *          • Right Alt or hold(_RAR) on Base
         *
         * _Activate_ below line to get Right-Alt or Alt-Gr (same thing) on Base.
         * A short tap results in RAlt briefly pressed, plus Right-Arrow.
         * When pressed with another key, however short, results only in RAlt, and no Right-Arrow.
         * Held a little longer than tapping it, results in only RAlt being pressed, no Right-Arrow.
         *
         * _Remove_ to have a layer hold key to the _RAR layer there, instead of RAlt, together with tapped Right-Arrow.
         */
//#define BASE_RIGHT_ALT // _Activate_ to get Right-Alt instead of _RAR on Base layer.
        /*
         *          • GUI left/right
         *
         * _Activate_ below line to have LGUI (also called OS or Win key, etc) where RGUI is, 
         * and RGUI where LGUI is.
         */
//#define SWITCH_GUIS // _Activate_ this if you want LGUI on the BASE layer rather than RGUI, despite that spot being on the right.
        /*
         *          • Alternate currency symbol
         *
         * _Activate_ the below to get a Euro symbol, where ƒ (Dutch Guilder) is on the default map (_DRA layer).
         */
  #define UNICODE_CURRENCY 0x20ac // Hex number, euro symbol €. The unicode hex number for position ƒ in the default keymap.
        /*    
         *          • Check boxes or Pointers
         *
         * You can have these symbols (checkboxes):  ☐  ☒  ☑  🗹
         *                     or these (pointers):  ⮘  ⮙  ⮚  ⮛
         */
//#define POINT_ON_CHECKBOXES // _Activate_ to get arrows, _remove_ to get checkboxes on _DRA layer.
        /*    
         *          • Switch _ACC/_BON and *left* side _NSY/_DRA hold keys
         *
         * If you type a lot of _ACC layer (accented keys), and not much _DRA layer, you might like to
         * switch the _ACC hold key, and the left side _NSY key, if you find it awkward to reach to the
         * left with your thumb. These two keys are next to each other. Only the Base layer is affected. 
         */
//#define SWITCH_HOLD_ACC_NSY // _Activate_ to switch the *left* _NSY and _ACC layer hold keys, on Base layer.
        /*    
         *          • Switch _PAD and _MOV on Left Shift toggle
         *
         * Recommended if you use _MOV more than _PAD
         */
//#define SWITCH_LSHIFT_PAD_MOV // _Activate_ to make _MOV layer be on the fast tap, and _PAD on a short hold toggle
        /*    
         *          • Switch _FUN and _RAR on Right Shift toggle
         *
         * Recommended if you use _RAR more than _FUN
         */
//#define SWITCH_RSHIFT_FUN_RAR // _Activate_ to make _RAR layer be on the fast tap, and _FUN on a short hold toggle
        /*
         *          • “Switch spacebars”: ‛Space-bar’ ⬅➡ “‛Enter’ + ‛layer-hold _MOV’”
         *
         * Recommended if you usually type ‛Space-bar’ with your left hand.
         * These keys also switch on _MOV (movement) layer. Page-Up goes one spot to the left.
         */
//#define SPACE_LEFT__ENTER_RIGHT // _Activate_ for ‛Space bar’ left, ‛Enter’ and ‛_MOV hold’ right hand.


        /*                 -11- ➡ Eviscerations ( ② / ② ) ⬅
         */
        /*          • Removing the numbers pad _PAD layer
         *
         * You may have no use for this common layer, if you have a numerical keypad on the Alternate Base already.
         *
         * ⚠ Note: ./base_numpad.h can overrides this setting, if compiled with that ‛Base layers’.
         */
//#define REMOVE_PAD // _Activate_ to strip out the _PAD layer, _remove_ to have the _PAD layer.
        //
        /*          • Removing one or more of the Unicode layers _ACC, _DRA or_BON
         */
        /* Removes the _ACC layer, optionally redirect its key. This can save some 750 bytes. 
         */
//#define REMOVE_ACC // _Activate_ to strip out the _ACC layer, _remove_ to have the _ACC layer.
        /* Unless REMOVE_ACC is _active_, the next defines which redirect the _ACC key(s) are ignored. */
//#define _ACC_KEY_ALT_LAYER _BON // _Activate_ to make the key(s) that normally goes to _ACC, go to _BON instead.
//#define _ACC_KEY_ALT_LAYER _DRA // _Activate_ to make the key(s) that normally goes to _ACC, go to _DRA instead.
        /*
         *
         * Removes the _DRA layer, optionally redirect its key. Also saves some 750 bytes.
         */
//#define REMOVE_DRA // _Activate_ to strip out the _DRA layer, _remove_ to have the _DRA layer.
        /* Unless REMOVE_DRA is _active_, the next defines which redirect the _DRA key(s) are ignored. */
//#define _DRA_KEY_ALT_LAYER _ACC // _Activate_ to make the key(s) that normally goes to _ACC, go to _ACC instead.
//#define _DRA_KEY_ALT_LAYER _BON // _Activate_ to make the key(s) that normally goes to _ACC, go to _BON instead.
        /*
         *
         * Removes the _BON layer, optionally redirect its key. Also saves some 750 bytes.
         */
//#define REMOVE_BON // _Activate_ to strip out the _BON layer, _remove_ to have the _BON layer.
        /* Unless REMOVE_BON is _active_, the next defines which redirect the _BON key(s) are ignored. */
//#define _BON_KEY_ALT_LAYER _ACC // _Activate_ to make the key(s) that normally goes to _BON, go to _ACC instead.
//#define _BON_KEY_ALT_LAYER _DRA // _Activate_ to make the key(s) that normally goes to _BON, go to _DRA instead.
        /*
         *
         *          • Removing groups of characters
         */
        /*
         * The below cut out an amount of symbols on a given layer, to simplify and/or reduce firmware size a little.
         */
//#define ALL_DRA_BON_EVISCERATIONS // _Activate_ this to _remove_ the below all at once. (Seems to save only ±114 bytes)
                                    //
  #define BOX_DRAWINGS // _Activate_ to get box drawings on _BON. Horizontal lines (━─┄┅) on _DRA are not affected.
                   // Affected on rows 2 and 3: ┣┫┏┗┃┇┛┓
                   // Full, 3rd row, boxdr.:  Ctrl   ① ⬅   ② ⬇   ③ ➡  ④ ┏  ⑤  ┓  ⑥ ┃  ⑦ ┇   ⑧ ╋  ⑨    ⓪ ∞   — 
                   // Full, 2nd row, boxdr.:  LSht   ‹     ›     ÷    ☞ ┗  ≠  ┛  ✗ ┣  ✓ ┫   ⚠    «    »     RSht
                   //
                   // 3rd row, no boxdrawing: Ctrl   ① ⬅   ② ⬇   ③ ➡  ④    ⑤     ⑥    ⑦     ⑧    ⑨    ⓪ ∞   — 
                   // 2nd row, no boxdrawing: LSht   ‹     ›     ÷    ☞    ≠     ✗    ✓     ⚠    «    »     RSht
                   //
  #define SUB_SCRIPT_NUMS // _Activate_ to get subscript numbers (₁₂₃…₀) on _DRA.
                      // Affected on row 3: ₁₂₃₄₅₆₇₈₉₀
                      // Thinned out 3rd row: xxx   ¹     ²     ³    ⁴    ⁵    ⁶     ⁷     ⁸     ⁹     ⁰   xxx
                      // Full 3rd row:        xxx   ¹₁    ²₂    ³₃   ⁴₄   ⁵₅   ⁶₆    ⁷₇    ⁸₈    ⁹₉    ⁰₀  xxx
                      //
  #define FULL_DRA_2NDROW // _Activate_ to have symbols on all unshifted + shifted positions on _DRA, 2nd row.
                      // Affected: 「 」 〇 § · 🗹  《 》
                      // Full 2nd row:        LSht  「━   」─   °〇  •§   …·   ☐ ☒   ☑ 🗹   ¿¡ 《┄   》┅    Rsht
                      // Thinned out 2nd row: LSht  ━     ─     °    •    …    ☐ ☑   ☑     ¿¡  ┄    ┅      RSht
                      //
  #define FULL_DRA_4THROW // _Activate_ to have symbols on all unshifted + shifted positions on _DRA, 4th row.
                      // Affected 4th row: „ ≤ ≥ ∅ ¢ ƒ ❦ 🙂 🙁 👍 👎 ⁽ ₍ ⁾ ₎
                      // Full 4th row:        BASE  “„    ”≤    £≥   ∅ ¢  ±ƒ   ❦ ♥   🙂🙁  👍👎 ⁽₍   ⁾₎    Bkspc
                      // Thinned out 4th row: BASE  “     ”     £         ±    ♥                           Bkspc
                      //
  #define FULL_BON_4THROW // _Activate_ to have symbols on all unshifted + shifted positions on _BON, 4th row.
                        // Affected 4th row: 🛠 ¤ ∑ ‱ ٭ 😊 ⍨  ⃰ ⁻ ⁺ 🄯 ©
                        // Full 4th row:        BASE  ‛🛠   ’⬆    ¤ 🄯   ∑ ©  ‰‱   ★٭   😊⍨    × ⃰   √    ⁻⁺    Bkspc
                        // Thinned out 4th row: BASE  ‛     ’⬆               ‰    ★           ×               Bkspc
                        //


        /*                 -12- ➡ Leds ⬅
         *
         * Leds off for the Default or Alternative Base Layer.
         * Implies: no indication on Default Base for: Caps-lock, typing speed, 
         * typing amount done of a limit.
         * Speed / typing amount indicated by led will be visible by going to another layer.
         */
//#define LEDS_OFF_BASE_DEF // _Activate_ to make leds dark when in ‛Default Base’ layer.
         //
//#define LEDS_OFF_BASE_ALT // _Activate_ to make leds dark when in ‛Alternative Base’ layer.

// ------------------------------------- ⬆ --------------------------------------
//            Below here no more comfortable configuration options.....
//            There may be configuration options in the layout ./bases_....h file you chose.
// ------------------------------------- ⬆ --------------------------------------

#else                            // (ignore this)
#    include "./minifan_config_compact.h"
#endif // MINIFAN_CONFIG_COMPACT


// ------------------------------------- ⬇ --------------------------------------
//                                 Base layer headers
// ------------------------------------- ⬇ --------------------------------------

//                         * Numpad *
# if defined(BASE_NUMPAD__ALT_BASE)
#     include "./base_numpad.h" // Numbers pad header
# endif
//                         * Qwerty Base Arrow *
# if defined(BASE_QWERTY_BASEARROW__DEF_BASE) || defined(BASE_QWERTY_BASEARROW__ALT_BASE)
#     include "./base_qwerty_basearrow.h" // Your Keymap header/configuration file.
# endif

// // ⬇ insert your ./base_YOUR_KEYMAP.h #include here:

//                         * YOUR KEYMAP *
// # if defined(BASE_YOUR_KEYMAP__DEF_BASE) || defined(BASE_YOUR_KEYMAP__ALT_BASE)
// #     include "./base_YOUR_KEYMAP.h" // Your Keymap header/configuration file.
// # endif

// // ⬆

// ------------------------------------- ⬆ --------------------------------------
// Base layer headers are best #included here, so the preprocessor statements 
// following the user configuration block can pick up on anything that was set.
//
// Example: base_numpad.h _activate_ ‛REMOVE_PAD’. Based upon that, the preprocessor
// constant ‛_PAD’ is changed into ‛_FUN’ in the below statements.
// ------------------------------------- ⬆ --------------------------------------



// The below sets some things up based on the above #defines.

// This is sort of a hack. It re-defines _ALT_BASE and _ALT_NSY to point to the same
// layer as _DEF_BASE and _DEF_NSY, because there are quite a few references to the
// former and putting #if then around each one complicated the code even more. If needed,
// it can be changed later. This option already reduces firmware size, so we should be
// well below the maximum.
# ifdef MINIFAN_SINGLE_LAYOUT
#     define _ALT_BASE _DEF_BASE
#     define _ALT_NSY _DEF_NSY
# endif

// This triggers the compilation of Dvorak descramble mode.
# ifdef BASE_DVORAK_DESCRAMBLE__ALT_BASE
#     define DVORAK_DESCRAMBLE
# endif

// Prevent likely erroneous configuration. If no 'Arrow' hardware layout, then not patching in an arrow cluster.
# if !defined(MORE_KEY__ARROW) && defined(MOREKEY2_ARROW_CLUSTER)
#     undef MOREKEY2_ARROW_CLUSTER
# endif

# if !defined(MORE_KEY__ARROW) && defined(MOREKEY2_ADD_NAVIGATION)
#     undef MOREKEY2_ADD_NAVIGATION
# endif
# if !defined(MOREKEY2_ARROW_CLUSTER) && defined(MOREKEY2_ADD_NAVIGATION)
#     undef MOREKEY2_ADD_NAVIGATION // Only navigation keys, when the are arrows defined.
# endif

// When choosing 'triangle' arrows, then they go left. Not 'triangle' arrows, than right.
# ifdef ARROWS_TRIANGLE
         /* _Activate_ below line to put the arrows on the left, comment out to have arrows right. */
#     define ARROWS_LEFT // Implies mouse is right
# endif


// Set up user GUI choice:
# ifndef SWITCH_GUIS
#     define KC__XGUI KC_LGUI // Name logic is alphabetic order left to right …X (…) …Y in layout definitions..
#     define KC__YGUI KC_RGUI // .. meaning KC__XGUI is left on the keymap, KC__YGUI is right.
# else
#     define KC__XGUI KC_RGUI
#     define KC__YGUI KC_LGUI
# endif

// Switch “spacebars”:
# ifndef SPACE_LEFT__ENTER_RIGHT                // standard
#     define LEFTCENTER_THUMB LT__MOV__KC_ENT
#     define RIGHTCENTER_THUMB KC_SPC
# else
#     define LEFTCENTER_THUMB KC_SPC            // reversed
#     define RIGHTCENTER_THUMB LT__MOV__KC_ENT
# endif

// Define the layout macro for the amount of hardware keys.
// These for Minivan are defined up in the code tree.
# if !defined(MORE_KEY__COMMAND) && !defined(MORE_KEY__ARROW)
#     define LAYOUT_redefined LAYOUT                // Default (8 keys on 1st row)
# endif

# if !defined(MORE_KEY__COMMAND) && defined(MORE_KEY__ARROW)
#     define LAYOUT_redefined LAYOUT_arrow          // Additional key 1st row on the right. 'Arrow'
# endif

# if defined(MORE_KEY__COMMAND) && !defined(MORE_KEY__ARROW)
#     define LAYOUT_redefined LAYOUT_command        // Additional key 1st row on the left. 'Command'
# endif

# if defined(MORE_KEY__COMMAND) && defined(MORE_KEY__ARROW)
#     define LAYOUT_redefined LAYOUT_arrow_command  // Additional keys 1st row both left and right. 'Arrow' + 'Command'
# endif

# ifdef TRANSMINIVAN_LAYOUT 
#     undef LAYOUT_redefined
#     define LAYOUT_redefined TRANSMINIVAN_LAYOUT
# endif


// Process user config setting for speed measuring
# ifdef STARTUP_SPEED
#     define SPEED_INIT_VALUE TRUE
# else
#     define SPEED_INIT_VALUE FALSE
# endif
// Process user config setting for text size measuring
# ifdef STARTUP_COUNT
#     define COUNT_INIT_VALUE TRUE
# else
#     define COUNT_INIT_VALUE FALSE
# endif


// Get all key reductions at once
# ifdef ALL_DRA_BON_EVISCERATIONS
#     ifdef BOX_DRAWINGS   
#         undef BOX_DRAWINGS   
#     endif

#     ifdef SUB_SCRIPT_NUMS
#         undef SUB_SCRIPT_NUMS
#     endif

#     ifdef FULL_DRA_2NDROW
#         undef FULL_DRA_2NDROW
#     endif

#     ifdef FULL_DRA_4THROW
#         undef FULL_DRA_4THROW
#     endif

#     ifdef FULL_BON_4THROW
#         undef FULL_BON_4THROW
#     endif
# endif

// This resolves compiling “TO (_BON)” on the _FUN layer.
# ifdef REMOVE_BON
#     undef _BON
#     ifdef _BON_KEY_ALT_LAYER
#         define _BON _BON_KEY_ALT_LAYER  // To what user wants
#     else
#         define _BON _FUN                // void behavior
#     endif
# endif

// This resolves compiling “TO (_PAD)” on the _FUN layer.
# ifdef REMOVE_PAD
#     undef _PAD
#     define _PAD _FUN                // void behavior
# endif

// If the _ACC layer hold key has no function anymore because the layers _ACC and _BON to which it
// switches have been removed, and no alternative use been set, that key reverts to being KC_DEL,
// and the whole macro CHOLTAP_ACCE it normally activates gets cut.
# if  defined(REMOVE_ACC) \
  && !defined(_ACC_KEY_ALT_LAYER) \
  &&  defined(REMOVE_BON) \
  && !defined(_BON_KEY_ALT_LAYER)
#     define CHOLTAP_ACCE KC_DEL // replaces in the keymap
#     define CHOLTAP_ACCE_NOP    // cuts CHOLTAP_ACCE out of macros
# endif

// Here all Unicode layers _ACC, _DRA and _BON have been removed, and none of their key(s) has
// been re-assigned to a useful purpose. That makes that whole system redundant, so it is simplified.
# if  defined(REMOVE_ACC) \
  && !defined(_ACC_KEY_ALT_LAYER) \
  &&  defined(REMOVE_DRA) \
  && !defined(_DRA_KEY_ALT_LAYER) \
  &&  defined(REMOVE_BON) \
  && !defined(_BON_KEY_ALT_LAYER)
#     define CHOLTAP_ACCE KC_DEL // replaces in the keymap
#     define CHOLTAP_ACCE_NOP    // cuts CHOLTAP_ACCE out of macros
#     define DUO_HOLD_BASIC   // cuts out the long DUO_HOLD macro, replaces it with a simple 'descramble'-aware hold(_NSY/_DDN) 
# endif