= Apache Camel UI
// Settings:
:experimental:
:hide-uri-scheme:
:ui-module-name: antora-ui-camel
// Project URLs:
:url-project: https://github.com/apache/camel-website
:img-ci-status: {url-project}/badges/master/pipeline.svg
// External URLs:
:url-camel: https://camel.apache.org/
:url-antora: https://antora.org
:url-git: https://git-scm.com
:url-git-dl: {url-git}/downloads
:url-gulp: http://gulpjs.com
:url-opendevise: https://opendevise.com
:url-nodejs: https://nodejs.org
:url-nvm: https://github.com/creationix/nvm
:url-nvm-install: {url-nvm}#installation
:url-source-maps: https://developer.mozilla.org/en-US/docs/Tools/Debugger/How_to/Use_a_source_map
:url-yarn: https://yarnpkg.com
:url-yarn-install: https://yarnpkg.com/en/docs/install

This project represents the Apache Camel UI theme that is used in the {url-camel}[Apache Camel website] documentation site.
The website is generated with {url-antora}[Antora] and this is the UI theme for that.

== Use the Camel UI

If you want to use this UI theme in your Antora-generated site, add the following UI configuration to your playbook:

[source,yaml,subs=attributes+]
----
ui:
  bundle:
    url: {url-project}/releases/download/{current-release}/ui-bundle.zip
    snapshot: true
----

NOTE: The `snapshot` flag tells Antora to fetch the UI when the `--fetch` command-line flag is present.
This setting is required because updates to the UI bundle are pushed to the same URL.
If the URL were to be unique, this setting would not be required.

Read on to learn how to customize the default UI for your own documentation.

== Development Quickstart

This section offers a basic tutorial to teach you how to set up the default UI project, preview it locally, and bundle it for use with Antora.
A more comprehensive can be found in the documentation at {url-antora-docs}.

=== Prerequisites

To preview and bundle the UI, you need the following software on your computer:

* {url-git}[git] (command: `git`)
* {url-nodejs}[Node.js] (command: `node`)
* {url-yarn}[Yarn] (command: `yarn`)

==== git

First, make sure you have git installed.

 $ git --version

If not, {url-git-dl}[download and install] the git package for your system.

==== Node.js

Next, make sure that you have Node.js installed.

 $ node --version

If this command fails with an error, you don't have Node.js installed.
If the command doesn't report an LTS version of Node.js (e.g., v10.15.3), it means you don't have a suitable version of Node.js installed.
In this guide, we'll be installing Node.js 10.

While you can install Node.js from the official packages, we strongly recommend that you use {url-nvm}[nvm] (Node Version Manager) to manage your Node.js installation(s).
Follow the {url-nvm-install}[nvm installation instructions] to set up nvm on your machine.

Once you've installed nvm, open a new terminal and install Node.js 10 using the following command:

 $ nvm install 10

You can switch to this version of Node.js at any time using the following command:

 $ nvm use 10

To make Node.js 10 the default in new terminals, type:

 $ nvm alias default 10

Now that you have Node.js installed, you can proceed with installing the Gulp CLI.

==== Yarn

Finally, you'll need Yarn, which is the preferred package manager for the Node ecosystem.

Follow {url-yarn-install}[the documentation on installing] Yarn for your Operating system.

Now that you have the prerequisites installed, you can fetch and build the Apache Camel UI project.

=== Clone and Initialize the UI Project

Clone the Camel UI project using git:

[subs=attributes+]
 $ git clone {url-project} &&
   cd camel-website/{ui-module-name}

The example above clones the Apache Camel Website project and then switches to the UI project folder on your filesystem.
Stay in this project folder when executing all subsequent commands.

Use Yarn to install the project's dependencies.
In your terminal, execute the following command:

 $ yarn install

=== Preview the UI

The default UI project is configured to preview offline.
The files in the [.path]_preview-src/_ folder provide the sample content that allow you to see the UI in action.
In this folder, you'll primarily find pages written in AsciiDoc.
These pages provide a representative sample and kitchen sink of content from the real site.

To build the UI and preview it in a local web server, run the `preview` command:

 $ yarn preview

You'll see a URL listed in the output of this command:

....
[12:00:00] Starting server...
[12:00:00] Server started http://localhost:5252
[12:00:00] Running server
....

Navigate to this URL to preview the site locally.

While this command is running, any changes you make to the source files will be instantly reflected in the browser.
This works by monitoring the project for changes, running the `preview:build` task if a change is detected, and sending the updates to the browser.

Press kbd:[Ctrl+C] to stop the preview server and end the continuous build.

=== Package for Use with Antora

If you need to package the UI so you can use it to generate the documentation site locally, run the following command:

 $ yarn build

If any errors are reported by lint, you'll need to fix them.

When the command completes successfully, the UI bundle will be available at [.path]_build/ui-bundle.zip_.
You can point Antora at this bundle using the `--ui-bundle-url` command-line option.

If you have the preview running, and you want to bundle without causing the preview to be clobbered, use:

 $ gulp bundle:pack

The UI bundle will again be available at [.path]_build/ui-bundle.zip_.

==== Source Maps

The build consolidates all the CSS and client-side JavaScript into combined files, [.path]_site.css_ and [.path]_site.js_, respectively, in order to reduce the size of the bundle.
{url-source-maps}[Source maps] correlate these combined files with their original sources.

This "`source mapping`" is accomplished by generating additional map files that make this association.
These map files sit adjacent to the combined files in the build folder.
The mapping they provide allows the debugger to present the original source rather than the obfuscated file, an essential tool for debugging.

In preview mode, source maps are enabled automatically, so there's nothing you have to do to make use of them.
If you need to include source maps in the bundle, you can do so by setting the `SOURCEMAPS` environment varible to `true` when you run the bundle command:

 $ SOURCEMAPS=true gulp bundle

In this case, the bundle will include the source maps, which can be used for debuggging your production site.

== Copyright and License

=== Software

The software in this repository (build scripts, JavaScript files, Handlebars templates, foundation CSS, utility icons, etc)
is part of the {url-antora}[Antora project] and therefore copyright for these parts and the underlying source code belongs
to {url-opendevise}[OpenDevise Inc] and the {url-antora}[Antora project].

As such, use of the software is granted under the terms of the
https://www.mozilla.org/en-US/MPL/2.0/[Mozilla Public License Version 2.0] (MPL-2.0). See link:LICENSE[] to find the full license text.

