Teflon is a build system designed to make polymer based application development easy.
Setup | How to create a page | How to create an element
- Download this repository into your project folder.
- Install node.
- Run
npm install
to install all of the dependencies in the package.json file. - Remove any files not related to the build that you do not want. Below is a list of extraneous files:
- All of the subtle elements in
source/elements/subtle/
. - In
source/elements/core/core-scripts/
theunderscore.js
file is extra but thewebcomponents-lite.js
file is necessary. - In
source/elements/core/core-styles/
you can find thenormalize.css
file, I would suggest keeping it in but its not needed for the build.
- You should also edit the content of the following files:
- The sample pages
source/index.jade
&source/about.jade
. - The properties of
package.json
with the exception of main, scripts & dependencies.
To use Teflon, type the command node bin/build.js
, which runs the build.js file with no arguments. This will produce an optimized uncompressed build in the app
folder. The following are Teflon's arguments which can be used to unlock additional functionality, they also can be used concurrently:
argument | Effect |
---|---|
--c or --compress |
Compress all production files |
--s or --server |
Run a development server to serve your build folder with the flag |
--p=XXXX |
Use a custom port |
--a=xxx.xx.xxx.x |
Use a custom address |
--w or --watch |
Detect file changes and rebuild appropriately |
--d or --debug |
Prevents the intermediate build folders from being erased |
The shortcuts in the package.json
file can ease developement: npm run dev
is an alias for node bin/build.js --d --w --s
which sets up a developement enviroment; npm run build
is an alias for node bin/build.js --c
, which generates a production build.
To make a new page create a file on the top level of the source/
folder with either a .html
or a .jade
ending. Once that file is made Teflon will proccess it. Its important to note that any jade or html file will be parsed as a page. If you want to have a secondary jade file to import into your main page place it in the source/imports/jade/
folder. If you are creating an html file you wish to import into a page, you should read the section below.
Collections are the folders right below the source/elements/
folder. In order to add new elements to a project, first you need to add an appropriate collection folder or choose an existing one. The initial collection folders are source/elements/subtle/
and source/elements/core/
. The core collection has a special property, any of its element will be inlined into the page instead of being linked to. Inlined elements can be used to reduce the time to first render and interactive state.
Elements are created from jade files, html files or directories. To use a prebuilt element create a collection folder and drop the html file into it. For more complicated element creation see below.
In order to use your own external style and script files, add them to the source/elements/core/core-scripts
folder and the source/elements/core/core-styles
folder. You will need to add links in the source/elements/core/core-styles/index.jade
for your styles and source/elements/core/core-scripts/index.jade
for your scripts. This ensures the javascript files will be linted and transpiled from ES6. It also ensures css files will be compiled from sass or scss if applicable then auto-prefixed and organized. Please note these files only exist in the final project as inlined scripts and styles.
The goal of Teflon is to provide a large degree of flexibility when building out elements. For a file to be registered as an element it needs to be a template file ( .jade
or .html
) located directly inside of a collection folder. Files like this must be self contained so no imported files besides other elements are to be used. If you would like to import style or script files instead create a directory. Inside this directory there must be either an index.jade
or index.html
file to represent the main template file. Any script, style or template file you place inside the folder will be processed. This is useful for building out elements that only exist as children of specific other elements. For example, in source/elements/subtle/subtle-dropdown
the subtle-dropdown-option.jade
is an element only used inside of elements/subtle/subtle-dropdown.html
. In that same example you can see how the option-style.css
and the option-script.js
files are processed and parsed and inlined in the same way as the script.js
and style.scss
files.
- autoprefixer
- babel
- csscomb
- cssnano
- express
- fs-extra-promise
- glob
- html-minifier
- jade
- jshint
- node-sass
- node-watch
- postcss
- rsvp
- uglify-js
- underscore
- vulcanize
source/
elements/
imports/
jade/
_config.jade <-- file to be imported into jade files
_mixin.jade <-- file to be imported into jade files
sass/
_config.scss <-- file to be imported into sass/scss files
_mixin.scss <-- file to be imported into sass/scss files
media/
about.jade <-- Page
index.jade <-- Page
source/
elements/
core/
core-polymer/
core-scripts/
index.jade
underscore.js <-- Global script file
webcomponents.js <-- Global script file
core-styles/
index.jade
normalize.css <-- Global style file
core-structure.html
subtle/
imports/
jade/
_config.jade <-- file to be imported into jade files
_mixin.jade <-- file to be imported into jade files
sass/
_config.scss <-- file to be imported into sass/scss files
_mixin.scss <-- file to be imported into sass/scss files
media/
about.jade
index.jade
source/
elements/
core/ <-- Collection ( core modules will be inlined )
subtle/ <-- Collection ( will not be inlined )
imports/
media/
about.jade
index.jade
source/
elements/
core/
core-polymer/
index.jade <-- An example of a non-polymer element
polymer-micro.js
polymer-mini.js
polymer.js
core-scripts/
index.jade <-- An example of a non-polymer element
underscore.js
webcomponents.js
core-styles/
index.jade
normalize.css
core-structure.html <-- An example of a self contained element
subtle/
subtle-button/
index.jade <-- The main template of a folder based element
script.js <-- Script file to be imported
style.scss <-- Style file to be imported
subtle-calendar/
index.jade
script.js
style.scss
subtle-dropdown/
index.jade
script.js
style.scss
subtle-dropdown-option.jade <-- A secondary element defined for use with subtle-dropdown
option-script.js <-- script file for the secondary element
option-style.scss <-- style file for the secondary element
subtle-input/
index.jade
script.js
style.scss
subtle-tabs/
index.jade
script.js
style.scss
subtle-textarea/
index.jade
script.js
style.scss
imports/
jade/
_config.jade <-- file to be imported into jade files
_mixin.jade <-- file to be imported into jade files
sass/
_config.scss <-- file to be imported into sass/scss files
_mixin.scss <-- file to be imported into sass/scss files
media/
about.jade
index.jade