==> Development: Overview <==
Development is quite easy with this skin.
->> Skin structure <<-
The src directory has these files / directories:
| Name | Content | Description | 
|---|---|---|
| archive/ | TXT templates | This dir contains the NOAA TXT report templates | 
| css/ | bootstrap.min.css style.css / style.min.css | This dir contains the minified bootstrap css + the generated CSS file | 
| fonts/ | Rubik-* | This dir contains the Rubik web font files | 
| img/ | icon-*.png / splash screens | This dir contains all used images | 
| js/ | *.js / modules / vendor | This dir contains all JS files | 
| scss/ | *.scss | This dir contains all SCSS sass source files which get build into css/ | 
| weather-icons/ | css / font / svg | This dir contains the weather icons package | 
| almanac.html.tmpl | Almanac page | Cheetah template file | 
| archive.html.tmpl | Archive overview page | Cheetah template file | 
| footer.inc | Footer part for each template | Included in all templates | 
| graph_area_archive_config.inc | Common JS code for all archive area charts | Included in JS part of each archive template | 
| graph_area_config.inc | Common JS code for all area charts | Included in JS part of each template | 
| graph_bar_archive_config.inc | Common JS code for all archive bar charts | Included in JS part of each archive template | 
| graph_bar_config.inc | Common JS code for all bar charts | Included in JS part of each template | 
| graph_radar_config.inc | Common JS code for all radar charts | Included in JS part of each template | 
| head.inc | Head part of all templates (meta tags, css) | Included in all templates | 
| header.inc | Header part of all templates (nav bar) | Included in all templates | 
| index.html.tmpl | Current page | Cheetah template file | 
| js.inc | Common JS code | Included in all templates | 
| manifest.json | Web App manifest | Not used by generator - only copied once | 
| month.html.tmpl | Month page | Cheetah template file | 
| month-%Y-%m.html.tmpl | Monthly archive page (%Y = year, %m = month, will be replaced by generator) | Cheetah template file | 
| package.json | Yarn config file with all 3rd party packages needed for development | Only for development | 
| skin.conf | Main config file for this skin | Skin config file | 
| telemetry.html.tmpl | Telemetry page | Cheetah template file | 
| week.html.tmpl | Week page | Cheetah template file | 
| yarn.lock | Lock file of yarn packages | Only for development | 
| year.html.tmpl | Year page | Cheetah template file | 
| year-%Y.html.tmpl | Yearly archive page (%Y = year, will be replaced by generator) | Cheetah template file | 
| yesterday.html.tmpl | Yesterday page | Cheetah template file | 
->> Template structure <<-
                            Each .html.tmpl file has a similar structure.
                        
To make the code more compact and reduce repeating the same content again and again we use some functions.
All code is well commented so just dive in a template file and have a look.
                            Each template has a $valuesCard() function.
                            This is a small macro which
                            will generate the values card (left column) with min / max values and the big
                            one in the middle.
                        
This macro contains some special cases for wind and rain but can easily be adjusted.
Similar to the values cards there's also a chartCard function which will generate a display card for a chart. But only the card - the chart must be defined later in the JS section.
After these two definitions the main layout starts.
Then the chart section starts. There are two more functions which are used:
                            The $getChartData() function is only used
                            internally to get the data from WeeWX and store it in an array.
                        
                            The $getChartJsCode() function creates
                            the needed JS code for displaying a chart. This will also call getChartData.
                        
After the function definitions the chart definitions start where all available charts are defined.
In most cases the macros are used. Only the wind vector needs to be calculated because these values aren't available directly through WeeWX.
->> Adding values / charts <<-
A new value
                            To display a new value it only needs to be added in the skin.conf.
                            In the [[Appearance]] section in
                            values_order you simply add the name of
                            this value and it will get displayed if data is available.
                        
                            The $valuesCard() function uses any
                            available name to display data.
                        
A new chart
To display a new chart you need to do a bit more.
                            First you need to give it a name. Add this name to charts_order in the
                            [[Appearance]]
                            section like you've added a new value to values_order.
                        
Then go through each .html.tmpl file, look for the Chart definitions section and add the chart like any other chart is added.
                            You simply need to call the $getChartJsCode() function.
                            For example in the index.html.tmpl I added a second chart after outTemp + Dewpoint:
                        
// outTemp + Dewpoint
$getChartJsCode("outTemp", "outTempchart", "area", "outTemp", "dewpoint")
// My new chart
$getChartJsCode("myfancynewchart", "myfancynewchart", "area", "appTemp", "extraTemp1")
                            In this case I need to add myfancynewchart to
                            charts_order.
                            This is declared twice because the first value is the name of the chart, the second
                            the ID which is the same in this case.
                        
                            This would create an area chart with the values of
                            appTemp and extraTemp1.
                        
See the description below for further information.
A new hope
We all like Star Wars but this skin won't need any more hope because it's already so hopeful.
->> Template functions <<-
All .html.tmpl templates have some functions / macros included.
valuesCard - add a values card (left column)
$valuesCard("name")Name must be a valid sensor / observation name, like outTemp or rain.
This function includes special cases for names "windSpeed" and "rain".
chartCard - add a chart card (right column)
$chartCard("name", "id", "name2")
                            Name must be a valid sensor / observation name,
                            like outTemp or rain.
                        
                            Same for name2 but this is optional.
                            If name2 is set the title of the card
                            will show: name1 & name2.
                        
                            The names must be valid label names, so obs.label.$name
                            must be available.
                        
                            The id of this card must be unique and set in
                            the JS part as well so the chart knows where to be displayed.
                        
getChartData - get data from WeeWX and store in an array
$getChartData("name", "column")
                            As said before this is only used internally by the
                            $getChartJsCode() function.
                        
                            Name must be a valid sensor / observation name,
                            like outTemp or rain.
                        
                            The column is the wanted column of this
                            sensor / observation. This can be something
                            like min, avg
                            or max.
                        
getChartJsCode - add the whole JS code for a chart
This function will add the needed JS code for a chart. Each chart can display up to 4 different sensors (series).
$getChartJsCode("name", "id", "type", "series1", "series2", "column", "series3", "series4")| name | The unique name of the chart. Only used internally, e.g. for charts_order | 
| id | The id of the chart card element. So JS knows where the chart should be displayed. | 
| type | The type of the chart. Can be any ApexCharts type. Mostly needed: area,bar | 
| series1 | Name of sensor / observation which should be displayed in the chart | 
| series2 | (Optional) Name of second sensor / observation which should be displayed in the chart as well | 
| column | (Optional) The wanted column of the sensor / observation. By default this is avgbut can also bemin,maxor something similar. | 
| series3 | (Optional) Name of third sensor / observation which should be displayed in the chart as well | 
| series4 | (Optional) Name of fourth sensor / observation which should be displayed in the chart as well |