```
#### JSON schema
```json
{
"$schema": "http://json-schema.org/schema#",
"type": "object",
"properties": {
"modifier": {
"type": "string"
},
"text": {
"type": "string"
}
}
}
```
#### JS shorthand
```javascript
{ modifier: 'string', text: 'string' }
```
1. A top-level object is assumed to define a component object schema, and so is assigned a `$schema` value.
2. Each `'property': value` pair is assumed to represent an item on `"properties"`.
1. if `value` is a `string`, `'property': 'value'` is mapped to `"property": { "type": "value" }`,
2. if `value` is an `object`, `'property': value` is mapped to `"property": value`. If the `'type'` property is absent from `value`, `"string"` is inferred.
### Button component
#### Template
```handlebars
{{{ text }}}
{{#if iconName}}
{{#if iconClasses}}
{{>@icon-item id=iconName decorative="true" svgTitle="Call to action"}}
{{else}}
{{>@icon-item id=iconName decorative="true" iconClasses="icon--mini" svgTitle="Call to action"}}
{{/if}}
{{/if}}
```
#### JSON schema
```json
{
"$schema": "http://json-schema.org/schema#",
"type": "object",
"properties": {
"disabled": {
"type": "boolean"
},
"modifiers": {
"type": "string",
"enum": ["large", "small", "primary"]
},
"iconName": {
"type": "string"
},
"iconClasses": {
"type": "string"
},
"text": {
"type": "string"
},
"href": {
"type": "string"
}
},
"required": ["text"],
"dependencies": {
"iconClasses": ["iconName"]
}
}
```
#### JS shorthand
```javascript
{
disabled: 'boolean',
modifiers: ['large', 'small', 'primary'],
iconName: 'string',
iconClasses: {
$dependencies: 'iconName',
$type: 'string'
},
text: {
$required: true,
$type: 'string'
},
href: 'string'
}
```
1. An array `value` is assumed to be an enum. If all items in the array are the same type, them enum will be declared to be of that type; otherwise no type will be declared.
2. Certain properties that match top-level JSON Schema object properties, such as `dependencies`, are hoisted.
### List component
#### Template
```handlebars