reustyle 2.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.drone.yml +17 -0
- data/.gitignore +25 -0
- data/.nvmrc +1 -0
- data/.rbenv-gemsets +1 -0
- data/.ruby-version +1 -0
- data/CONTRIBUTING.md +68 -0
- data/Gemfile +4 -0
- data/Gruntfile.js +234 -0
- data/LICENSE.txt +13 -0
- data/README.md +196 -0
- data/Rakefile +6 -0
- data/bower.json +54 -0
- data/config/autoprefixer.yml +6 -0
- data/config/scss-lint.yml +55 -0
- data/dist/icons.svg +1 -0
- data/dist/ustyle-content.css +1 -0
- data/dist/ustyle-latest.css +1 -0
- data/dist/ustyle.js +567 -0
- data/dist/ustyle.json +1 -0
- data/dist/ustyle.min.js +1 -0
- data/grunt/modules/dss-helper.js +115 -0
- data/grunt/modules/file.js +24 -0
- data/grunt/modules/html-parser.js +22 -0
- data/grunt/modules/templates.js +57 -0
- data/grunt/tasks/browser-sync.js +23 -0
- data/grunt/tasks/builder.js +67 -0
- data/grunt/tasks/styleguide.js +299 -0
- data/index.js +37 -0
- data/lib/ustyle/deploy.rb +41 -0
- data/lib/ustyle/engine.rb +32 -0
- data/lib/ustyle/hash.rb +44 -0
- data/lib/ustyle/helpers/icon_helper.rb +15 -0
- data/lib/ustyle/icons.rb +13 -0
- data/lib/ustyle/middleware/icon_middleware.rb +27 -0
- data/lib/ustyle/sass_functions.rb +65 -0
- data/lib/ustyle/sinatra.rb +34 -0
- data/lib/ustyle/sprockets.rb +6 -0
- data/lib/ustyle/utils.rb +42 -0
- data/lib/ustyle/version.rb +4 -0
- data/lib/ustyle.rb +58 -0
- data/package-lock.json +9303 -0
- data/package.json +89 -0
- data/styleguide/CNAME +1 -0
- data/styleguide/assets/images/CTAs.png +0 -0
- data/styleguide/assets/images/badge-label-usp.png +0 -0
- data/styleguide/assets/images/bower-logo.png +0 -0
- data/styleguide/assets/images/caveat.png +0 -0
- data/styleguide/assets/images/cloudfront-logo.png +0 -0
- data/styleguide/assets/images/design-conventions.png +0 -0
- data/styleguide/assets/images/error-texts.png +0 -0
- data/styleguide/assets/images/external-requirements.png +0 -0
- data/styleguide/assets/images/favicon/android-chrome-192x192.png +0 -0
- data/styleguide/assets/images/favicon/android-chrome-512x512.png +0 -0
- data/styleguide/assets/images/favicon/apple-touch-icon-114x114.png +0 -0
- data/styleguide/assets/images/favicon/apple-touch-icon-120x120.png +0 -0
- data/styleguide/assets/images/favicon/apple-touch-icon-144x144.png +0 -0
- data/styleguide/assets/images/favicon/apple-touch-icon-152x152.png +0 -0
- data/styleguide/assets/images/favicon/apple-touch-icon-180x180.png +0 -0
- data/styleguide/assets/images/favicon/apple-touch-icon-57x57.png +0 -0
- data/styleguide/assets/images/favicon/apple-touch-icon-60x60.png +0 -0
- data/styleguide/assets/images/favicon/apple-touch-icon-72x72.png +0 -0
- data/styleguide/assets/images/favicon/apple-touch-icon-76x76.png +0 -0
- data/styleguide/assets/images/favicon/apple-touch-icon.png +0 -0
- data/styleguide/assets/images/favicon/browserconfig.xml +9 -0
- data/styleguide/assets/images/favicon/favicon-16x16.png +0 -0
- data/styleguide/assets/images/favicon/favicon-32x32.png +0 -0
- data/styleguide/assets/images/favicon/favicon.ico +0 -0
- data/styleguide/assets/images/favicon/manifest.json +18 -0
- data/styleguide/assets/images/favicon/mstile-144x144.png +0 -0
- data/styleguide/assets/images/favicon/mstile-150x150.png +0 -0
- data/styleguide/assets/images/favicon/mstile-310x150.png +0 -0
- data/styleguide/assets/images/favicon/mstile-310x310.png +0 -0
- data/styleguide/assets/images/favicon/mstile-70x70.png +0 -0
- data/styleguide/assets/images/favicon/safari-pinned-tab.svg +46 -0
- data/styleguide/assets/images/icons.svg +1 -0
- data/styleguide/assets/images/infographic-01.png +0 -0
- data/styleguide/assets/images/infographic-02.png +0 -0
- data/styleguide/assets/images/npm-logo.png +0 -0
- data/styleguide/assets/images/placeholder-text.png +0 -0
- data/styleguide/assets/images/ruby-logo.png +0 -0
- data/styleguide/assets/images/site-consistency01.png +0 -0
- data/styleguide/assets/images/site-consistency02.png +0 -0
- data/styleguide/assets/images/site-consistency03.png +0 -0
- data/styleguide/assets/images/styleguide-examples/accurate-housing.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/altered.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/bad-subject.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/centered.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/cliche.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/cold.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/good-subject.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/illustrations_1.png +0 -0
- data/styleguide/assets/images/styleguide-examples/illustrations_2.png +0 -0
- data/styleguide/assets/images/styleguide-examples/illustrations_3.png +0 -0
- data/styleguide/assets/images/styleguide-examples/illustrations_4.png +0 -0
- data/styleguide/assets/images/styleguide-examples/illustrations_5.png +0 -0
- data/styleguide/assets/images/styleguide-examples/illustrations_6.png +0 -0
- data/styleguide/assets/images/styleguide-examples/innaccurate-housing.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/natural-1.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/natural-2.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/natural-3.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/not-centered.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/realistic.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/unaltered.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/unnatural-1.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/unnatural-2.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/unnatural-3.jpg +0 -0
- data/styleguide/assets/images/styleguide-examples/warm.jpg +0 -0
- data/styleguide/assets/images/tone-framework.png +0 -0
- data/styleguide/assets/images/tone.png +0 -0
- data/styleguide/assets/images/tooltip.png +0 -0
- data/styleguide/assets/images/tsandcs.png +0 -0
- data/styleguide/assets/images/ustyle.svg +73 -0
- data/styleguide/assets/images/ux-conventions-consistency.png +0 -0
- data/styleguide/assets/images/ux-conventions-error.png +0 -0
- data/styleguide/assets/images/ux-conventions-errors.png +0 -0
- data/styleguide/assets/images/ux-conventions-flexibility.png +0 -0
- data/styleguide/assets/images/ux-conventions-freedom.png +0 -0
- data/styleguide/assets/images/ux-conventions-minimalist.png +0 -0
- data/styleguide/assets/images/ux-conventions-real-world.png +0 -0
- data/styleguide/assets/images/ux-conventions-recognition.png +0 -0
- data/styleguide/assets/images/ux-conventions-visibility.png +0 -0
- data/styleguide/assets/javascripts/app.js +115 -0
- data/styleguide/assets/javascripts/modules/stats.js +50 -0
- data/styleguide/assets/javascripts/vendor/highlight.js +1 -0
- data/styleguide/assets/javascripts/vendor/svg4everybody.js +1 -0
- data/styleguide/assets/sass/main.scss +42 -0
- data/styleguide/assets/sass/modules/_code.scss +8 -0
- data/styleguide/assets/sass/modules/_colours.scss +26 -0
- data/styleguide/assets/sass/modules/_copyright.scss +4 -0
- data/styleguide/assets/sass/modules/_grid.scss +12 -0
- data/styleguide/assets/sass/modules/_home.scss +5 -0
- data/styleguide/assets/sass/modules/_images.scss +24 -0
- data/styleguide/assets/sass/modules/_links.scss +3 -0
- data/styleguide/assets/sass/modules/_logo.scss +182 -0
- data/styleguide/assets/sass/modules/_made-at.scss +6 -0
- data/styleguide/assets/sass/modules/_markdown.scss +7 -0
- data/styleguide/assets/sass/modules/_nav-mobile.scss +72 -0
- data/styleguide/assets/sass/modules/_nav.scss +32 -0
- data/styleguide/assets/sass/modules/_sidebar.scss +94 -0
- data/styleguide/assets/sass/modules/_states.scss +4 -0
- data/styleguide/assets/sass/modules/_styleguide.scss +138 -0
- data/styleguide/assets/sass/modules/_table.scss +3 -0
- data/styleguide/assets/sass/modules/_tooltip.scss +9 -0
- data/styleguide/assets/sass/modules/_typography.scss +14 -0
- data/styleguide/assets/sass/modules/_version.scss +11 -0
- data/styleguide/assets/sass/structure/_base.scss +18 -0
- data/styleguide/assets/sass/structure/_header.scss +12 -0
- data/styleguide/assets/sass/vendor/_highlight.scss +139 -0
- data/styleguide/assets/sass/vendor/_pure-table.scss +75 -0
- data/styleguide/content/brand/index.md +47 -0
- data/styleguide/content/brand/logo.tpl +279 -0
- data/styleguide/content/design/accessibility-testing.md +82 -0
- data/styleguide/content/design/index.tpl +367 -0
- data/styleguide/content/design/typography.md +68 -0
- data/styleguide/content/design/validating-designs.tpl +304 -0
- data/styleguide/content/index.tpl +51 -0
- data/styleguide/content/language/grammar.md +220 -0
- data/styleguide/content/language/microcopy.md +170 -0
- data/styleguide/content/language/tone.md +135 -0
- data/styleguide/content/pattern-library/grid.tpl +64 -0
- data/styleguide/content/pattern-library/index.tpl +88 -0
- data/styleguide/partials/_footer.tpl +8 -0
- data/styleguide/partials/_head.tpl +26 -0
- data/styleguide/partials/_header.tpl +37 -0
- data/styleguide/partials/_sidebar.tpl +27 -0
- data/styleguide/partials/colour.tpl +24 -0
- data/styleguide/partials/icons.tpl +28 -0
- data/styleguide/partials/style_block.tpl +44 -0
- data/styleguide/templates/simple.tpl +25 -0
- data/styleguide/templates/stats.tpl +50 -0
- data/styleguide/templates/styleguide.tpl +36 -0
- data/tasks/publish.rake +67 -0
- data/ustyle.gemspec +32 -0
- data/vendor/assets/images/forms/checkbox-rebrand.svg +1 -0
- data/vendor/assets/images/forms/checkbox.svg +1 -0
- data/vendor/assets/images/icons/alarm.svg +1 -0
- data/vendor/assets/images/icons/android.svg +1 -0
- data/vendor/assets/images/icons/arrow-circle.svg +1 -0
- data/vendor/assets/images/icons/arrow-down.svg +1 -0
- data/vendor/assets/images/icons/arrow-up.svg +1 -0
- data/vendor/assets/images/icons/book.svg +1 -0
- data/vendor/assets/images/icons/bookmark.svg +1 -0
- data/vendor/assets/images/icons/breadcrumb.svg +1 -0
- data/vendor/assets/images/icons/calculator.svg +1 -0
- data/vendor/assets/images/icons/calendar.svg +1 -0
- data/vendor/assets/images/icons/car.svg +1 -0
- data/vendor/assets/images/icons/checkbox-tick.svg +1 -0
- data/vendor/assets/images/icons/chevron-left.svg +1 -0
- data/vendor/assets/images/icons/chevron-right.svg +1 -0
- data/vendor/assets/images/icons/clock.svg +1 -0
- data/vendor/assets/images/icons/close.svg +1 -0
- data/vendor/assets/images/icons/cog.svg +1 -0
- data/vendor/assets/images/icons/controller.svg +1 -0
- data/vendor/assets/images/icons/credit-card.svg +1 -0
- data/vendor/assets/images/icons/cross.svg +1 -0
- data/vendor/assets/images/icons/dashcam.svg +1 -0
- data/vendor/assets/images/icons/dual-fuel.svg +1 -0
- data/vendor/assets/images/icons/electric-light.svg +1 -0
- data/vendor/assets/images/icons/envelope.svg +1 -0
- data/vendor/assets/images/icons/exit-noexit.svg +1 -0
- data/vendor/assets/images/icons/facebook-brand.svg +1 -0
- data/vendor/assets/images/icons/facebook.svg +1 -0
- data/vendor/assets/images/icons/filter.svg +1 -0
- data/vendor/assets/images/icons/fixed-variable.svg +1 -0
- data/vendor/assets/images/icons/gas.svg +1 -0
- data/vendor/assets/images/icons/gauge.svg +1 -0
- data/vendor/assets/images/icons/github.svg +1 -0
- data/vendor/assets/images/icons/google-brand.svg +1 -0
- data/vendor/assets/images/icons/google.svg +1 -0
- data/vendor/assets/images/icons/graph-up.svg +1 -0
- data/vendor/assets/images/icons/home.svg +1 -0
- data/vendor/assets/images/icons/hot.svg +1 -0
- data/vendor/assets/images/icons/info.svg +1 -0
- data/vendor/assets/images/icons/kettle.svg +1 -0
- data/vendor/assets/images/icons/key.svg +1 -0
- data/vendor/assets/images/icons/lock.svg +1 -0
- data/vendor/assets/images/icons/magnify-in.svg +1 -0
- data/vendor/assets/images/icons/magnify.svg +1 -0
- data/vendor/assets/images/icons/menu.svg +1 -0
- data/vendor/assets/images/icons/message.svg +1 -0
- data/vendor/assets/images/icons/mobile.svg +1 -0
- data/vendor/assets/images/icons/monthly-dd.svg +1 -0
- data/vendor/assets/images/icons/network.svg +1 -0
- data/vendor/assets/images/icons/no-exit.svg +1 -0
- data/vendor/assets/images/icons/pdf.svg +1 -0
- data/vendor/assets/images/icons/pencil.svg +1 -0
- data/vendor/assets/images/icons/person-add.svg +1 -0
- data/vendor/assets/images/icons/person.svg +1 -0
- data/vendor/assets/images/icons/phone.svg +1 -0
- data/vendor/assets/images/icons/piggy-bank.svg +1 -0
- data/vendor/assets/images/icons/pin.svg +1 -0
- data/vendor/assets/images/icons/play.svg +1 -0
- data/vendor/assets/images/icons/pound-circle.svg +1 -0
- data/vendor/assets/images/icons/pound-note.svg +1 -0
- data/vendor/assets/images/icons/present.svg +1 -0
- data/vendor/assets/images/icons/print.svg +1 -0
- data/vendor/assets/images/icons/quarterly-dd.svg +1 -0
- data/vendor/assets/images/icons/question-circle.svg +1 -0
- data/vendor/assets/images/icons/quote.svg +1 -0
- data/vendor/assets/images/icons/recycle.svg +1 -0
- data/vendor/assets/images/icons/remove.svg +1 -0
- data/vendor/assets/images/icons/renewable.svg +1 -0
- data/vendor/assets/images/icons/results.svg +1 -0
- data/vendor/assets/images/icons/save.svg +1 -0
- data/vendor/assets/images/icons/share.svg +1 -0
- data/vendor/assets/images/icons/shield.svg +1 -0
- data/vendor/assets/images/icons/sim.svg +1 -0
- data/vendor/assets/images/icons/smiley.svg +1 -0
- data/vendor/assets/images/icons/sort.svg +1 -0
- data/vendor/assets/images/icons/speech-circle.svg +1 -0
- data/vendor/assets/images/icons/speech.svg +1 -0
- data/vendor/assets/images/icons/spinner-rebrand.svg +1 -0
- data/vendor/assets/images/icons/spinner.svg +1 -0
- data/vendor/assets/images/icons/star-half.svg +1 -0
- data/vendor/assets/images/icons/star.svg +1 -0
- data/vendor/assets/images/icons/starline-half.svg +1 -0
- data/vendor/assets/images/icons/starline.svg +1 -0
- data/vendor/assets/images/icons/talk.svg +1 -0
- data/vendor/assets/images/icons/tick-circle.svg +1 -0
- data/vendor/assets/images/icons/tick.svg +1 -0
- data/vendor/assets/images/icons/tv.svg +1 -0
- data/vendor/assets/images/icons/twitter-brand.svg +1 -0
- data/vendor/assets/images/icons/twitter.svg +1 -0
- data/vendor/assets/images/icons/ustyle.svg +1 -0
- data/vendor/assets/images/icons/uswitch.svg +1 -0
- data/vendor/assets/images/icons/variable.svg +1 -0
- data/vendor/assets/images/icons/warning-circle.svg +1 -0
- data/vendor/assets/images/icons/warning.svg +1 -0
- data/vendor/assets/images/icons/wifi.svg +1 -0
- data/vendor/assets/images/icons/wiki.svg +1 -0
- data/vendor/assets/images/icons/xml.svg +1 -0
- data/vendor/assets/images/icons.svg +1 -0
- data/vendor/assets/javascripts/ustyle/backdrop.js +56 -0
- data/vendor/assets/javascripts/ustyle/classtoggler.js +76 -0
- data/vendor/assets/javascripts/ustyle/overlay.js +152 -0
- data/vendor/assets/javascripts/ustyle/tabs.js +166 -0
- data/vendor/assets/javascripts/ustyle/utils.js +113 -0
- data/vendor/assets/javascripts/ustyle.js +4 -0
- data/vendor/assets/stylesheets/rebrand-content.scss +1 -0
- data/vendor/assets/stylesheets/rebrand.scss +1 -0
- data/vendor/assets/stylesheets/ustyle/_all.scss +55 -0
- data/vendor/assets/stylesheets/ustyle/_content.scss +5 -0
- data/vendor/assets/stylesheets/ustyle/_global.scss +20 -0
- data/vendor/assets/stylesheets/ustyle/articles/_base.scss +100 -0
- data/vendor/assets/stylesheets/ustyle/articles/_guide.scss +57 -0
- data/vendor/assets/stylesheets/ustyle/articles/_more.scss +31 -0
- data/vendor/assets/stylesheets/ustyle/articles/_news.scss +213 -0
- data/vendor/assets/stylesheets/ustyle/articles/_related.scss +76 -0
- data/vendor/assets/stylesheets/ustyle/basics/_extends.scss +73 -0
- data/vendor/assets/stylesheets/ustyle/basics/_fonts.scss +27 -0
- data/vendor/assets/stylesheets/ustyle/basics/_functions.scss +78 -0
- data/vendor/assets/stylesheets/ustyle/basics/_grid.scss +86 -0
- data/vendor/assets/stylesheets/ustyle/basics/_typography.scss +123 -0
- data/vendor/assets/stylesheets/ustyle/basics/_variables.scss +166 -0
- data/vendor/assets/stylesheets/ustyle/basics/variables/_colors.scss +94 -0
- data/vendor/assets/stylesheets/ustyle/basics/variables/_forms.scss +98 -0
- data/vendor/assets/stylesheets/ustyle/basics/variables/_icons.scss +43 -0
- data/vendor/assets/stylesheets/ustyle/components/_backdrop.scss +23 -0
- data/vendor/assets/stylesheets/ustyle/components/_breadcrumbs.scss +66 -0
- data/vendor/assets/stylesheets/ustyle/components/_button.scss +187 -0
- data/vendor/assets/stylesheets/ustyle/components/_calculator.scss +41 -0
- data/vendor/assets/stylesheets/ustyle/components/_comp-table-row.scss +341 -0
- data/vendor/assets/stylesheets/ustyle/components/_compliance-banner.scss +38 -0
- data/vendor/assets/stylesheets/ustyle/components/_content-group.scss +33 -0
- data/vendor/assets/stylesheets/ustyle/components/_cta.scss +66 -0
- data/vendor/assets/stylesheets/ustyle/components/_grid-classes.scss +52 -0
- data/vendor/assets/stylesheets/ustyle/components/_hero.scss +115 -0
- data/vendor/assets/stylesheets/ustyle/components/_links.scss +26 -0
- data/vendor/assets/stylesheets/ustyle/components/_lists-li.scss +92 -0
- data/vendor/assets/stylesheets/ustyle/components/_lists.scss +39 -0
- data/vendor/assets/stylesheets/ustyle/components/_loader.scss +139 -0
- data/vendor/assets/stylesheets/ustyle/components/_overlay.scss +183 -0
- data/vendor/assets/stylesheets/ustyle/components/_progress.scss +138 -0
- data/vendor/assets/stylesheets/ustyle/components/_promo-banner.scss +131 -0
- data/vendor/assets/stylesheets/ustyle/components/_reminder.scss +87 -0
- data/vendor/assets/stylesheets/ustyle/components/_tab-navigation.scss +114 -0
- data/vendor/assets/stylesheets/ustyle/components/_table-toolbar.scss +91 -0
- data/vendor/assets/stylesheets/ustyle/components/_tabs.scss +300 -0
- data/vendor/assets/stylesheets/ustyle/components/_tooltip.scss +243 -0
- data/vendor/assets/stylesheets/ustyle/components/_usp.scss +88 -0
- data/vendor/assets/stylesheets/ustyle/content/_base.scss +227 -0
- data/vendor/assets/stylesheets/ustyle/content/_c-header.scss +27 -0
- data/vendor/assets/stylesheets/ustyle/content/_c-social.scss +9 -0
- data/vendor/assets/stylesheets/ustyle/content/_c-tabs.scss +30 -0
- data/vendor/assets/stylesheets/ustyle/forms/_base.scss +9 -0
- data/vendor/assets/stylesheets/ustyle/forms/_fields.scss +78 -0
- data/vendor/assets/stylesheets/ustyle/forms/_input-group.scss +154 -0
- data/vendor/assets/stylesheets/ustyle/forms/_input.scss +61 -0
- data/vendor/assets/stylesheets/ustyle/forms/_radio-checkbox.scss +144 -0
- data/vendor/assets/stylesheets/ustyle/forms/_reset.scss +21 -0
- data/vendor/assets/stylesheets/ustyle/forms/_select.scss +154 -0
- data/vendor/assets/stylesheets/ustyle/forms/_textarea.scss +33 -0
- data/vendor/assets/stylesheets/ustyle/forms/_toggle.scss +114 -0
- data/vendor/assets/stylesheets/ustyle/forms/_validation.scss +104 -0
- data/vendor/assets/stylesheets/ustyle/icons/_base.scss +241 -0
- data/vendor/assets/stylesheets/ustyle/mixins/_arrow.scss +51 -0
- data/vendor/assets/stylesheets/ustyle/mixins/_base.scss +7 -0
- data/vendor/assets/stylesheets/ustyle/mixins/_baseline.scss +43 -0
- data/vendor/assets/stylesheets/ustyle/mixins/_forms.scss +84 -0
- data/vendor/assets/stylesheets/ustyle/mixins/_general.scss +24 -0
- data/vendor/assets/stylesheets/ustyle/mixins/_link-colors.scss +44 -0
- data/vendor/assets/stylesheets/ustyle/mixins/_media-query.scss +121 -0
- data/vendor/assets/stylesheets/ustyle/mixins/_typography.scss +98 -0
- data/vendor/assets/stylesheets/ustyle/tables/_base.scss +4 -0
- data/vendor/assets/stylesheets/ustyle/tables/_tables-basic.scss +72 -0
- data/vendor/assets/stylesheets/ustyle/tables/_tables-sortable.scss +72 -0
- data/vendor/assets/stylesheets/ustyle/tables/_tables-with-key-cells.scss +18 -0
- data/vendor/assets/stylesheets/ustyle/tables/_variables.scss +15 -0
- data/vendor/assets/stylesheets/ustyle/utilities/_general.scss +116 -0
- data/vendor/assets/stylesheets/ustyle/utilities/_grid.scss +13 -0
- data/vendor/assets/stylesheets/ustyle/utilities/_images.scss +34 -0
- data/vendor/assets/stylesheets/ustyle/utilities/_responsive.scss +101 -0
- data/vendor/assets/stylesheets/ustyle/utilities/_spacing.scss +73 -0
- data/vendor/assets/stylesheets/ustyle/vendor/normalize.scss +427 -0
- data/vendor/assets/stylesheets/ustyle-content.scss +2 -0
- data/vendor/assets/stylesheets/ustyle.scss +1 -0
- metadata +517 -0
data/dist/ustyle.min.js
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
var slice=[].slice,hasProp={}.hasOwnProperty;null==this.Utils&&(this.Utils={modules:[]});var addClass=function(a,b){return removeClass(a,b),a.className+=" "+b+" "},removeClass=function(a,b){var c=new RegExp("(\\s|^)"+b+"(\\s|$)","gi");return a.className=a.className.replace(c,"")},hasClass=function(a,b){return new RegExp("(^| )"+b+"( |$)","gi").test(a.className)},merge=function(){var a,b,c,d,e=arguments[0],f=2<=arguments.length?slice.call(arguments,1):[];for(b=0,c=f.length;b<c;b++){a=f[b];for(d in a)hasProp.call(a,d)&&(e[d]=a[d])}return e},setOptions=function(a,b){return merge({},b,a)},deleteUndefined=function(a){var b,c,d=[];for(b in a)c=a[b],null===c||void 0===c?d.push(delete a[b]):d.push(void 0);return d},transformKey=function(){var a,b,c,d=document.createElement("div"),e=["transform","webkitTransform","OTransform","MozTransform","msTransform"];for(a=0,c=e.length;a<c;a++)if(b=e[a],void 0!==d.style[b])return b}(),requestAnimationFrame=function(a){var b,c,d,e=["ms","moz","webkit","o"];for(b=0,c=e.length;b<c&&(d=e[b],!a.requestAnimationFrame);b++)a.requestAnimationFrame=a[d+"RequestAnimationFrame"];return a.requestAnimationFrame||(a.requestAnimationFrame=function(a){return setTimeout(a,1e3/60)})}(window),forEach=function(a,b,c){for(var d=a.length-1;d>=0;d--)b.call(c,d,a[d])};this.Utils={addClass:addClass,removeClass:removeClass,hasClass:hasClass,merge:merge,setOptions:setOptions,deleteUndefined:deleteUndefined,transformKey:transformKey,requestAnimationFrame:requestAnimationFrame,forEach:forEach},window.Backdrop=function(){function a(){null==(d=document.querySelector(".us-backdrop"))&&(d=b())}var b,c=0,d=null;return a.prototype.element=d,b=function(){return d=document.createElement("div"),Utils.addClass(d,"us-backdrop"),document.body.appendChild(d)},a.prototype.retain=function(){var a;if(1===++c)return Utils.addClass(d,"us-backdrop--visible"),a=function(){if(c>=1)return Utils.addClass(d,"us-backdrop--active")},Utils.requestAnimationFrame.call(window,a)},a.prototype.release=function(){var a;return 1===c&&(Utils.removeClass(d,"us-backdrop--active"),a=function(){return setTimeout(function(){if(0===c)return Utils.removeClass(d,"us-backdrop--visible")},300)},Utils.requestAnimationFrame.call(window,a)),c=Math.max(0,c-1)},a}(),window.Overlay=function(a){function b(a){if(this.overlay=(this.options=f(a,h)).overlay,this.overlay instanceof jQuery&&(this.overlay=document.querySelector(this.overlay.selector)),this.options.openButton instanceof jQuery&&(this.options.openButton=document.querySelector(this.options.openButton.selector)),null==this.overlay||"undefined"==typeof Backdrop||null===Backdrop)throw new Error("There's no overlay or you haven't included Backdrop");this.backdrop=new Backdrop,this.addEventListeners()}var c=a.addClass,d=a.hasClass,e=a.removeClass,f=a.setOptions,g=a.requestAnimationFrame,h={bodyActiveClass:"us-overlay--open",activeClass:"us-overlay-parent--active",visibleClass:"us-overlay-parent--visible",overlay:document.querySelector(".us-overlay-parent"),openButton:".js-open-overlay",closeButton:".js-close-overlay",historyStatus:"#seedeal",history:!1,preventDefault:!0,animationSpeed:300};return b.prototype.addEventListeners=function(){var a=new CustomEvent("click.open-overlay"),b=new CustomEvent("click.close-overlay"),c="string"==typeof this.options.openButton?document.querySelector(this.options.openButton):this.options.openButton,d=function(b){return function(d){return b.options.preventDefault&&d.preventDefault(),c.dispatchEvent(a),b.show(d)}}(this);c&&c.addEventListener("click",d);var e=function(a){return function(c){for(var d=[],e=a.overlay.querySelectorAll(a.options.closeButton),f=[a.overlay].concat(Array.prototype.slice.call(e)),g=f.length-1;g>=0;g--){var h=f[g];if(c.target===h){a.options.preventDefault&&c.preventDefault(),a.hide(c);break}d.push(void 0)}return a.overlay.dispatchEvent(b),d}}(this);if(this.overlay.addEventListener("click",e),this.hasHistory())return window.onpopstate=function(a){return function(b){if(a.isOpen())return a.hide(b)}}(this)},b.prototype.show=function(a){var b,d=this;if(c(document.body,this.options.bodyActiveClass),this.backdrop.retain(),c(this.overlay,this.options.visibleClass),b=function(){return c(d.overlay,d.options.activeClass),setTimeout(function(){var b;return"function"==typeof(b=d.options).onOpen?b.onOpen(a):void 0},d.options.animationSpeed)},g.call(window,b),this.hasHistory())return history.pushState("open",window.document.title,this.options.historyStatus)},b.prototype.hide=function(a){var b,c=this;if(e(document.body,this.options.bodyActiveClass),this.backdrop.release(),b=function(){return e(c.overlay,c.options.activeClass),setTimeout(function(){var b;return e(c.overlay,c.options.visibleClass),"function"==typeof(b=c.options).onClose?b.onClose(a):void 0},c.options.animationSpeed)},g.call(window,b),this.hasHistory()&&"open"===history.state)return history.back()},b.prototype.isOpen=function(){return d(this.overlay,this.options.activeClass)},b.prototype.hasHistory=function(){return this.options.history&&window.history&&window.history.pushState},b}(this.Utils),window.Tabs=function(a){function b(a){var b=this.options=f(a,this.defaults),c=b.tabContainer,d=b.tabLinks;if(this.activeTabEvent=new CustomEvent("ustyle.tab.active"),this.tabs=document.querySelectorAll(c+" "+d),this.tabs.length){this.filter=this.tabs.item(0).getAttribute("data-target")?"data-target":"href",this.init();var e=function(a){return function(b){var c=b.currentTarget;return a.isAccordion()&&a.options.collapsible&&a.isActive(c)?(a.collapse(c),a.hashClear()):(a.navigateTo(c),a.scrollToTab(c),a.hashChange(c)),b.preventDefault()}}(this);g(this.tabs,function(a,b){b.addEventListener("click",e)})}}var c=a.addClass,d=a.hasClass,e=a.removeClass,f=a.setOptions,g=a.forEach;b.prototype.defaults={tabContainer:".us-tabs",tabLinks:".us-tabs-nav-mainlink",tabNav:".us-tabs-nav",changeUrls:!0,activeClass:"active",collapsible:!1,autoScroll:!0},b.prototype.init=function(){var a=this.activeTab(),b=this.tabFromHash();return b?this.navigateTo(b):a?this.navigateTo(a):this.options.collapsible&&this.isAccordion()?void 0:this.navigateTo(this.tabs.item(0))},b.prototype.hashChange=function(a){if(this.options.changeUrls)return window.location.replace("#!"+h(a).replace(/#/,""))},b.prototype.hashClear=function(){if(this.options.changeUrls){var a=window.location.pathname+window.location.search;return"function"==typeof history.replaceState?history.replaceState("",document.title,a):void 0}},b.prototype.navigateTo=function(a){var b=h(a),d=document.querySelector(b),f=this.options.activeClass,i=this.filter;return g(this.tabs,function(a,b){e(b,f)}),g(this.tabs,function(a,d){if(d.getAttribute(i)===b)return c(d,f)}),g(d.parentNode.children,function(a,b){b!==d&&e(b,f)}),c(d,f),d.dispatchEvent(this.activeTabEvent)},b.prototype.collapse=function(a){var b=document.querySelector(h(a)),c=this.options.activeClass;return g(this.tabs,function(a,b){e(b,c)}),e(b,c)},b.prototype.scrollToTab=function(a){if(this.isAccordion()&&this.options.autoScroll){return document.querySelector(h(a)).scrollIntoView()}},b.prototype.activeTab=function(){var a=this.options.activeClass,b=null;return g(this.tabs,function(c,e){if(d(e,a))return b=e}),b},b.prototype.tabFromHash=function(){var a=window.location.hash.replace("!",""),b=this.filter,c=null;return g(this.tabs,function(d,e){if(e.getAttribute(b)===a)return c=e}),c},b.prototype.isActive=function(a){return h(a)===h(this.activeTab())},b.prototype.isAccordion=function(){var a=document.querySelector(this.options.tabNav);return!(a.offsetWidth>0||a.offsetHeight>0)};var h=function(a){if(a)return a.getAttribute("data-target")||a.getAttribute("href")};return b}(this.Utils),window.ClassToggler=function(a){function b(b){this.options=a.setOptions(b,f),!this.options.target&&this.options.$target&&this.options.$target instanceof jQuery&&(this.options.target=document.querySelectorAll(this.options.$target.selector)),this.options.target?this.addEventListeners():console.trace("ClassToggle",this.options)}var c=(a.addClass,a.hasClass),d=a.removeClass,e=a.forEach,f={containerClass:null,target:null,activeClass:"active",inactiveClass:null,toggleOn:"click"},g=function(a,b){for(;(a=a.parentElement)&&!c(a,b););return a};return b.prototype.addEventListeners=function(){var a=this.options.toggleOn,b=function(a){return function(b){var c=a.options.containerClass?g(b.target,a.options.containerClass):b.delegateTarget;return a.isActive(c)?a.hide(c,b):a.show(c,b)}}(this);e(this.options.target,function(c,d){d.addEventListener(a,b)})},b.prototype.isActive=function(a){return c(a,this.options.activeClass)},b.prototype.show=function(a,b){var c;return"function"==typeof(c=this.options).onShow&&c.onShow(a,b),a.addClass(this.options.activeClass)},b.prototype.hide=function(a,b){var c;return"function"==typeof(c=this.options).onHide&&c.onHide(a,b),d(a,this.options.activeClass)},b}(this.Utils);
|
@@ -0,0 +1,115 @@
|
|
1
|
+
const dss = require('dss')
|
2
|
+
const crypto = require('crypto')
|
3
|
+
const marked = require('marked')
|
4
|
+
const escaped = require('underscore.string/escapeHTML')
|
5
|
+
|
6
|
+
module.exports = {
|
7
|
+
/**
|
8
|
+
* Register DSS parsers
|
9
|
+
*
|
10
|
+
* @param {object} parsers - An object containing the declared parsers to register
|
11
|
+
*/
|
12
|
+
addParsers: function (parsers) {
|
13
|
+
for (var key in parsers) {
|
14
|
+
dss.parser(key, parsers[key])
|
15
|
+
}
|
16
|
+
},
|
17
|
+
|
18
|
+
/**
|
19
|
+
* Removing ${modifiers} text from markup
|
20
|
+
*
|
21
|
+
* @param {string} escaped markup - The file to extract the variable values from
|
22
|
+
* @return {string} Escaped string without ${modifiers}
|
23
|
+
*/
|
24
|
+
addStateToExample: function (markup, state) {
|
25
|
+
return markup.replace(/{\$modifiers}/g, state)
|
26
|
+
},
|
27
|
+
|
28
|
+
/**
|
29
|
+
* Removing ${modifiers} text from markup
|
30
|
+
*
|
31
|
+
* @param {string} escaped markup - The file to extract the variable values from
|
32
|
+
* @return {string} Escaped string without ${modifiers}
|
33
|
+
*/
|
34
|
+
removeModifiersFromMarkup: function (escaped) {
|
35
|
+
return escaped.replace(/(\sclass=('|"){\$modifiers}('|")|\s{\$modifiers})/g, '')
|
36
|
+
},
|
37
|
+
|
38
|
+
/**
|
39
|
+
* Get parser for a file which will extract "@variable {name} - {description}"
|
40
|
+
*
|
41
|
+
* @param {object} file - The file to extract the variable values from
|
42
|
+
* @return {function} A DSS parser
|
43
|
+
*/
|
44
|
+
variableDssParser: function () {
|
45
|
+
const fileVariablesRx = /^[$|@]([a-zA-Z0-9_-]+):([^;]+);/gim
|
46
|
+
const lineSplitRx = /(( - )+)/
|
47
|
+
var fileVariables = {}
|
48
|
+
var variables = {}
|
49
|
+
var match
|
50
|
+
var hash
|
51
|
+
var tokens
|
52
|
+
var name
|
53
|
+
|
54
|
+
return function (i, line, block, css) {
|
55
|
+
hash = crypto.createHash('md5').update(css).digest('hex')
|
56
|
+
if (!fileVariables[hash]) {
|
57
|
+
while ((match = fileVariablesRx.exec(css)) !== null) {
|
58
|
+
variables[match[1].trim()] = match[2].trim()
|
59
|
+
}
|
60
|
+
fileVariables[hash] = variables
|
61
|
+
}
|
62
|
+
|
63
|
+
// Extract name and any delimiter with description
|
64
|
+
tokens = line.split(lineSplitRx, 2)
|
65
|
+
name = tokens[0].trim()
|
66
|
+
if (variables.hasOwnProperty(name)) {
|
67
|
+
return {
|
68
|
+
name: name,
|
69
|
+
// Description is line with name and any delimiter replaced
|
70
|
+
description: line.replace(tokens.join(''), ''),
|
71
|
+
value: variables[name]
|
72
|
+
}
|
73
|
+
}
|
74
|
+
}
|
75
|
+
},
|
76
|
+
|
77
|
+
/**
|
78
|
+
* Read over multiple description lines and return a markdown version
|
79
|
+
*
|
80
|
+
* @param {number} i - line number
|
81
|
+
* @param {string} line - Line matching parser
|
82
|
+
* @param {string} block - Entire block of text matching
|
83
|
+
* @return {string} A markdown version of the description
|
84
|
+
*/
|
85
|
+
descriptionDssParser: function (i, line, block) {
|
86
|
+
var nextParserIndex = block.indexOf('@', i + 1)
|
87
|
+
var markupLength = nextParserIndex > -1 ? nextParserIndex - i : block.length
|
88
|
+
var markup = block.split('')
|
89
|
+
.splice(i, markupLength)
|
90
|
+
.join('')
|
91
|
+
.replace(/\n/g, '\n\n')
|
92
|
+
.replace(/@description/, '')
|
93
|
+
|
94
|
+
return marked(markup)
|
95
|
+
},
|
96
|
+
|
97
|
+
/**
|
98
|
+
* Read over multiple lines and return a javascript code snippet
|
99
|
+
*
|
100
|
+
* @param {number} i - line number
|
101
|
+
* @param {string} line - Line matching parser
|
102
|
+
* @param {string} block - Entire block of text matching
|
103
|
+
* @return {string} JavaScript code snipper
|
104
|
+
*/
|
105
|
+
javascriptParser: function (i, line, block) {
|
106
|
+
var nextParserIndex = block.indexOf('@', i + 1)
|
107
|
+
var markupLength = nextParserIndex > -1 ? nextParserIndex - i : block.length
|
108
|
+
var markup = block.split('')
|
109
|
+
.splice(i, markupLength)
|
110
|
+
.join('')
|
111
|
+
.replace(/@javascript/, '')
|
112
|
+
|
113
|
+
return escaped(markup)
|
114
|
+
}
|
115
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
const grunt = require('grunt')
|
2
|
+
|
3
|
+
module.exports = {
|
4
|
+
writeFile: function (file, dest, message) {
|
5
|
+
var outputType = 'created'
|
6
|
+
var oldFile = null
|
7
|
+
|
8
|
+
if (grunt.file.exists(dest)) {
|
9
|
+
outputType = 'overwritten'
|
10
|
+
oldFile = grunt.file.read(dest)
|
11
|
+
}
|
12
|
+
|
13
|
+
if (oldFile !== file) {
|
14
|
+
grunt.file.write(dest, file)
|
15
|
+
grunt.log.writeln('✓ ' + message + ' ' + outputType + ' at: ' + grunt.log.wordlist([dest], {color: 'cyan'}))
|
16
|
+
} else {
|
17
|
+
grunt.log.writeln('‣ ' + message + ' unchanged')
|
18
|
+
}
|
19
|
+
},
|
20
|
+
|
21
|
+
isMarkdown: function (extension) {
|
22
|
+
return extension === '.md'
|
23
|
+
}
|
24
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
const cheerio = require('cheerio')
|
2
|
+
|
3
|
+
module.exports = {
|
4
|
+
extractSubNav: function (content) {
|
5
|
+
var $ = cheerio.load(content)
|
6
|
+
var contents = []
|
7
|
+
|
8
|
+
function buildHashOfContents (i, el) {
|
9
|
+
contents.push({name: $(el).text(), link: $(el).attr('href')})
|
10
|
+
}
|
11
|
+
|
12
|
+
$('ul.table-of-contents a').map(buildHashOfContents)
|
13
|
+
return contents
|
14
|
+
},
|
15
|
+
|
16
|
+
removeSubNav: function (content) {
|
17
|
+
var $ = cheerio.load(content)
|
18
|
+
|
19
|
+
$('ul.table-of-contents').remove()
|
20
|
+
return $.html()
|
21
|
+
}
|
22
|
+
}
|
@@ -0,0 +1,57 @@
|
|
1
|
+
const handlebars = require('handlebars')
|
2
|
+
const humanize = require('underscore.string/humanize')
|
3
|
+
|
4
|
+
function humanFileSize (size) {
|
5
|
+
if (size < 1024) return size
|
6
|
+
var i = Math.floor(Math.log(size) / Math.log(1024))
|
7
|
+
return new handlebars.SafeString((size / Math.pow(1024, i)).toFixed(2) * 1 + '<span> ' + ['B', 'kB', 'MB', 'GB', 'TB'][i] + '</span>')
|
8
|
+
};
|
9
|
+
|
10
|
+
module.exports = {
|
11
|
+
registerHelpers: function () {
|
12
|
+
handlebars.registerHelper('humanize', function (name, options) {
|
13
|
+
return new handlebars.SafeString(humanize(name))
|
14
|
+
})
|
15
|
+
|
16
|
+
handlebars.registerHelper('json', function (context) {
|
17
|
+
return JSON.stringify(context)
|
18
|
+
})
|
19
|
+
|
20
|
+
handlebars.registerHelper('partial', function (name, options) {
|
21
|
+
// Get the partial with the given name. This is a string.
|
22
|
+
var partial = handlebars.partials[name]
|
23
|
+
|
24
|
+
// Return empty string if the partial is not defined
|
25
|
+
if (!partial) return ''
|
26
|
+
// Compile and call the partial with this as context
|
27
|
+
return new handlebars.SafeString(handlebars.compile(partial)(this))
|
28
|
+
})
|
29
|
+
|
30
|
+
handlebars.registerHelper('activeClass', function (name, attribute, context) {
|
31
|
+
var active = ''
|
32
|
+
if (name === context.data.root.page[attribute]) {
|
33
|
+
active = 'active'
|
34
|
+
}
|
35
|
+
return new handlebars.SafeString(active)
|
36
|
+
})
|
37
|
+
|
38
|
+
handlebars.registerHelper('isActive', function (name, attribute, context) {
|
39
|
+
if (name === attribute) {
|
40
|
+
return context.fn(this)
|
41
|
+
}
|
42
|
+
return context.inverse(this)
|
43
|
+
})
|
44
|
+
|
45
|
+
handlebars.registerHelper('humanFileSize', function (size, context) {
|
46
|
+
return new handlebars.SafeString(humanFileSize(size))
|
47
|
+
})
|
48
|
+
|
49
|
+
handlebars.registerHelper('number', function (number, context) {
|
50
|
+
return new handlebars.SafeString(number.toPrecision(2))
|
51
|
+
})
|
52
|
+
|
53
|
+
handlebars.registerHelper('classSanitizer', function (klass) {
|
54
|
+
return new handlebars.SafeString(klass.split('.')[1])
|
55
|
+
})
|
56
|
+
}
|
57
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
'use strict'
|
2
|
+
|
3
|
+
module.exports = function (grunt) {
|
4
|
+
var browserSync = require('browser-sync')
|
5
|
+
|
6
|
+
grunt.registerTask('browserSync-init', function () {
|
7
|
+
var done = this.async()
|
8
|
+
browserSync({
|
9
|
+
server: './docs',
|
10
|
+
notify: false
|
11
|
+
}, function (err, bs) {
|
12
|
+
if (err) {
|
13
|
+
console.log(err)
|
14
|
+
}
|
15
|
+
|
16
|
+
done()
|
17
|
+
})
|
18
|
+
})
|
19
|
+
|
20
|
+
grunt.registerTask('browserSync-inject', function () {
|
21
|
+
browserSync.reload(['docs/css/main.css'])
|
22
|
+
})
|
23
|
+
}
|
@@ -0,0 +1,67 @@
|
|
1
|
+
const handlebars = require('handlebars')
|
2
|
+
const async = require('async')
|
3
|
+
const path = require('path')
|
4
|
+
const template = require('../modules/templates')
|
5
|
+
const fileHelper = require('../modules/file')
|
6
|
+
const slugify = require('underscore.string/slugify')
|
7
|
+
|
8
|
+
module.exports = function (grunt) {
|
9
|
+
grunt.registerMultiTask('builder', function () {
|
10
|
+
var promise = this.async()
|
11
|
+
var files = this.files
|
12
|
+
|
13
|
+
var options = this.options({
|
14
|
+
templates: './styleguide/**/*.tpl'
|
15
|
+
})
|
16
|
+
|
17
|
+
async.waterfall([
|
18
|
+
init,
|
19
|
+
generateStyleguide
|
20
|
+
], completeTask)
|
21
|
+
|
22
|
+
function completeTask () {
|
23
|
+
promise()
|
24
|
+
}
|
25
|
+
|
26
|
+
function init (callback) {
|
27
|
+
template.registerHelpers()
|
28
|
+
generateTemplates(options.templates)
|
29
|
+
callback(null)
|
30
|
+
}
|
31
|
+
|
32
|
+
function generateStyleguide (callback) {
|
33
|
+
files.forEach(function (file) {
|
34
|
+
const dest = file.dest
|
35
|
+
const datum = grunt.file.readJSON(file.src[0])
|
36
|
+
generatePages(datum, datum.pages, dest)
|
37
|
+
})
|
38
|
+
callback(null, 'done')
|
39
|
+
}
|
40
|
+
|
41
|
+
function generatePages (data, pages, dest) {
|
42
|
+
pages.map(function (page) {
|
43
|
+
const model = {
|
44
|
+
project: data.project,
|
45
|
+
navigation: data.navigation,
|
46
|
+
page: page,
|
47
|
+
pages: data.pages
|
48
|
+
}
|
49
|
+
const outputFilePath = dest + slugify(page.section) + '/' + page.page
|
50
|
+
const template = handlebars.compile(grunt.file.read(page.template))(model)
|
51
|
+
|
52
|
+
fileHelper.writeFile(template, outputFilePath, 'Build')
|
53
|
+
})
|
54
|
+
}
|
55
|
+
|
56
|
+
function generateTemplates (templatePath) {
|
57
|
+
var templates = {}
|
58
|
+
|
59
|
+
grunt.file.expand(templatePath).forEach(function (file) {
|
60
|
+
var templateName = path.basename(file, '.tpl')
|
61
|
+
templates[templateName] = grunt.file.read(file)
|
62
|
+
})
|
63
|
+
|
64
|
+
handlebars.registerPartial(templates)
|
65
|
+
}
|
66
|
+
})
|
67
|
+
}
|
@@ -0,0 +1,299 @@
|
|
1
|
+
const dss = require('dss')
|
2
|
+
const _ = require('lodash')
|
3
|
+
const async = require('async')
|
4
|
+
const path = require('path')
|
5
|
+
const fs = require('fs')
|
6
|
+
const dssHelper = require('../modules/dss-helper')
|
7
|
+
const fileHelper = require('../modules/file')
|
8
|
+
const parser = require('../modules/html-parser')
|
9
|
+
const humanize = require('underscore.string/humanize')
|
10
|
+
const underscored = require('underscore.string/underscored')
|
11
|
+
const slugify = require('underscore.string/slugify')
|
12
|
+
const matter = require('gray-matter')
|
13
|
+
const StyleStats = require('stylestats')
|
14
|
+
const marked = require('marked')
|
15
|
+
const semver = require('semver')
|
16
|
+
const exec = require('child_process').exec
|
17
|
+
const simpleGit = require('simple-git')(path.resolve('.'))
|
18
|
+
|
19
|
+
module.exports = function (grunt) {
|
20
|
+
grunt.registerMultiTask('styleguide', 'Parse DSS comment blocks', function () {
|
21
|
+
var promise = this.async()
|
22
|
+
var files = this.files
|
23
|
+
var outputFilePath = this.data.output
|
24
|
+
var styleguidePath = this.data.dir
|
25
|
+
var contentPath = path.join(styleguidePath, 'content')
|
26
|
+
var templatePath = path.join(styleguidePath, 'templates')
|
27
|
+
var cssStatsFile = this.data.statsFor
|
28
|
+
var tagStartVersion = this.data.tagStartVersion
|
29
|
+
var tagPlaceholder = this.data.tagPlaceholder
|
30
|
+
|
31
|
+
var options = this.options({
|
32
|
+
template: 'styleguide.tpl',
|
33
|
+
contentTemplate: 'simple.tpl',
|
34
|
+
parsers: {
|
35
|
+
variable: dssHelper.variableDssParser(),
|
36
|
+
partial: function (i, line, block) { return line },
|
37
|
+
page: function (i, line, block) { return line },
|
38
|
+
description: dssHelper.descriptionDssParser,
|
39
|
+
javascript: dssHelper.javascriptParser
|
40
|
+
}
|
41
|
+
})
|
42
|
+
|
43
|
+
async.waterfall([
|
44
|
+
init,
|
45
|
+
parseDSS,
|
46
|
+
groupDSS,
|
47
|
+
generateStaticContent,
|
48
|
+
generateStyleguide,
|
49
|
+
generateStats,
|
50
|
+
writeFile
|
51
|
+
], completeTask)
|
52
|
+
|
53
|
+
function completeTask () {
|
54
|
+
promise()
|
55
|
+
}
|
56
|
+
|
57
|
+
function init (callback) {
|
58
|
+
dssHelper.addParsers(options.parsers)
|
59
|
+
callback(null)
|
60
|
+
}
|
61
|
+
|
62
|
+
function parseDSS (callback) {
|
63
|
+
var styleguide = []
|
64
|
+
var srcFiles = files[0].src
|
65
|
+
|
66
|
+
srcFiles.forEach(function (file) {
|
67
|
+
dss.parse(grunt.file.read(file), { file: file }, function (parsed) {
|
68
|
+
// Continue only if file contains DSS annotation
|
69
|
+
if (parsed.blocks.length) {
|
70
|
+
// Add comment block to styleguide
|
71
|
+
parsed.blocks.map(function (block) {
|
72
|
+
block['path'] = file
|
73
|
+
block['file'] = path.basename(file)
|
74
|
+
block['link'] = underscored(slugify(block['name']));
|
75
|
+
|
76
|
+
// Normalize @state and @variable to array
|
77
|
+
['state', 'variable'].forEach(function (prop) {
|
78
|
+
if (block.hasOwnProperty(prop) && typeof block[prop].slice !== 'function') {
|
79
|
+
block[prop] = [block[prop]]
|
80
|
+
}
|
81
|
+
})
|
82
|
+
|
83
|
+
if (block.markup) {
|
84
|
+
block.markup.escaped = dssHelper.removeModifiersFromMarkup(block.markup.escaped)
|
85
|
+
}
|
86
|
+
|
87
|
+
if (block.hasOwnProperty('state')) {
|
88
|
+
block.state.map(function (state) {
|
89
|
+
state.markup = {
|
90
|
+
example: dssHelper.addStateToExample(block.markup.example, state.escaped)
|
91
|
+
}
|
92
|
+
})
|
93
|
+
}
|
94
|
+
})
|
95
|
+
styleguide.push(parsed.blocks)
|
96
|
+
}
|
97
|
+
})
|
98
|
+
})
|
99
|
+
callback(null, styleguide)
|
100
|
+
}
|
101
|
+
|
102
|
+
function groupDSS (styleguide, callback) {
|
103
|
+
var sections = _.chain(styleguide).flatten().groupBy('page')
|
104
|
+
.map(function (value, key) {
|
105
|
+
const structure = key.split('/')
|
106
|
+
const section = slugify(structure[0])
|
107
|
+
const page = structure[1]
|
108
|
+
|
109
|
+
return {
|
110
|
+
name: page,
|
111
|
+
page: slugify(page) + '.html',
|
112
|
+
template: _getTemplate(options.template),
|
113
|
+
section: slugify(section),
|
114
|
+
blocks: value
|
115
|
+
}
|
116
|
+
})
|
117
|
+
// As it's iterating over files, we don't want files that aren't documented to come through
|
118
|
+
.filter(function (object) { return object.section !== 'undefined' }).compact().value()
|
119
|
+
|
120
|
+
callback(null, sections)
|
121
|
+
}
|
122
|
+
|
123
|
+
function generateStaticContent (sections, callback) {
|
124
|
+
var pages = grunt.file.expand(contentPath + '/**/*')
|
125
|
+
.filter(function (dir) {
|
126
|
+
var stats = fs.lstatSync(dir)
|
127
|
+
return !stats.isDirectory()
|
128
|
+
})
|
129
|
+
.map(function (file) {
|
130
|
+
const data = matter.read(file)
|
131
|
+
const html = parser.removeSubNav(data.content)
|
132
|
+
const extension = path.extname(file)
|
133
|
+
const subNavData = parser.extractSubNav(data.content)
|
134
|
+
const section = path.dirname(file).replace((new RegExp(contentPath + '/?', 'g')), '')
|
135
|
+
const filename = path.basename(file, extension)
|
136
|
+
|
137
|
+
return {
|
138
|
+
name: data.data.name || humanize(filename),
|
139
|
+
page: filename + '.html',
|
140
|
+
template: _getTemplate(data.data.template || options.contentTemplate),
|
141
|
+
section,
|
142
|
+
content: (fileHelper.isMarkdown(extension) ? marked(html) : html),
|
143
|
+
subNav: subNavData
|
144
|
+
}
|
145
|
+
})
|
146
|
+
|
147
|
+
var data = _sortyByIndex(pages).concat(sections)
|
148
|
+
|
149
|
+
callback(null, _sortyByIndex(data))
|
150
|
+
}
|
151
|
+
|
152
|
+
function generateStyleguide (sections, callback) {
|
153
|
+
var model = {
|
154
|
+
pages: sections,
|
155
|
+
navigation: _getSection(sections),
|
156
|
+
project: grunt.file.readJSON('package.json')
|
157
|
+
}
|
158
|
+
|
159
|
+
callback(null, model)
|
160
|
+
}
|
161
|
+
|
162
|
+
function generateStats (model, callback) {
|
163
|
+
var cssParser
|
164
|
+
var omitEntries
|
165
|
+
var statsPage
|
166
|
+
var cachedStatsFile
|
167
|
+
|
168
|
+
cachedStatsFile = 'tmp/.stats-cache'
|
169
|
+
|
170
|
+
statsPage = {
|
171
|
+
name: 'Stats',
|
172
|
+
page: 'stats.html',
|
173
|
+
section: 'pattern-library',
|
174
|
+
content: {report: []},
|
175
|
+
template: 'styleguide/templates/stats.tpl'
|
176
|
+
}
|
177
|
+
|
178
|
+
// Get the latest tag, if the tag is different from the cached one
|
179
|
+
// fetch new data.
|
180
|
+
exec('git describe --tags `git rev-list --tags --max-count=1`',
|
181
|
+
function (error, stdout, sterr) {
|
182
|
+
if (error) {
|
183
|
+
console.log(error)
|
184
|
+
}
|
185
|
+
|
186
|
+
var latestTag = semver.clean(stdout)
|
187
|
+
var data
|
188
|
+
|
189
|
+
try {
|
190
|
+
data = grunt.file.readJSON(cachedStatsFile)
|
191
|
+
var latestVersion = data[0].version
|
192
|
+
if (data[0] && data[0].version && semver.eq(latestVersion, latestTag)) {
|
193
|
+
statsPage.content.report = data
|
194
|
+
next()
|
195
|
+
} else {
|
196
|
+
fetchNewStatsData()
|
197
|
+
}
|
198
|
+
} catch (err) {
|
199
|
+
// File does't exist or wrong format.
|
200
|
+
fetchNewStatsData()
|
201
|
+
}
|
202
|
+
}
|
203
|
+
)
|
204
|
+
|
205
|
+
function fetchNewStatsData () {
|
206
|
+
async.waterfall([
|
207
|
+
getTags,
|
208
|
+
getStylesListing,
|
209
|
+
getStats
|
210
|
+
], next)
|
211
|
+
}
|
212
|
+
|
213
|
+
function getTags (callback) {
|
214
|
+
simpleGit.tags(function (err, tags) {
|
215
|
+
if (err) {
|
216
|
+
console.log(err)
|
217
|
+
}
|
218
|
+
|
219
|
+
callback(null, tags)
|
220
|
+
})
|
221
|
+
}
|
222
|
+
|
223
|
+
function getStylesListing (tags, callback) {
|
224
|
+
var styleListing = tags.all.map(function (tag) {
|
225
|
+
var cleanTag = semver.clean(tag)
|
226
|
+
if (cleanTag != null && semver.gt(cleanTag, tagStartVersion)) {
|
227
|
+
return {
|
228
|
+
version: cleanTag,
|
229
|
+
path: cssStatsFile.replace(tagPlaceholder, cleanTag)
|
230
|
+
}
|
231
|
+
}
|
232
|
+
})
|
233
|
+
callback(null, _.compact(styleListing))
|
234
|
+
}
|
235
|
+
|
236
|
+
function getStats (styleListing, callback) {
|
237
|
+
omitEntries = [
|
238
|
+
'dataUriSize', 'ratioOfDataUriSize', 'lowestCohesion',
|
239
|
+
'lowestCohesionSelector', 'uniqueFontSize', 'uniqueFontFamily',
|
240
|
+
'propertiesCount', 'published', 'paths', 'mostIdentifierSelector',
|
241
|
+
'totalUniqueFontSizes', 'mostIdentifier', 'totalUniqueFontFamilies',
|
242
|
+
'totalUniqueColors', 'unqualifiedAttributeSelectors', 'floatProperties',
|
243
|
+
'uniqueColor'
|
244
|
+
]
|
245
|
+
|
246
|
+
async.map(styleListing,
|
247
|
+
function (entry, cb) {
|
248
|
+
cssParser = new StyleStats(entry.path, {})
|
249
|
+
cssParser.parse(function (err, styleStatsData) {
|
250
|
+
if (err) {
|
251
|
+
console.log(err)
|
252
|
+
}
|
253
|
+
|
254
|
+
var generalReport = _.omit(styleStatsData, omitEntries)
|
255
|
+
if (Object.keys(generalReport).length) {
|
256
|
+
generalReport.version = entry.version
|
257
|
+
statsPage.content.report.push(generalReport)
|
258
|
+
}
|
259
|
+
cb()
|
260
|
+
})
|
261
|
+
},
|
262
|
+
function () {
|
263
|
+
// Sort array
|
264
|
+
var sortedReport = statsPage.content.report.sort(function (a, b) {
|
265
|
+
return semver.rcompare(a.version, b.version)
|
266
|
+
})
|
267
|
+
statsPage.content.report = sortedReport
|
268
|
+
fileHelper.writeFile(JSON.stringify(sortedReport), cachedStatsFile, 'Cached stats')
|
269
|
+
callback()
|
270
|
+
}
|
271
|
+
)
|
272
|
+
}
|
273
|
+
|
274
|
+
function next () {
|
275
|
+
model.pages.push(statsPage)
|
276
|
+
callback(null, model)
|
277
|
+
}
|
278
|
+
}
|
279
|
+
|
280
|
+
function _getSection (sections) {
|
281
|
+
return _.chain(sections).map(function (data) { return slugify(data.section) }).compact().uniq().value()
|
282
|
+
}
|
283
|
+
|
284
|
+
function _sortyByIndex (sections) {
|
285
|
+
return sections.sort(function (a, b) {
|
286
|
+
return (a.page === 'index.html' ? -1 : 1)
|
287
|
+
})
|
288
|
+
}
|
289
|
+
|
290
|
+
function _getTemplate (name) {
|
291
|
+
return path.join(templatePath, name)
|
292
|
+
}
|
293
|
+
|
294
|
+
function writeFile (model, callback) {
|
295
|
+
fileHelper.writeFile(JSON.stringify(model), outputFilePath, 'Styleguide')
|
296
|
+
callback(null, 'done')
|
297
|
+
}
|
298
|
+
})
|
299
|
+
}
|
data/index.js
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
const types = require('node-sass').types
|
2
|
+
const path = require('path')
|
3
|
+
const fs = require('fs')
|
4
|
+
const packageVersion = require('./package.json')['version']
|
5
|
+
|
6
|
+
const base64encode = string => {
|
7
|
+
const stringBuffer = Buffer.from(string.getValue())
|
8
|
+
return types.String(stringBuffer.toString('base64'))
|
9
|
+
}
|
10
|
+
|
11
|
+
const inlineSVG = source => {
|
12
|
+
const sourcePath = path.join(__dirname, 'vendor', 'assets', 'images', source.getValue())
|
13
|
+
let svg = ''
|
14
|
+
|
15
|
+
try {
|
16
|
+
svg = fs.readFileSync(sourcePath).toString()
|
17
|
+
} catch (err) {
|
18
|
+
console.error('Error inlining SVG file', err)
|
19
|
+
}
|
20
|
+
|
21
|
+
const dataUrl = `url('data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}')`
|
22
|
+
return types.String(dataUrl)
|
23
|
+
}
|
24
|
+
|
25
|
+
const version = function () {
|
26
|
+
return types.String(packageVersion)
|
27
|
+
}
|
28
|
+
|
29
|
+
const SassHelpers = {
|
30
|
+
'base64encode($string)': base64encode,
|
31
|
+
'inline-svg($source)': inlineSVG,
|
32
|
+
'version': version
|
33
|
+
}
|
34
|
+
|
35
|
+
module.exports = {
|
36
|
+
SassHelpers
|
37
|
+
}
|