<!--
  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="media">
    <a ui-sref="bundle.type({bundleId: bundle.symbolicName, bundleVersion: bundle.version, typeId: type.symbolicName, typeVersion: type.version})"></a>
    <div class="media-left media-middle icon">
        <img ng-src="{{ ::type | iconGeneratorPipe:'symbolicName' }}" class="media-object" alt="{{::type.symbolicName}}'s logo" />
    </div>
    <div class="media-body catalog-item-body">
        <div class="btn-group pull-right" ng-if="showBundle || showType">
            <a ui-sref="bundle({bundleId: bundle.symbolicName, bundleVersion: bundle.version})" class="btn btn-default btn-sm" ng-if="showBundle">
                <i class="fa fa-fw fa-file-zip-o"></i> {{::bundle.symbolicName}}
            </a>
            <button type="button" class="btn btn-default btn-sm" disabled ng-if="showType">
                {{::type.supertypes[0].split('.').pop()}}
            </button>
        </div>
        <h4 class="media-heading">
            <i class="fa fa-star" ng-if="type.template" aria-label="This item is a template"></i>
            {{::(type.displayName || type.symbolicName)}}
            <span class="label label-default">{{::type.version}}</span>
        </h4>
        <span class="media-description">
            <span ng-if="type.displayName"><i class="fa fa-fw fa-bookmark sym-name"></i> <samp class="sym-name">{{::type.symbolicName}}</samp>{{::descriptionMarkdown.oneline ? ':' : ''}} </span>
            <md-first-line data="descriptionMarkdown"></md-first-line>
        </span>
    </div>
</div>
