<!--
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
-->
<div class="modal-dialog {{mainClass}} " style="width:{{width}}" role="document">
    <div class="modal-content">
        {{#if title}}
        <div class="modal-header">
            <a class="close">&times;</a>
            <h4 class="modal-title">
                    {{#if titleHtml}}
                        {{{tt title}}}
                      {{else}}
                        {{tt title}}
                      {{/if}}
                </h4>
        </div>
        {{/if}} {{#if contentWithFooter}} {{else}}
        <div class="modal-body">{{content}}</div>
        {{#if showFooter}}
        <div class="modal-footer">
            {{#if buttons}} {{#each buttons}}
             <button type="button" class="btn btn-atlas {{this.btnClass}}">{{this.text}}</button>
            {{/each}} {{else}} {{#if allowCancel}} {{#if cancelText}}
            <button type="button" class="btn btn-atlas cancel">{{tt cancelText}}</button>
            {{/if}} {{/if}}
            <button type="button" class="btn btn-atlas ok">{{tt okText}}</button>
            {{/if}}
        </div>
        {{/if}} {{/if}}
    </div>
</div>