mirror of
https://github.com/ijprest/keyboard-layout-editor
synced 2024-11-11 13:10:29 +00:00
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.
This commit is contained in:
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] ),
|
||||
|
29
kb.css
29
kb.css
@ -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;
|
||||
}
|
95
kb.html
95
kb.html
@ -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
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) {
|
||||
|
25
serial.js
25
serial.js
@ -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; }
|
||||
}
|
||||
}
|
||||
|
||||
|
130
switches.json
130
switches.json
@ -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…
Reference in New Issue
Block a user