diff --git a/src/components/fields/ColorField.jsx b/src/components/fields/ColorField.jsx
index 9a89777..bbeff47 100644
--- a/src/components/fields/ColorField.jsx
+++ b/src/components/fields/ColorField.jsx
@@ -82,7 +82,6 @@ class ColorField extends React.Component {
     </div>
 
     return <div style={{
-      ...input.property,
       position: 'relative',
       display: 'inline',
     }}>
diff --git a/src/components/fields/ZoomSpecField.jsx b/src/components/fields/ZoomSpecField.jsx
index 1691403..8deafa7 100644
--- a/src/components/fields/ZoomSpecField.jsx
+++ b/src/components/fields/ZoomSpecField.jsx
@@ -3,6 +3,7 @@ import Color from 'color'
 
 import Button from '../Button'
 import SpecField from './SpecField'
+import NumberInput from '../inputs/NumberInput'
 import DocLabel from './DocLabel'
 
 import AddIcon from 'react-icons/lib/md/add-circle-outline'
@@ -44,20 +45,21 @@ export default class ZoomSpecField extends React.Component {
     let label = <DocLabel
       label={labelFromFieldName(this.props.fieldName)}
       doc={this.props.fieldSpec.doc}
+      style={{
+        width: '50%',
+      }}
     />
 
     if(isZoomField(this.props.value)) {
       const zoomFields = this.props.value.stops.map((stop, idx) => {
-        label = <label style={{...input.label, width: '30%'}}>
-          {labelFromFieldName(this.props.fieldName)}
-        </label>
-
-        if(idx > 0) {
-          label = <label style={{...input.label, width: '30%'}}></label>
-        }
+        label = <DocLabel
+          doc={this.props.fieldSpec.doc}
+          style={{ width: '42.5%'}}
+          label={idx > 0 ? "" : labelFromFieldName(this.props.fieldName)}
+        />
 
         if(idx === 1) {
-          label = <label style={{...input.label, width: '30%'}}>
+          label = <label style={{...input.label, width: '42.5%'}}>
             <Button style={{fontSize: fontSizes[5]}}>
               Add stop
             </Button>
@@ -67,17 +69,19 @@ export default class ZoomSpecField extends React.Component {
         const zoomLevel = stop[0]
         const value = stop[1]
 
-        return <div style={input.property} key={zoomLevel}>
+        return <div key={zoomLevel} style={{
+            ...input.property,
+            marginLeft: 0,
+            marginRight: 0
+          }}>
           {label}
           <Button style={{backgroundColor: null}}>
             <DeleteIcon />
           </Button>
-          <input
+          <NumberInput
             style={{
-              ...input.input,
-              width: '10%',
+              width: '7%',
             }}
-            type="number"
             value={zoomLevel}
             min={0}
             max={22}
@@ -85,19 +89,20 @@ export default class ZoomSpecField extends React.Component {
           <SpecField {...this.props}
             value={value}
             style={{
-              width: '33%',
+              width: '42%',
               marginLeft: margins[0],
             }}
           />
         </div>
       })
+
       return <div style={input.property}>
         {zoomFields}
       </div>
     } else {
       return <div style={input.property}>
         {label}
-        <SpecField {...this.props} />
+        <SpecField {...this.props} style={{ width: '50%' } }/>
       </div>
     }
   }
diff --git a/src/components/filter/FilterEditor.jsx b/src/components/filter/FilterEditor.jsx
index 4e804da..836dfeb 100644
--- a/src/components/filter/FilterEditor.jsx
+++ b/src/components/filter/FilterEditor.jsx
@@ -5,6 +5,10 @@ import input from '../../config/input.js'
 import colors from '../../config/colors.js'
 import { margins } from '../../config/scales.js'
 
+import SelectInput from '../inputs/SelectInput'
+import StringInput from '../inputs/StringInput'
+import AutocompleteInput from '../inputs/AutocompleteInput'
+
 const combiningFilterOps = ['all', 'any', 'none']
 const setFilterOps = ['in', '!in']
 const otherFilterOps = Object
@@ -35,6 +39,7 @@ class CombiningOperatorSelect extends React.Component {
     })
 
     return <div>
+
       <select
         style={{
           ...input.select,
@@ -64,20 +69,15 @@ class OperatorSelect extends React.Component {
   }
 
   render() {
-    const options = otherFilterOps.map(op => {
-      return <option key={op} value={op}>{op}</option>
-    })
-    return <select
+    return <SelectInput
       style={{
-        ...input.select,
         width: '15%',
         margin: margins[0]
       }}
       value={this.props.value}
-      onChange={e => this.props.onChange(e.target.value)}
-    >
-      {options}
-    </select>
+      onChange={this.props.onChange}
+      options={otherFilterOps.map(op => [op, op])}
+    />
   }
 }
 
@@ -104,32 +104,26 @@ class SingleFilterEditor extends React.Component {
     const filterArgs = f.slice(2)
 
     return <div>
-      <select
-        style={{
-          ...input.select,
-            width: '17%',
-            margin: margins[0]
+      <AutocompleteInput
+        wrapperStyle={{
+          width: '35%',
+          margin: margins[0],
         }}
         value={propertyName}
+        options={Object.keys(this.props.properties).map(propName => [propName, propName])}
         onChange={newPropertyName => this.onFilterPartChanged(filterOp, newPropertyName, filterArgs)}
-      >
-        {Object.keys(this.props.properties).map(propName => {
-          return <option key={propName} value={propName}>{propName}</option>
-        })}
-      </select>
+      />
       <OperatorSelect
         value={filterOp}
         onChange={newFilterOp => this.onFilterPartChanged(newFilterOp, propertyName, filterArgs)}
       />
-      <input
+      <StringInput
         style={{
-          ...input.input,
-          width: '53%',
+          width: '35%',
           margin: margins[0]
         }}
         value={filterArgs.join(',')}
-        onChange={e => {
-          this.onFilterPartChanged(filterOp, propertyName, e.target.value.split(','))}}
+        onChange={ v=> this.onFilterPartChanged(filterOp, propertyName, v.split(','))}
       />
     </div>
   }
@@ -182,11 +176,7 @@ export default class CombiningFilterEditor extends React.Component {
       return null
     }
 
-    return <div style={{
-      padding: margins[2],
-      paddingRight: 0,
-      backgroundColor: colors.black
-    }}>
+    return <div>
       <CombiningOperatorSelect
         value={combiningOp}
         onChange={this.onFilterPartChanged.bind(this, 0)}
diff --git a/src/components/inputs/ArrayInput.jsx b/src/components/inputs/ArrayInput.jsx
index 34e6159..1bf665f 100644
--- a/src/components/inputs/ArrayInput.jsx
+++ b/src/components/inputs/ArrayInput.jsx
@@ -18,8 +18,8 @@ class ArrayInput extends React.Component {
   render() {
     const values = this.props.value || this.props.default || []
     const commonStyle = {
-      width: '15%',
-      marginRight: margins[0],
+      width: '49%',
+      marginRight: '1%',
     }
     const inputs = values.map((v, i) => {
       if(this.props.type === 'number') {
@@ -28,7 +28,7 @@ class ArrayInput extends React.Component {
       return <StringInput key={i} value={v} style={commonStyle} />
     })
 
-    return <div style={{display: 'inline-block', width: '51%'}}>
+    return <div style={{display: 'inline-block', width: '50%'}}>
       {inputs}
     </div>
   }
diff --git a/src/components/inputs/AutocompleteInput.jsx b/src/components/inputs/AutocompleteInput.jsx
index 36edb4b..9077de8 100644
--- a/src/components/inputs/AutocompleteInput.jsx
+++ b/src/components/inputs/AutocompleteInput.jsx
@@ -8,7 +8,8 @@ class AutocompleteInput extends React.Component {
   static propTypes = {
     value: React.PropTypes.string,
     options: React.PropTypes.array,
-    style: React.PropTypes.object,
+    wrapperStyle: React.PropTypes.object,
+    inputStyle: React.PropTypes.object,
     onChange: React.PropTypes.func,
   }
 
@@ -28,11 +29,15 @@ class AutocompleteInput extends React.Component {
         background: colors.gray,
         zIndex: 3,
       }}
+      wrapperStyle={{
+        display: 'inline-block',
+        ...this.props.wrapperStyle
+      }}
       inputProps={{
         style: {
           ...input.input,
-          width: null,
-          ...this.props.style,
+          width: '100%',
+          ...this.props.inputStyle,
         }
       }}
       value={this.props.value}
diff --git a/src/components/inputs/InputBlock.jsx b/src/components/inputs/InputBlock.jsx
index 51775b3..9023911 100644
--- a/src/components/inputs/InputBlock.jsx
+++ b/src/components/inputs/InputBlock.jsx
@@ -15,15 +15,30 @@ class InputBlock extends React.Component {
     return this.props.onChange(value === "" ? null: value)
   }
 
+  renderChildren() {
+    return React.Children.map(this.props.children, child => {
+      return React.cloneElement(child, {
+        style: {
+          ...child.props.style,
+          width: '50%',
+        }
+      })
+    })
+  }
+
   render() {
     return <div style={{
-      display: 'block',
-      marginTop: margins[2],
-      marginBottom: margins[2],
+      ...input.property,
       ...this.props.style,
     }}>
-      <label style={input.label}>{this.props.label}</label>
-      {this.props.children}
+      <label
+        style={{
+          ...input.label,
+          width: '50%',
+      }}>
+        {this.props.label}
+      </label>
+      {this.renderChildren()}
     </div>
   }
 }
diff --git a/src/config/input.js b/src/config/input.js
index 7b4940f..2ec996e 100644
--- a/src/config/input.js
+++ b/src/config/input.js
@@ -3,6 +3,7 @@ import { margins, fontSizes } from './scales'
 
 const base = {
   display: 'inline-block',
+  boxSizing: 'border-box',
   fontSize: fontSizes[5],
   lineHeight: 2,
   paddingLeft: 5,
@@ -11,20 +12,19 @@ const base = {
 
 const label = {
   ...base,
-  width: '40%',
+  padding: null,
   color: colors.lowgray,
   userSelect: 'none',
 }
 
 const property = {
-  marginTop: margins[2],
-  marginBottom: margins[2],
+  display: 'block',
+  margin: margins[2],
 }
 
 const input = {
   ...base,
   border: 'none',
-  width: '47%',
   backgroundColor: colors.gray,
   color: colors.lowgray,
 }
@@ -38,7 +38,6 @@ const checkbox = {
 
 const select = {
   ...input,
-  width: '50%',
   height: '2.15em',
 }