#
# 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.
#

site:
  title: Apache Logging Parent
  url: "https://logging.apache.org/logging-parent"
  start_page: "ROOT::index.adoc"

content:
  sources:
    - url: .
      branches: HEAD
      start_paths:
        - target/generated-site/antora
      edit_url:

asciidoc:
  extensions:
    - "@asciidoctor/tabs"

ui:

  bundle:
    url: "https://gitlab.com/antora/antora-ui-default/-/jobs/artifacts/HEAD/raw/build/ui-bundle.zip?job=bundle-stable"
    snapshot: true

  # Template files: https://github.com/asciidoctor/asciidoctor-docs-ui/blob/main/src
  # Template variables: https://docs.antora.org/antora-ui-default/templates
  supplemental_files:

    # Add `@asciidoctor/tabs` extension styles
    - path: css/vendor/tabs.css
      contents: ./node_modules/@asciidoctor/tabs/dist/css/tabs.css

    # Add `@asciidoctor/tabs` extension scripts
    - path: js/vendor/tabs.js
      contents: ./node_modules/@asciidoctor/tabs/dist/js/tabs.js

    - path: partials/footer-scripts.hbs
      contents: |
        <script id="site-script" src="{{{uiRootPath}}}/js/site.js" data-ui-root-path="{{{uiRootPath}}}"></script>
        <script async src="{{{uiRootPath}}}/js/vendor/highlight.js"></script>
        <!-- `@asciidoctor/tabs` extension scripts -->
        <script async src="{{{uiRootPath}}}/js/vendor/tabs.js"></script>
        {{#if env.SITE_SEARCH_PROVIDER}}
        {{> search-scripts}}
        {{/if}}

    - path: partials/head-styles.hbs
      contents: |
        <link rel="stylesheet" href="{{{uiRootPath}}}/css/site.css">
        <link rel="icon" href="{{{uiRootPath}}}/../_images/favicon.ico" type="image/x-icon">
        <!-- `@asciidoctor/tabs` extension styles -->
        <link rel="stylesheet" href="{{{uiRootPath}}}/css/vendor/tabs.css">
        <style>
          /* `page-toclevels` greater than 4 are not supported by Antora UI, patching it: */
          .toc .toc-menu li[data-level="4"] a {
            padding-left: 2.75rem
          }
          /* Replace the default highlight.js color for strings from red to green: */
          .hljs-string {
            color: #0f8532;
          }
        </style>

    - path: partials/header-content.hbs
      contents: |
        <header class="header">
          <nav class="navbar">
            <div class="navbar-brand">
              <span class="navbar-item title">{{site.title}}</span>
            </div>
            <div id="topbar-nav" class="navbar-menu">
              <div class="navbar-end">
                <a class="navbar-item" href="https://logging.apache.org">a subproject of&nbsp;<strong>Apache Logging Services</strong></a>
              </div>
            </div>
          </nav>
        </header>

    - path: partials/footer-content.hbs
      contents: |
        <footer class="footer">
          <p>
            Copyright © 1999-{{{year}}} <a href="https://www.apache.org/">The Apache Software Foundation</a>.
            Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache Software License, Version 2.0</a>.
            Please read our <a href="https://privacy.apache.org/policies/privacy-policy-public.html">privacy policy</a>.
          </p>
          <p>
            Apache, Log4j, and the Apache feather logo are trademarks or registered trademarks of The Apache Software Foundation.
            Oracle and Java are registered trademarks of Oracle and/or its affiliates.
            Other names may be trademarks of their respective owners.
          </p>
        </footer>

    # Disable component version selector
    - path: partials/nav-explore.hbs
      contents: ""

    # Fix the `Edit this page` link
    - path: partials/edit-this-page.hbs
      contents: |
        <div class="edit-this-page"><a href="https://github.com/apache/logging-parent/edit/main/src/site/antora/modules/{{page.module}}/pages/{{page.relativeSrcPath}}">Edit this Page</a></div>
