////
     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.
////
= NetBeans templates

Templates are Groovy Server Pages that will be filled-in with elements in the link:../[content directory].

== Creating templates

This directory contains some templates for different types of pages.

NOTE: As a good practice, if you open an HTML tag in one template make sure the tag *is also closed in the same* template.

NOTE: Templates must be also manually added to the file `jbake.properties`

== Main templates

These are the main templates used in this project. Files ending in `.gsp` are "Groovy Server Pages" pages, this is, can be scripted using Groovy:

=== Complete page templates

- *page.gsp* A skeleton for plain HTML 5 pages, with a `hero` banner. An aside on the right hosts the table of contents of the content.
- *page-noaside.gsp* A skeleton for the main page (without asides).

=== Web page parts

These parts are included in the

- *head.gsp* The `<head>` tag for all pages.
- *footer.gsp* The footer section for all pages.
- *menu.gsp* The NetBeans web site menu.
- *news.gsp* A top area that gets printed in every page of the website, usually for news and announcements.
- *tools.gsp* A bottom area that contains social network links, and a pointer to github's home.



