{{/*
 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.
*/}}

{{ $icon := .Get "logo_path" }}
<details class="accordion">
    <summary>
        <div class="accordion__arrow">
            {{ with resources.Get "icons/accordion-arrow.svg" }}{{ ( . | minify).Content | safeHTML }}{{ end }}
        </div>
        <div class="accordion__summary-content">
            {{ if $icon }}
                <div class="accordion__summary-content--icon">
                    {{ with resources.Get $icon }}{{ ( . | minify).Content | safeHTML }}{{ end }}
                </div>
            {{ end }}
<div>
    <h4 class="accordion__summary-content--header {{ if $icon }} subtitle__large--greyish-brown {{ else }} subtitle__large--cerulean-blue {{ end }}">{{ .Get "title" }}</h4>
    <span class="bodytext__medium--brownish-grey">{{ .Get "description" }}</span>
    </div>
</div>
    </summary>
    <div class="accordion__content {{if $icon }}indented{{ end }}">{{ .Inner }}</div>
</details>
