#
# 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 Log4j Transform
  url: "https://logging.apache.org/log4j/transform"
  start_page: "ROOT::index.adoc"

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

runtime:
  log:
    # Fail on warnings
    failure_level: warn

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>
          /* Swap colors of `IMPORTANT` and `WARNING` blocks */
          .doc .admonitionblock.important .icon { background-color: #f70; }
          .doc .admonitionblock.warning .icon { background-color: #e40046; }
          /* Default `h4`, `h5`, and `h6` are smaller than the normal text, fix header font sizing: */
          .doc h1 { font-size: 1.9rem; }
          .doc h2 { font-size: 1.7rem; }
          .doc h3 { font-size: 1.5rem; font-weight: 400; }
          .doc h4 { font-size: 1.3rem; font-weight: 500; }
          .doc h5 { font-size: 1.1rem; font-weight: 500; text-decoration: underline; }
          .doc h6 { font-size: 0.9rem; font-weight: 500; text-decoration: underline; }
          /* Default `code`, `pre`, and `.colist` (source code annotations) fonts are too big, adjust them: */
          .doc .colist>table code, .doc p code, .doc thead code { font-size: 0.8em; }
          .doc pre { font-size: 0.7rem; }
          .doc .colist { font-size: 0.75rem; }
          /* Make links more visible: */
          .doc a { text-decoration: underline; }
          .doc a code { text-decoration: underline; color: #1565c0; }
          /* Tab header fonts aren't rendered good, adjusting the font weight: */
          .tablist > ul li { font-weight: 500; }
          /* `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 (unnecessarily signaling something negative) 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-log4j-transform/edit/main/src/site/antora/modules/{{page.module}}/pages/{{page.relativeSrcPath}}">Edit this Page</a></div>
