var foo = <div></div>;

return (
  <div>
  </div>
  <div>
    <div></div>
    <div>
      <div></div>
    </div>
  </div>
);

React.render(
  <div>
    <div></div>
  </div>,
  {
    a: 1
  },
  <div>
    <div></div>
  </div>
);

return (
  // Sneaky!
  <div></div>
);

return (
  <div></div>
  // Sneaky!
);

React.render(
  <input
  />,
  {
    a: 1
  }
);

return (
  <div>
    {array.map(function () {
      return {
        a: 1
      };
    })}
  </div>
);

return (
  <div attribute={array.map(function () {
         return {
           a: 1
         };

         return {
           a: 1
         };

         return {
           a: 1
         };
       })}>
  </div>
);

return (
  <div attribute={{
         a: 1, // Indent relative to “attribute” column.
         b: 2
       } && {  // Dedent to “attribute” column.
         a: 1,
         b: 2
       }} />   // Also dedent.
);

return (
  <div attribute=
       {   // Indent properly on another line, too.
         {
           a: 1,
           b: 2,
         } && (
           // Indent other forms, too.
           a ? b :
             c ? d :
             e
         )
       } />
)

// JSXMemberExpression names are parsed/indented:
<Foo.Bar>
  <div>
    <Foo.Bar>
      Hello World!
    </Foo.Bar>
    <Foo.Bar>
      <div>
      </div>
    </Foo.Bar>
  </div>
</Foo.Bar>

// JSXOpeningFragment and JSXClosingFragment are parsed/indented:
<>
  <div>
    <>
      Hello World!
    </>
    <>
      <div>
      </div>
    </>
  </div>
</>

// Indent void expressions (no need for contextual parens / commas)
// (https://github.com/mooz/js2-mode/issues/140#issuecomment-166250016).
<div className="class-name">
  <h2>Title</h2>
  {array.map(() => {
    return <Element />;
  })}
  {message}
</div>
// Another example of above issue
// (https://github.com/mooz/js2-mode/issues/490).
<App>
  <div>
    {variable1}
    <Component/>
  </div>
</App>

// Comments and arrows can break indentation (Bug#24896 /
// https://github.com/mooz/js2-mode/issues/389).
const Component = props => (
  <FatArrow a={e => c}
            b={123}>
  </FatArrow>
);
const Component = props => (
  <NoFatArrow a={123}
              b={123}>
  </NoFatArrow>
);
const Component = props => ( // Parse this comment, please.
  <FatArrow a={e => c}
            b={123}>
  </FatArrow>
);
const Component = props => ( // Parse this comment, please.
  <NoFatArrow a={123}
              b={123}>
  </NoFatArrow>
);
// Another example of above issue (Bug#30225).
class {
  render() {
    return (
      <select style={{paddingRight: "10px"}}
              onChange={e => this.setState({value: e.target.value})}
              value={this.state.value}>
        <option>Hi</option>
      </select>
    );
  }
}

// JSX attributes of an arrow function’s expression body’s JSX
// expression should be indented with respect to the JSX opening
// element (Bug#26001 /
// https://github.com/mooz/js2-mode/issues/389#issuecomment-271869380).
class {
  render() {
    const messages = this.state.messages.map(
      message => <Message key={message.id}
                          text={message.text}
                          mine={message.mine} />
    );    return messages;
  }
  render() {
    const messages = this.state.messages.map(message =>
      <Message key={message.timestamp}
               text={message.text}
               mine={message.mine} />
    );    return messages;
  }
}

// Users expect tag closers to align with the tag’s start; this is the
// style used in the React docs, so it should be the default.
// - https://github.com/mooz/js2-mode/issues/389#issuecomment-390766873
// - https://github.com/mooz/js2-mode/issues/482
// - Bug#32158
const foo = (props) => (
  <div>
    <input
      cat={i => i}
    />
    <button
      className="square"
    >
      {this.state.value}
    </button>
  </div>
);

// Embedded JSX in parens breaks indentation
// (https://github.com/mooz/js2-mode/issues/411).
let a = (
  <div>
    {condition && <Component/>}
    {condition && <Component/>}
    <div/>
  </div>
)
let b = (
  <div>
    {condition && (<Component/>)}
    <div/>
  </div>
)
let c = (
  <div>
    {condition && (<Component/>)}
    {condition && "something"}
  </div>
)
let d = (
  <div>
    {(<Component/>)}
    {condition && "something"}
  </div>
)
// Another example of the above issue (Bug#27000).
function testA() {
  return (
    <div>
      <div> { ( <div/> ) } </div>
    </div>
  );
}
function testB() {
  return (
    <div>
      <div> { <div/> } </div>
    </div>
  );
}
// Another example of the above issue
// (https://github.com/mooz/js2-mode/issues/451).
class Classy extends React.Component {
  render () {
    return (
      <div>
        <ul className="tocListRoot">
          { this.state.list.map((item) => {
            return (<div />)
          })}
        </ul>
      </div>
    )
  }
}

// Self-closing tags should be indented properly
// (https://github.com/mooz/js2-mode/issues/459).
export default ({ stars }) => (
  <div className='overlay__container'>
    <div className='overlay__header overlay--text'>
      Congratulations!
    </div>
    <div className='overlay__reward'>
      <Icon {...createIconProps(stars > 0)} size='large' />
      <div className='overlay__reward__bottom'>
        <Icon {...createIconProps(stars > 1)} size='small' />
        <Icon {...createIconProps(stars > 2)} size='small' />
      </div>
    </div>
    <div className='overlay__description overlay--text'>
      You have created <large>1</large> reminder
    </div>
  </div>
)

// JS expressions should not break indentation
// (https://github.com/mooz/js2-mode/issues/462).
//
// In the referenced issue, the user actually wanted indentation which
// was simply different than Emacs’ SGML attribute indentation.
// Nevertheless, his issue highlighted our inability to properly
// indent code with JSX inside JSXExpressionContainers inside JSX.
return (
  <Router>
    <Bar>
      <Route exact path="/foo"
             render={() => (
               <div>nothing</div>
             )} />
      <Route exact path="/bar" />
    </Bar>
  </Router>
)

// Local Variables:
// indent-tabs-mode: nil
// js-indent-level: 2
// End: