Misc changes, mostly for per-key switch type

-- Switches.json -> now using hash for "switches" for easy lookup
-- Serialization changed so that we use "" for default switch types, and
this round-trips properly.
-- Had to switch from <select> to bootstrap-style dropdowns; when I
started trying to handle the 'default' settings better (i.e., when the
per-key setting was blank), Angular was throwing errors using the
<select> element.
-- Changing switch mount blanks out brand/type, etc.
-- Now disabling switch mount/brand/type controls when appropriate
-- PNG rendering now only doing #keyboard-bg, which allows me to make
#keyboard full-width again.
pull/120/head
Ian Prest 9 years ago
parent 319fbdef00
commit 5b972cf6f6

@ -112,7 +112,7 @@
};
// Polyfill for HTMLCanvasElement.toBlob, which is currently only available on Firefox
if (!HTMLCanvasElement.prototype.toBlob) {
if (typeof(HTMLCanvasElement) !== 'undefined' && !HTMLCanvasElement.prototype.toBlob) {
Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
value: function (callback, type, quality) {
var binStr = atob( this.toDataURL(type, quality).split(',')[1] ),

@ -308,3 +308,32 @@ for i in (1..9) {
line-height: 1.5;
border-radius: 3px;
}
.dropdown-fixedwidth {
width:110px;
max-width:110px;
height: 26px;
}
.dropdown-fixedwidth>:first-child {
display: block;
left: 5px;
width: calc(100% - 12px);
text-align: left;
overflow: hidden;
}
.dropdown-fixedwidth .caret {
display: block;
position: absolute;
right: 5px;
top: 11px;
}
.dropdown-select {
max-height: 40vh;
overflow-y: auto;
}
.dropdown-fixedwidth:disabled {
background-color: #eee !important;
}

@ -193,7 +193,7 @@ Nav Bar / Header
<!--***********************************************
Main Keyboard Preview/Editor area
************************************************-->
<div id="keyboard" ng-cloak tabindex="0" style="width:{{kbWidth+30}}px; border:0"
<div id="keyboard" ng-cloak tabindex="0"
ui-keydown="{ left:'moveKeys(-moveStep,0,$event)',
right:'moveKeys(moveStep,0,$event)',
up:'moveKeys(0,-moveStep,$event)',
@ -475,43 +475,48 @@ Nav Bar / Header
<!-- Keyswitch options-->
<div class="form-group form-group-sm">
<label class="control-label col-md-3 col-lg-3 text-nowrap" for="thisswitcheditor">Switch:</label>
<!-- Keyswitch style-->
<label class="control-label col-md-3 col-lg-3 text-nowrap" for="switcheditor">Switch:</label>
<div class="form-inline form-outdent col-md-9 col-lg-9">
<div class="hint--top hint--rounded" data-hint="Specify the style of switch for this key.">
<select id="thisswitcheditor" class="form-control input-sm dropdown"
ng-model="multi.sm"
ng-change="updateMulti('sm')"
ng-blur="validateMulti('sm')">
<option value="">Mount Style Not Specified</option>
<option ng-repeat="(k,v) in switches" value="{{k}}" ng-selected="multi.sm == k">{{v.name}}</option>
</select>
<!-- Keyswitch mount style-->
<div class="hint--bottom hint--rounded" data-hint="Specify the mount style of switch for this key.">
<div class="btn-group btn-group-sm-form dropup" dropdown>
<button id="switcheditor" type="button" class="btn btn-default dropdown-toggle dropdown-fixedwidth" ng-disabled="selectedKeys.length<1 || multi.decal" dropdown-toggle>
<div>{{(multi.sm || meta.switchMount) ? switches[multi.sm || meta.switchMount].name : 'Mount N/A'}}</div>
<b class="caret"></b>
</button>
<ul class="dropdown-menu dropdown-select" role="menu">
<li ng-repeat="(k,v) in switches"><a ng-click="setMulti('sm',k)">{{v.name + (meta.switchMount===k ? ' (default)' : '')}}</a></li>
</ul>
</div>
</div>
<!-- Keyswitch brand-->
<div class="hint--top hint--rounded"
data-hint="Specify the default brand of key switch for this key.">
<select class="form-control input-sm dropdown"
ng-model="multi.sb"
ng-change="updateMulti('sb')"
ng-blur="validateMulti('sb')">
<option value="">Brand Not Specified</option>
<option ng-repeat="(k,v) in switches[multi.sm].brands" value="{{k}}" ng-selected="multi.sb == k">{{v.name}}</option>
</select>
<div class="hint--bottom hint--rounded" data-hint="Specify the brand of key switch for this key.">
<div class="btn-group btn-group-sm-form dropup" dropdown>
<button type="button" class="btn btn-default dropdown-toggle dropdown-fixedwidth" dropdown-toggle ng-disabled="selectedKeys.length<1 || !(multi.sm || meta.switchMount) || multi.decal">
<div>{{(multi.sb || meta.switchBrand) ? switches[multi.sm || meta.switchMount].brands[multi.sb || meta.switchBrand].name : 'Brand N/A'}}</div>
<b class="caret"></b>
</button>
<ul class="dropdown-menu dropdown-select" role="menu">
<li ng-repeat="(k,v) in switches[multi.sm || meta.switchMount].brands"><a ng-click="setMulti('sb',k)">{{v.name + (meta.switchBrand===k ? ' (default)' : '')}}</a></li>
</ul>
</div>
</div>
<!-- Keyswitch type-->
<div class=" hint--top hint--rounded"
data-hint="Specify the default type of key switch for this key.">
<select class="form-control input-sm dropdown"
ng-model="multi.st"
ng-change="updateMulti('st')"
ng-blur="validateMulti('st')">
<option value="">Switch Type Not Specified</option>
<option ng-repeat="v in switches[multi.sb].brands[multi.sb].switches" value="{{v.part}}" ng-selected="multi.st == v.part">{{v.name + (v.feel ? ', '+v.feel : '') + (v.weight ? ', '+v.weight.toString()+' cN' : '')}}</option>
</select>
<div class="hint--bottom hint--rounded" data-hint="Specify the type of key switch for this key.">
<div class="btn-group btn-group-sm-form dropup" dropdown>
<button type="button" class="btn btn-default dropdown-toggle dropdown-fixedwidth" dropdown-toggle ng-disabled="selectedKeys.length<1 || !(multi.sm || meta.switchMount) || !(multi.sb || meta.switchBrand) || multi.decal">
<div>{{(multi.st || meta.switchType) ? switches[multi.sm || meta.switchMount].brands[multi.sb || meta.switchBrand].switches[multi.st || meta.switchType].name : 'Switch N/A'}}</div>
<b class="caret"></b>
</button>
<ul class="dropdown-menu dropdown-select" role="menu">
<li ng-repeat="(k,v) in switches[multi.sm || meta.switchMount].brands[multi.sb || meta.switchBrand].switches"><a ng-click="setMulti('st',k)">{{v.name + (v.feel ? ', '+v.feel : '') + (v.weight ? ', '+v.weight.toString()+' cN' : '') + (meta.switchType===k ? ' (default)' : '')}}</a></li>
</ul>
</div>
</div>
</div>
</div>
@ -601,7 +606,7 @@ Nav Bar / Header
<div class="input-group input-group-sm hint--top hint--rounded" data-hint="Specify the background texture for the keyboard.">
<div class="btn-group btn-group-sm-form" dropdown>
<button type="button" class="btn btn-default dropdown-toggle" dropdown-toggle>{{meta.background ? meta.background.name : 'No Texture'}} <b class="caret"></b></button>
<ul class="dropdown-menu" role="menu" style="max-height:40vh;overflow-y:scroll;">
<ul class="dropdown-menu dropdown-select" role="menu">
<li><a ng-click='setBackground()'>None</a></li>
<li class="divider"></li>
<li ng-repeat="category in backgrounds">
@ -617,7 +622,7 @@ Nav Bar / Header
<!-- Corner radii -->
<div class="form-group form-group-sm">
<label class="control-label text-nowrap" for="kbdradiieditor">Radii:</label>
<label class="control-label text-nowrap" style='margin-left: 5px;' for="kbdradiieditor">Radii:</label>
<div class="hint--top hint--rounded"
data-hint="Specify the corner radii for this keyboard, in CSS3 format.
@ -664,12 +669,12 @@ Nav Bar / Header
<!-- Default keyswitch options-->
<div class="form-group form-group-sm">
<label class="control-label col-md-2 col-lg-1 text-nowrap" for="switcheditor">Default switch:</label>
<label class="control-label col-md-2 col-lg-1 text-nowrap" for="defaultswitcheditor">Default switch:</label>
<!-- Default keyswitch style-->
<!-- Default keyswitch mount style-->
<div class="form-inline form-outdent col-md-10 col-lg-11">
<div class="hint--top hint--rounded" data-hint="Specify the default style of switch for this keyboard layout.">
<select id="switcheditor" class="form-control input-sm dropdown"
<div class="hint--top hint--rounded" data-hint="Specify the default mount style of switch for this keyboard layout.">
<select id="defaultswitcheditor" class="form-control input-sm dropdown"
ng-model="meta.switchMount"
ng-change="updateMeta('switchMount')"
ng-blur="validateMeta('switchMount')">
@ -684,7 +689,8 @@ Nav Bar / Header
<select class="form-control input-sm dropdown"
ng-model="meta.switchBrand"
ng-change="updateMeta('switchBrand')"
ng-blur="validateMeta('switchBrand')">
ng-blur="validateMeta('switchBrand')"
ng-disabled="!meta.switchMount">
<option value="">Brand Not Specified</option>
<option ng-repeat="(k,v) in switches[meta.switchMount].brands" value="{{k}}" ng-selected="meta.switchBrand == k">{{v.name}}</option>
</select>
@ -696,30 +702,31 @@ Nav Bar / Header
<select class="form-control input-sm dropdown"
ng-model="meta.switchType"
ng-change="updateMeta('switchType')"
ng-blur="validateMeta('switchType')">
ng-blur="validateMeta('switchType')"
ng-disabled="!meta.switchMount || !meta.switchBrand">
<option value="">Switch Type Not Specified</option>
<option ng-repeat="v in switches[meta.switchMount].brands[meta.switchBrand].switches" value="{{v.part}}" ng-selected="meta.switchType == v.part">{{v.name + (v.feel ? ', '+v.feel : '') + (v.weight ? ', '+v.weight.toString()+' cN' : '')}}</option>
</select>
</div>
<!-- Switch mounting -->
<div class="form-group form-group-sm form-horizontal">
<label class="control-label text-nowrap" for="pcb">Mounted on:</label>
<label class="control-label text-nowrap" style='margin-left: 5px;' for="pcb">Mounted on:</label>
<div class="checkbox hint--top hint--rounded" data-hint="Specify if the switches are PCB mounted.">
<label>
<label style='margin-bottom: -3px;'>
<input type="checkbox" id="pcb" class="checkbox"
ng-model="meta.pcb"
ng-change="updateMeta('pcb')"
ng-blur="validateMeta('pcb')" field="pcb">
ng-blur="validateMeta('pcb')">
PCB
</label>
</div>
<div class="checkbox hint--top hint--rounded" data-hint="Specify if the switches are plate mounted.">
<label>
<label style='margin-bottom: -3px;'>
<input type="checkbox" id="plate" class="checkbox"
ng-model="meta.plate"
ng-change="updateMeta('plate')"
ng-blur="validateMeta('plate')" field="plate">
ng-blur="validateMeta('plate')">
Plate
</label>
</div>

11
kb.js

@ -194,7 +194,7 @@
saveAs(blob, "keyboard-layout.svg");
};
$scope.downloadPng = function() {
html2canvas($("#keyboard"), {
html2canvas($("#keyboard-bg"), {
useCORS: true,
onrendered: function(canvas) {
canvas.toBlob(function(blob) {
@ -554,7 +554,7 @@
}
};
// Validate a key's property values (in the case of an array property, only validates a single value)
// Validate a key's property values
function validate(key,prop,value) {
var v = {
_ : function() { return value; },
@ -599,6 +599,9 @@
ghost : function() { if(!key.decal) key[prop] = value; },
decal : function() { key[prop] = value; key.x2 = key.y2 = 0; key.width2 = key.width; key.height2 = key.height; key.nub = key.stepped = key.ghost = false; },
rotation_angle : function() { key.rotation_angle = value; key.rotation_x = $scope.multi.rotation_x; key.rotation_y = $scope.multi.rotation_y; },
sm : function() { if(value===$scope.meta.switchMount) value=''; if(value != key.sm) { key.sm = value; key.sb = key.st = ''; } },
sb : function() { if(value===$scope.meta.switchBrand) value=''; if(value != key.sb) { key.sb = value; key.st = ''; } },
st : function() { if(value===$scope.meta.switchType) value=''; if(value != key.st) { key.st = value; } },
};
return (u[prop] || u._)();
}
@ -621,6 +624,10 @@
$scope.multi = angular.copy($scope.selectedKeys.last());
});
};
$scope.setMulti = function(prop, value) {
$scope.multi[prop] = value;
$scope.updateMulti(prop);
};
$scope.validateMulti = function(prop, index) {
if($scope.multi[prop] == null) {

@ -100,14 +100,14 @@ var $serial = (typeof(exports) !== 'undefined') ? exports : {};
};
var _defaultKeyProps = {
x: 0, y: 0, x2: 0, y2: 0, // position
width: 1, height: 1, width2: 1, height2: 1, // size
rotation_angle: 0, rotation_x: 0, rotation_y: 0, // rotation
labels:[], textColor: [], textSize: [], // label properties
default: { textColor: "#000000", textSize: 3 }, // label defaults
color: "#cccccc", profile: "", nub: false, // cap appearance
ghost: false, stepped: false, decal: false, // miscellaneous options
sm: "", sb:"", st:"" // switch
x: 0, y: 0, x2: 0, y2: 0, // position
width: 1, height: 1, width2: 1, height2: 1, // size
rotation_angle: 0, rotation_x: 0, rotation_y: 0, // rotation
labels:[], textColor: [], textSize: [], // label properties
default: { textColor: "#000000", textSize: 3 }, // label defaults
color: "#cccccc", profile: "", nub: false, // cap appearance
ghost: false, stepped: false, decal: false, // miscellaneous options
sm: "", sb:"", st:"" // switch
};
var _defaultMetaData = { backcolor: '#eeeeee', name: '', author: '', notes: '', background: undefined, radii: '', switchMount: '', switchBrand: '', switchType: '' };
@ -355,12 +355,9 @@ var $serial = (typeof(exports) !== 'undefined') ? exports : {};
if(key.l) { current.stepped = key.l; }
if(key.d) { current.decal = key.d; }
if(key.g != null) { current.ghost = key.g; }
if(key.sm != null) { current.sm = key.sm; }
else { key.sm = current.sm = meta.switchMount; }
if(key.sb != null) { current.sb = key.sb; }
else { key.sb = current.sb = meta.switchBrand; }
if(key.st != null) { current.st = key.st; }
else { key.st = current.st = meta.switchType; }
if(key.sm) { current.sm = key.sm; }
if(key.sb) { current.sb = key.sb; }
if(key.st) { current.st = key.st; }
}
}

@ -1,71 +1,71 @@
{
"cherry": { "mount": "cherry", "name": "Cherry MX Mount", "brands": {
"cherry": { "brand": "cherry", "name": "Cherry Electrical Products", "switches": [
{ "part": "MX1A-A1xx", "name": "MX White", "feel": "clicky", "weight": 70 },
{ "part": "MX1A-11xx", "name": "MX Black", "feel": "linear", "weight": 60 },
{ "part": "MX1A-C1xx", "name": "MX Clear", "feel": "tactile", "weight": 55 },
{ "part": "MX1A-D1xx", "name": "MX Tactile Grey", "feel": "tactile", "weight": 80 },
{ "part": "MX1A-E1xx", "name": "MX Blue", "feel": "clicky", "weight": 50 },
{ "part": "MX1A-F1xx", "name": "MX Green", "feel": "clicky", "weight": 70 },
{ "part": "MX1A-G1xx", "name": "MX Brown", "feel": "tactile", "weight": 45 },
{ "part": "MX1A-L1xx", "name": "MX Red", "feel": "linear", "weight": 45 },
{ "part": "MX1A-11Nx", "name": "MX RGB Black", "feel": "linear", "weight": 60 },
{ "part": "MX1A-E1Nx", "name": "MX RGB Blue", "feel": "clicky", "weight": 50 },
{ "part": "MX1A-G1Nx", "name": "MX RGB Brown", "feel": "tactile", "weight": 45 },
{ "part": "MX1A-L1Nx", "name": "MX RGB Red", "feel": "linear", "weight": 45 },
{ "part": "MX1A-21xx", "name": "MX Linear Grey", "feel": "linear", "weight": 80 },
{ "part": "MX1A-31xx", "name": "MX Lock", "feel": "linear", "weight": 60, "lock": true },
{ "part": "MX3A-11Nx", "name": "MX Silent RGB Black", "feel": "linear", "weight": 60 },
{ "part": "MX3A-L1Nx", "name": "MX Silent RGB Red", "feel": "linear", "weight": 45 },
{ "part": "MX3A-L1xx", "name": "MX Silent Red", "feel": "linear", "weight": 45 },
{ "part": "MX3A-11xx", "name": "MX Silent Black", "feel": "linear", "weight": 60 }
]},
"outemu": { "brand": "outemu", "name": "Outemu (Gaote Electronics)", "switches": [
{ "part": "PG150B01-1", "name": "Clear, Black Shaft", "weight": 65 },
{ "part": "PG150R01-1", "name": "Clear, Red Shaft", "weight": 50 },
{ "part": "PG150Q01-1", "name": "Clear, Blue Shaft", "weight": 55 },
{ "part": "PG150T01-1", "name": "Clear, Brown Shaft", "weight": 50 },
{ "part": "PG150B01", "name": "Black, Black Shaft", "weight": 65 },
{ "part": "PG150R01", "name": "Black, Red Shaft", "weight": 50 },
{ "part": "PG150Q01", "name": "Black, Blue Shaft", "weight": 60 },
{ "part": "PG150T01", "name": "Black, Brown Shaft", "weight": 55 }
]},
"gateron": { "brand": "gateron", "name": "Gateron (Huizhou Jia Electronic Technology Co.)", "switches": [
{ "part": "KS-3-Black", "name": "KS-3 Black Shaft (black)", "feel": "linear", "weight": 50 },
{ "part": "KS-3-Green", "name": "KS-3 Green Axis (blue)", "feel": "clicky", "weight": 55 },
{ "part": "KS-3-Red", "name": "KS-3 Red Axis (red)", "feel": "linear", "weight": 45 },
{ "part": "KS-3-Tea", "name": "KS-3 Tea Axis (brown)", "feel": "tactile", "weight": 45 },
{ "part": "KS-3-Yellow", "name": "KS-3 Yellow (yellow)", "feel": "linear", "weight": 50 },
{ "part": "KS-3-White", "name": "KS-3 White Shaft (translucent white)", "feel": "linear", "weight": 35 }
]},
"greetech": { "brand": "greetech", "name": "Greetech (Huizhou Greetech Electronics Co.)", "switches": [
{ "part": "GT02A1Exx", "name": "GT02 Red stem", "feel": "linear", "weight": 45 },
{ "part": "GT02A1Dxx", "name": "GT02 Blue stem", "feel": "clicky", "weight": 55 },
{ "part": "GT02A1Bxx", "name": "GTO2 Brown stem", "feel": "tactile", "weight": 50 },
{ "part": "GT02A2Axx", "name": "GTO2 Black stem", "feel": "linear", "weight": 65 }
]},
"hua-jie": { "brand": "hua-jie", "name": "Hua-Jie (Hua-Jie (Taiwan) Corp)", "switches": [
{ "part": "AX01-B", "name": "Black stem", "feel": "linear", "weight": 60 },
{ "part": "AX01-R", "name": "Red stem", "feel": "linear", "weight": 45 },
{ "part": "AX01-T", "name": "Tea/Brown stem", "feel": "tactile", "weight": 55 },
{ "part": "AX01-C", "name": "Cyan/Blue stem", "feel": "clicky", "weight": 60 }
]},
"kailh": { "brand": "kailh", "name": "Kailh (Kaihua Electronics Co.)", "switches": [
{ "part": "PG151101D01/D15", "name": "Kailh Black", "feel": "linear", "weight": 60 },
{ "part": "PG151101D64/D10", "name": "Kailh Blue", "feel": "clicky", "weight": 60 },
{ "part": "PG151101D49/D09", "name": "Kailh Brown", "feel": "tactile", "weight": 55 },
{ "part": "PG151101D05/D43", "name": "Kailh Red", "feel": "linear", "weight": 50 }
]}
"cherry": { "brand": "cherry", "name": "Cherry Electrical Products", "switches": {
"MX1A-A1xx": { "part": "MX1A-A1xx", "name": "MX White", "feel": "clicky", "weight": 70 },
"MX1A-11xx": { "part": "MX1A-11xx", "name": "MX Black", "feel": "linear", "weight": 60 },
"MX1A-C1xx": { "part": "MX1A-C1xx", "name": "MX Clear", "feel": "tactile", "weight": 55 },
"MX1A-D1xx": { "part": "MX1A-D1xx", "name": "MX Tactile Grey", "feel": "tactile", "weight": 80 },
"MX1A-E1xx": { "part": "MX1A-E1xx", "name": "MX Blue", "feel": "clicky", "weight": 50 },
"MX1A-F1xx": { "part": "MX1A-F1xx", "name": "MX Green", "feel": "clicky", "weight": 70 },
"MX1A-G1xx": { "part": "MX1A-G1xx", "name": "MX Brown", "feel": "tactile", "weight": 45 },
"MX1A-L1xx": { "part": "MX1A-L1xx", "name": "MX Red", "feel": "linear", "weight": 45 },
"MX1A-11Nx": { "part": "MX1A-11Nx", "name": "MX RGB Black", "feel": "linear", "weight": 60 },
"MX1A-E1Nx": { "part": "MX1A-E1Nx", "name": "MX RGB Blue", "feel": "clicky", "weight": 50 },
"MX1A-G1Nx": { "part": "MX1A-G1Nx", "name": "MX RGB Brown", "feel": "tactile", "weight": 45 },
"MX1A-L1Nx": { "part": "MX1A-L1Nx", "name": "MX RGB Red", "feel": "linear", "weight": 45 },
"MX1A-21xx": { "part": "MX1A-21xx", "name": "MX Linear Grey", "feel": "linear", "weight": 80 },
"MX1A-31xx": { "part": "MX1A-31xx", "name": "MX Lock", "feel": "linear", "weight": 60, "lock": true },
"MX3A-11Nx": { "part": "MX3A-11Nx", "name": "MX Silent RGB Black", "feel": "linear", "weight": 60 },
"MX3A-L1Nx": { "part": "MX3A-L1Nx", "name": "MX Silent RGB Red", "feel": "linear", "weight": 45 },
"MX3A-L1xx": { "part": "MX3A-L1xx", "name": "MX Silent Red", "feel": "linear", "weight": 45 },
"MX3A-11xx": { "part": "MX3A-11xx", "name": "MX Silent Black", "feel": "linear", "weight": 60 }
}},
"outemu": { "brand": "outemu", "name": "Outemu (Gaote Electronics)", "switches": {
"PG150B01-1": { "part": "PG150B01-1", "name": "Clear, Black Shaft", "weight": 65 },
"PG150R01-1": { "part": "PG150R01-1", "name": "Clear, Red Shaft", "weight": 50 },
"PG150Q01-1": { "part": "PG150Q01-1", "name": "Clear, Blue Shaft", "weight": 55 },
"PG150T01-1": { "part": "PG150T01-1", "name": "Clear, Brown Shaft", "weight": 50 },
"PG150B01": { "part": "PG150B01", "name": "Black, Black Shaft", "weight": 65 },
"PG150R01": { "part": "PG150R01", "name": "Black, Red Shaft", "weight": 50 },
"PG150Q01": { "part": "PG150Q01", "name": "Black, Blue Shaft", "weight": 60 },
"PG150T01": { "part": "PG150T01", "name": "Black, Brown Shaft", "weight": 55 }
}},
"gateron": { "brand": "gateron", "name": "Gateron (Huizhou Jia Electronic Technology Co.)", "switches": {
"KS-3-Black": { "part": "KS-3-Black", "name": "KS-3 Black Shaft (black)", "feel": "linear", "weight": 50 },
"KS-3-Green": { "part": "KS-3-Green", "name": "KS-3 Green Axis (blue)", "feel": "clicky", "weight": 55 },
"KS-3-Red": { "part": "KS-3-Red", "name": "KS-3 Red Axis (red)", "feel": "linear", "weight": 45 },
"KS-3-Tea": { "part": "KS-3-Tea", "name": "KS-3 Tea Axis (brown)", "feel": "tactile", "weight": 45 },
"KS-3-Yellow": { "part": "KS-3-Yellow", "name": "KS-3 Yellow (yellow)", "feel": "linear", "weight": 50 },
"KS-3-White": { "part": "KS-3-White", "name": "KS-3 White Shaft (translucent white)", "feel": "linear", "weight": 35 }
}},
"greetech": { "brand": "greetech", "name": "Greetech (Huizhou Greetech Electronics Co.)", "switches": {
"GT02A1Exx": { "part": "GT02A1Exx", "name": "GT02 Red stem", "feel": "linear", "weight": 45 },
"GT02A1Dxx": { "part": "GT02A1Dxx", "name": "GT02 Blue stem", "feel": "clicky", "weight": 55 },
"GT02A1Bxx": { "part": "GT02A1Bxx", "name": "GTO2 Brown stem", "feel": "tactile", "weight": 50 },
"GT02A2Axx": { "part": "GT02A2Axx", "name": "GTO2 Black stem", "feel": "linear", "weight": 65 }
}},
"hua-jie": { "brand": "hua-jie", "name": "Hua-Jie (Hua-Jie (Taiwan) Corp)", "switches": {
"AX01-B": { "part": "AX01-B", "name": "Black stem", "feel": "linear", "weight": 60 },
"AX01-R": { "part": "AX01-R", "name": "Red stem", "feel": "linear", "weight": 45 },
"AX01-T": { "part": "AX01-T", "name": "Tea/Brown stem", "feel": "tactile", "weight": 55 },
"AX01-C": { "part": "AX01-C", "name": "Cyan/Blue stem", "feel": "clicky", "weight": 60 }
}},
"kailh": { "brand": "kailh", "name": "Kailh (Kaihua Electronics Co.)", "switches": {
"PG151101D01/D15": { "part": "PG151101D01/D15", "name": "Kailh Black", "feel": "linear", "weight": 60 },
"PG151101D64/D10": { "part": "PG151101D64/D10", "name": "Kailh Blue", "feel": "clicky", "weight": 60 },
"PG151101D49/D09": { "part": "PG151101D49/D09", "name": "Kailh Brown", "feel": "tactile", "weight": 55 },
"PG151101D05/D43": { "part": "PG151101D05/D43", "name": "Kailh Red", "feel": "linear", "weight": 50 }
}}
}},
"alps": { "mount": "alps", "name": "Alps Mount", "brands": {
"alps": { "brand": "alps", "name": "Alps Electric Co.", "switches": [
{ "part": "SKCL/SKCM", "name": "SKCL/SKCM (Complicated Alps)" },
{ "part": "SKBL/SKBM", "name": "SKBL/SKBM (Simplified Alps)" }
]},
"matias": { "brand": "matias", "name": "Matias Corporation", "switches": [
{ "part": "PG155B02", "name": "Click", "feel": "clicky", "weight": 60 },
{ "part": "KS102Q", "name": "Quiet Linear", "feel": "linear", "weight": 35 },
{ "part": "PG155B01", "name": "Quiet Click", "feel": "tactile", "weight": 60 }
]}
"alps": { "brand": "alps", "name": "Alps Electric Co.", "switches": {
"SKCL/SKCM": { "part": "SKCL/SKCM", "name": "SKCL/SKCM (Complicated Alps)" },
"SKBL/SKBM": { "part": "SKBL/SKBM", "name": "SKBL/SKBM (Simplified Alps)" }
}},
"matias": { "brand": "matias", "name": "Matias Corporation", "switches": {
"PG155B02": { "part": "PG155B02", "name": "Click", "feel": "clicky", "weight": 60 },
"KS102Q": { "part": "KS102Q", "name": "Quiet Linear", "feel": "linear", "weight": 35 },
"PG155B01": { "part": "PG155B01", "name": "Quiet Click", "feel": "tactile", "weight": 60 }
}}
}}
}
Loading…
Cancel
Save