anchor.diff:  
     checkAndSetHeight : ->
       scroll_height = @getDOMNode().scrollHeight
  +    max_height = @props.max_height or 400
       if scroll_height > @getDOMNode().clientHeight
  -      @local.height = scroll_height + 5
  +      @local.height = Math.min scroll_height + 5, max_height
         save(@local)
   
     render : -> 
  
positive.code:     
      return DIV null, 'Nothing to see here, move on' if (permit('update proposal', proposal) < 0) || (!@props.fresh && !proposal.slug )
  
      block_style = { width: CONTENT_WIDTH, padding: '2px 0px', marginBottom: 12, position: 'relative' }
      description_field_style = {fontSize: 16, width: CONTENT_WIDTH - 200, padding: '4px 8px', marginBottom: 8, border: '1px solid #ccc'}
      input_style = _.extend {}, description_field_style, {marginLeft: 18}
      label_style = {verticalAlign: 'top', fontSize: 16, width: 150, display: 'inline-block'}
  
      if !@local.description_fields
        @local.description_fields = if @data().description_fields then $.parseJSON(@data().description_fields) || [] else []
        if @local.description_fields.length > 0
          if @local.description_fields[0].group
            # Right now, we just downgrade group syntax to flat description list syntax
            # TODO: when editing a proposal, support the proposal description groups syntax (or get rid of it)
            @local.description_fields = _.flatten(@local.description_fields.map (group) -> group.items)
  
        save @local
  
      DIV null, 
        DashHeader name: if @props.fresh then "New Proposal" else "Edit #{proposal.name}"
        DIV style: { width: PAGE_WIDTH, margin: 'auto', padding: '3em 0' },
  
          DIV style: block_style,
            LABEL htmlFor:'slug', style: label_style, 'URL'
            INPUT 
              id:'slug'
              name:'slug'
  
negative.code:             style: input_style
  
          DIV style: block_style,
            LABEL htmlFor:'name', style: label_style, 'Summary:'
            INPUT 
              id:'name'
              name:'name'
              pattern:'^.{3,}'
              placeholder:'Aim for 3-8 words with a verb and noun.'
              required:'required'
              defaultValue: if @props.fresh then null else proposal.name
              style: input_style
  
          DIV style: block_style,
            LABEL htmlFor:'description', style: label_style, 'Description:'
            AutoGrowTextArea 
              id:'description'
              name:'description'
              pattern:'^.{3,}'
              placeholder:'Clearly describe the details.'
              required:'required'
              defaultValue: if @props.fresh then null else proposal.description
              style: _.extend {}, input_style, {height: 150}
  
            # Expandable description fields
            DIV style: {marginBottom: 20, marginLeft: 45},
              for field,idx in @local.description_fields
                field_open = field.id in @local.open_fields
                DIV key: "field-#{idx}", style: _.extend({}, block_style, {width: ''}),
  
                  I 
                    className: "fa fa-#{if field_open then 'plus' else 'minus'}-circle"
                    style: {position: 'absolute', left: -20, top: 18, color: '#414141', cursor: 'pointer'}
                    onClick: do (field, field_open) => => toggleDescriptionFieldOpen(field, field_open)
  
                  if field_open
                    [INPUT
                      style: _.extend {}, description_field_style, {width: description_field_style.width - 45}
                      type: 'text'
                      id:"field-#{idx}-label"
                      name:"field-#{idx}-label"
                      pattern:'^.{3,}'
                      placeholder:'Label'
                      required:'required'
                      onChange: do(field,idx) => (e) => field.label = e.target.value; save(@local)
                      value: field.label
  
                    AutoGrowTextArea
                      id:"field-#{idx}-html"
  