dynamic-styleguide v1.3.0
dynamic-styleguide
This projects is used to define and use a set of components and web elements as style guide, serving them with an use explanation, they implementation alternatives and a live editor. It also provides a use to serve static pages.
Prerequisites
- install nvm
- install node (>=8.9.0)
- install yarn
Add it as a development dependency
First, add this project as a npm development dependency in your package.json file:
"devDependencies": {
"dynamic-styleguide": "^1.3.0"
}In the same file, but in the scripts node, add "styleguide": "dynamic-styleguide":
"scripts": {
"styleguide": "dynamic-styleguide"
},Configuration
To use this tool under your own project, you should create a styleguide.config.json file in your project root folder. This file should look like this:
{
"parent": "base.config.json",
"uiFolder": "ui",
"distFolder": "demo-dist",
"elementsSitemapFile": "demo-dist/sitemap.xml",
"deployPort": 3000,
"bundled": {
"css" : [
"assets/styles.css"
],
"js" : [
"assets/app.js"
]
},
"elementsUrlDirectory": "view",
"projectType": "HTML",
"pages": {
"pagesFolder": "pages",
"pagesUrlNamespace": "pages"
},
"contents": {
"pageTitle": "Hanzo Style Guide",
"logo": {
"content": "",
"href": "/"
},
"sideMenuLinks": []
},
"extraHandlers": [
{
"folder": "core/colors",
"loaderName": "color-grid.loader",
"config": {
"variationsFileName": "_functions.scss",
"variationsVarName": "color-grades",
"colorsFileName": "_vars.scss"
}
},
{
"folder": "core/typography",
"loaderName": "typeset-list.loader",
"config": {
"typesetVarName": "font-typeset"
}
}
]
}parentreferences another config file from which the current one will 'extends'.uiFolderdefines the folder where the components to display are placed.distFolder, where your compiled/transposed files need to be rendered from.elementsSitemapFile, if this is defined, a xml will be written to its defined file, specifying the site map of 'components' and 'modules'deployPortdefines which port will be used, by default it is3000.bundleddefines the routes to the specific files that will be loaded.elementsUrlDirectoryis the the first part of the URL path under which the elements pages will be rendered. The default value isviewand can not be empty.projectType: Defines how the content will be handled. By default, just plainHTMLcontent. The values are unsensitive case Allowed project types:- hugo
- html
pages
pagesFolderdefines the folder where the pages to read their comments are.pagesUrlNamespaceis the the first part of the URL path under which the pages pages will be rendered. The default value ispagesand can not be empty.contents
pageTitleis the string to be shown as title in the browser.logodefines the logo content and where links to.sideMenuLinksThis array will render links in the side menu instead of the top one. By default it is empty. The objects inside the array must have defined two nodes:href(string) and `content (string or HTML).
extraHandlers
extraHandlers is an array with objects that must have the following structure:
folderdefines witch folder will be handledloaderNameis the loader file name that will be useconfigis the extra data that will be passed to the loader Take a look at thedefault.config.jsonfile to check what are the handlers implemented by default. For more info go to Extra handlers
Expected UI folder structure
UI library architecture and background information will be part of another repository.
ui
├── components
| └── nav #namespace folder --> can be ignored in the navigation
| └── menu
| ├── example.txt
| ├── readme.md
| └── styles.scss
├── core
| ├── readme.md --> Optional too
| └── breakpoints
| ├── example.txt
| └── readme.md
└── modules
└── header
├── example.txt
└── readme.mdexample.txt and styles.scss files are optional and should include valid content.
In the ui folder and in every first lever folder (namespace) can be defined a readme.md.
components, core and modules are part or the web elements that can be use in the app and are shown in this style guide.
Elements style alternatives
In the elements folders can exist a style.scss file with some styles to be applied to that element. The host project is the responsible for compile it. This project will just read it from the build destination folder (See the Configuration section).
Inside the styles.scss file can be defined a comment block that would specify the render variants for the element. We use SassDoc to define the structure of the comment block and extended this documentation system to support custom annotations.
These annotations will allow us pick, from the element description page, between different render alternatives.
These are the supporter annotations:
@variantsThis annotation allow us to add classes to our element, and there are two type of them: the
disjunctionand theexclusiveones.The former are the used by default and render a block of checkboxes to pick variants from. Several variants can be picked at the same time.
The latter will render radio inputs, so one variant at a time can be picked.
The type is defined by the string following the annotation itself. After this comes title, using a
-as separator. Then, in a new line, comes the entries: every new line will be considered a new entry, the value and description will be separated by the first:occurrence. Title and type are optionals. There can not be a title without a type.Example:
/// @variants disjunction - Text ype variants /// c-hello--underline: Underline the text /// c-hello--italic: Make the text italic /// /// @variants /// c-hello--big: Make the text bigger /// /// @variants exclusive - Background color /// c-hello--green: Change the background to green /// c-hello--orange: Change the background to orange /// /// @variants exclusive /// c-hello--white-text: Change the color text to to white /// c-hello--firebrick-text: Change the color text to to firebrickTo define where to apply this classes, in own
example.txtwe have to add{{variant}}.
<div class="c-hello {{variant}}">
<h2>This is a foo-component</h2>
</div>Expected pages folder structure
To allow compatibility with any kind of static site generator, pages section reads a sitemap.xml to build the pages list.
We updated dist property on config object so we can have separated folder for assets and pages. Pages and assets now are objects with relPath and slug properties. This will make sure that the styleguide and the project itself serve static content properly.
Arguments
By default, the app try to load the styleguide.config.json file, but a custom file name could be passed as argument:
$ yarn styleguide --configFile my.config.jsonThe custom config file must the placed in the root folder of the project
This the list of the allowed arguments
- configFile
Extra handlers
As some elements need to render extra information, extra handlers can be defined in the config file,as an object in extraHandlers array. Every one of these objects must have defined a folder, and every element path that match that folder, will be handled with the defined loader (loaderName).
folder is the relative path of the element starting from the ui folder.
The data that the loader(s) return will be passed to the element template. The element's folders that have defined extra handler are:
core/colorscore/typographycore/icons
Available handlers
Color Grid
Used to render a grid with the different variables colors. These are obtained parsing some SCSS files. This is the config that must be defined in the handler:
{
"folder": "core/colors",
"loaderName": "color-grid.loader",
"config": {
"variationsFileName": "_functions.scss",
"variationsVarName": "color-grades",
"colorsFileName": "_vars.scss"
}
},variationsFileNameis the file in which is definedvariationsVarNamethat have assigned the allowed colors grades. That variable must be in the root of the file. E.g.:
$color-grades: dark, base, soft, light;colorsFileNameis the file in which are defined all the colors and their variations that will me rendered in the element page. Every variable will be considered a color. E.g.:
$blue : ( dark: #20438D, base: #315AAF, light: #729AEC );Typeset
Used to render all the typographies variants defined in a SCSS file. These is the expected config definition:
{
"folder": "core/typography",
"loaderName": "typeset-list.loader",
"config": {
"typesetVarName": "font-typeset"
}
}typesetVarNamethe variable that have the font alternatives.
A styles.scss file in the defined folder path is mandatory to be loaded and get from there the typesetVarName values.
E.g.:
$font-typeset: (
cs-book-xxl: (
xs: (
font-family: font(circular),
font-size: 35px,
line-height: 48px,
font-weight: weight(regular)
),
sm: (
font-size: 12px,
line-height: 13px
)
...
),
...Icons table
Used to render a table with all the svg icon files from the assets folder. These icons are clickable, which will update the editor and the rendered example, applying the selected variants too.
{
"folder": "core/icons",
"loaderName": "icons-table.loader",
"config": {
"containerTemplate": "<span class=\"cr-icon {{variant}}\">{{content}}</span>"
}
}containerTemplate: Is the HTML template into which the SVG code will be injected, replacing the{{content}}key. Also{{variant}}need to be defined in order to apply the icon's variants.
Running it
To run the project you need the assets to be present in distFolder (that depends on your project dev/builds strategy), then just run
$ yarn styleguideThe app will be deployed by default to http://localhost:3000
Add it as a development dependency
If you did not before, add this project as a npm development dependency in your package.json file (be careful and try to use the latest available version):
"devDependencies": {
"dynamic-styleguide": "^1.3.0"
}Or using yarn
$ yarn add -D dynamic-styleguideDevelop installation
If you want to modify this project, you should run it in development mode:
Clone the project from git@github.com:hanzo-es/dynamic-styleguide.git
Install nvm and required node version:
Install nvm and them
$ nvm install && nvm useinstall the dependencies
$ yarn install
Run the project for develop
To launch the project to work on it just launch the start script
$ yarn dev The example-project folder will be used to load the different example elements.
This will launch the server on the default location, http://localhost:3000 or http://localhost:3001. (See the Configuration section to change the port).