reustyle 2.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (358) hide show
  1. checksums.yaml +7 -0
  2. data/.drone.yml +17 -0
  3. data/.gitignore +25 -0
  4. data/.nvmrc +1 -0
  5. data/.rbenv-gemsets +1 -0
  6. data/.ruby-version +1 -0
  7. data/CONTRIBUTING.md +68 -0
  8. data/Gemfile +4 -0
  9. data/Gruntfile.js +234 -0
  10. data/LICENSE.txt +13 -0
  11. data/README.md +196 -0
  12. data/Rakefile +6 -0
  13. data/bower.json +54 -0
  14. data/config/autoprefixer.yml +6 -0
  15. data/config/scss-lint.yml +55 -0
  16. data/dist/icons.svg +1 -0
  17. data/dist/ustyle-content.css +1 -0
  18. data/dist/ustyle-latest.css +1 -0
  19. data/dist/ustyle.js +567 -0
  20. data/dist/ustyle.json +1 -0
  21. data/dist/ustyle.min.js +1 -0
  22. data/grunt/modules/dss-helper.js +115 -0
  23. data/grunt/modules/file.js +24 -0
  24. data/grunt/modules/html-parser.js +22 -0
  25. data/grunt/modules/templates.js +57 -0
  26. data/grunt/tasks/browser-sync.js +23 -0
  27. data/grunt/tasks/builder.js +67 -0
  28. data/grunt/tasks/styleguide.js +299 -0
  29. data/index.js +37 -0
  30. data/lib/ustyle/deploy.rb +41 -0
  31. data/lib/ustyle/engine.rb +32 -0
  32. data/lib/ustyle/hash.rb +44 -0
  33. data/lib/ustyle/helpers/icon_helper.rb +15 -0
  34. data/lib/ustyle/icons.rb +13 -0
  35. data/lib/ustyle/middleware/icon_middleware.rb +27 -0
  36. data/lib/ustyle/sass_functions.rb +65 -0
  37. data/lib/ustyle/sinatra.rb +34 -0
  38. data/lib/ustyle/sprockets.rb +6 -0
  39. data/lib/ustyle/utils.rb +42 -0
  40. data/lib/ustyle/version.rb +4 -0
  41. data/lib/ustyle.rb +58 -0
  42. data/package-lock.json +9303 -0
  43. data/package.json +89 -0
  44. data/styleguide/CNAME +1 -0
  45. data/styleguide/assets/images/CTAs.png +0 -0
  46. data/styleguide/assets/images/badge-label-usp.png +0 -0
  47. data/styleguide/assets/images/bower-logo.png +0 -0
  48. data/styleguide/assets/images/caveat.png +0 -0
  49. data/styleguide/assets/images/cloudfront-logo.png +0 -0
  50. data/styleguide/assets/images/design-conventions.png +0 -0
  51. data/styleguide/assets/images/error-texts.png +0 -0
  52. data/styleguide/assets/images/external-requirements.png +0 -0
  53. data/styleguide/assets/images/favicon/android-chrome-192x192.png +0 -0
  54. data/styleguide/assets/images/favicon/android-chrome-512x512.png +0 -0
  55. data/styleguide/assets/images/favicon/apple-touch-icon-114x114.png +0 -0
  56. data/styleguide/assets/images/favicon/apple-touch-icon-120x120.png +0 -0
  57. data/styleguide/assets/images/favicon/apple-touch-icon-144x144.png +0 -0
  58. data/styleguide/assets/images/favicon/apple-touch-icon-152x152.png +0 -0
  59. data/styleguide/assets/images/favicon/apple-touch-icon-180x180.png +0 -0
  60. data/styleguide/assets/images/favicon/apple-touch-icon-57x57.png +0 -0
  61. data/styleguide/assets/images/favicon/apple-touch-icon-60x60.png +0 -0
  62. data/styleguide/assets/images/favicon/apple-touch-icon-72x72.png +0 -0
  63. data/styleguide/assets/images/favicon/apple-touch-icon-76x76.png +0 -0
  64. data/styleguide/assets/images/favicon/apple-touch-icon.png +0 -0
  65. data/styleguide/assets/images/favicon/browserconfig.xml +9 -0
  66. data/styleguide/assets/images/favicon/favicon-16x16.png +0 -0
  67. data/styleguide/assets/images/favicon/favicon-32x32.png +0 -0
  68. data/styleguide/assets/images/favicon/favicon.ico +0 -0
  69. data/styleguide/assets/images/favicon/manifest.json +18 -0
  70. data/styleguide/assets/images/favicon/mstile-144x144.png +0 -0
  71. data/styleguide/assets/images/favicon/mstile-150x150.png +0 -0
  72. data/styleguide/assets/images/favicon/mstile-310x150.png +0 -0
  73. data/styleguide/assets/images/favicon/mstile-310x310.png +0 -0
  74. data/styleguide/assets/images/favicon/mstile-70x70.png +0 -0
  75. data/styleguide/assets/images/favicon/safari-pinned-tab.svg +46 -0
  76. data/styleguide/assets/images/icons.svg +1 -0
  77. data/styleguide/assets/images/infographic-01.png +0 -0
  78. data/styleguide/assets/images/infographic-02.png +0 -0
  79. data/styleguide/assets/images/npm-logo.png +0 -0
  80. data/styleguide/assets/images/placeholder-text.png +0 -0
  81. data/styleguide/assets/images/ruby-logo.png +0 -0
  82. data/styleguide/assets/images/site-consistency01.png +0 -0
  83. data/styleguide/assets/images/site-consistency02.png +0 -0
  84. data/styleguide/assets/images/site-consistency03.png +0 -0
  85. data/styleguide/assets/images/styleguide-examples/accurate-housing.jpg +0 -0
  86. data/styleguide/assets/images/styleguide-examples/altered.jpg +0 -0
  87. data/styleguide/assets/images/styleguide-examples/bad-subject.jpg +0 -0
  88. data/styleguide/assets/images/styleguide-examples/centered.jpg +0 -0
  89. data/styleguide/assets/images/styleguide-examples/cliche.jpg +0 -0
  90. data/styleguide/assets/images/styleguide-examples/cold.jpg +0 -0
  91. data/styleguide/assets/images/styleguide-examples/good-subject.jpg +0 -0
  92. data/styleguide/assets/images/styleguide-examples/illustrations_1.png +0 -0
  93. data/styleguide/assets/images/styleguide-examples/illustrations_2.png +0 -0
  94. data/styleguide/assets/images/styleguide-examples/illustrations_3.png +0 -0
  95. data/styleguide/assets/images/styleguide-examples/illustrations_4.png +0 -0
  96. data/styleguide/assets/images/styleguide-examples/illustrations_5.png +0 -0
  97. data/styleguide/assets/images/styleguide-examples/illustrations_6.png +0 -0
  98. data/styleguide/assets/images/styleguide-examples/innaccurate-housing.jpg +0 -0
  99. data/styleguide/assets/images/styleguide-examples/natural-1.jpg +0 -0
  100. data/styleguide/assets/images/styleguide-examples/natural-2.jpg +0 -0
  101. data/styleguide/assets/images/styleguide-examples/natural-3.jpg +0 -0
  102. data/styleguide/assets/images/styleguide-examples/not-centered.jpg +0 -0
  103. data/styleguide/assets/images/styleguide-examples/realistic.jpg +0 -0
  104. data/styleguide/assets/images/styleguide-examples/unaltered.jpg +0 -0
  105. data/styleguide/assets/images/styleguide-examples/unnatural-1.jpg +0 -0
  106. data/styleguide/assets/images/styleguide-examples/unnatural-2.jpg +0 -0
  107. data/styleguide/assets/images/styleguide-examples/unnatural-3.jpg +0 -0
  108. data/styleguide/assets/images/styleguide-examples/warm.jpg +0 -0
  109. data/styleguide/assets/images/tone-framework.png +0 -0
  110. data/styleguide/assets/images/tone.png +0 -0
  111. data/styleguide/assets/images/tooltip.png +0 -0
  112. data/styleguide/assets/images/tsandcs.png +0 -0
  113. data/styleguide/assets/images/ustyle.svg +73 -0
  114. data/styleguide/assets/images/ux-conventions-consistency.png +0 -0
  115. data/styleguide/assets/images/ux-conventions-error.png +0 -0
  116. data/styleguide/assets/images/ux-conventions-errors.png +0 -0
  117. data/styleguide/assets/images/ux-conventions-flexibility.png +0 -0
  118. data/styleguide/assets/images/ux-conventions-freedom.png +0 -0
  119. data/styleguide/assets/images/ux-conventions-minimalist.png +0 -0
  120. data/styleguide/assets/images/ux-conventions-real-world.png +0 -0
  121. data/styleguide/assets/images/ux-conventions-recognition.png +0 -0
  122. data/styleguide/assets/images/ux-conventions-visibility.png +0 -0
  123. data/styleguide/assets/javascripts/app.js +115 -0
  124. data/styleguide/assets/javascripts/modules/stats.js +50 -0
  125. data/styleguide/assets/javascripts/vendor/highlight.js +1 -0
  126. data/styleguide/assets/javascripts/vendor/svg4everybody.js +1 -0
  127. data/styleguide/assets/sass/main.scss +42 -0
  128. data/styleguide/assets/sass/modules/_code.scss +8 -0
  129. data/styleguide/assets/sass/modules/_colours.scss +26 -0
  130. data/styleguide/assets/sass/modules/_copyright.scss +4 -0
  131. data/styleguide/assets/sass/modules/_grid.scss +12 -0
  132. data/styleguide/assets/sass/modules/_home.scss +5 -0
  133. data/styleguide/assets/sass/modules/_images.scss +24 -0
  134. data/styleguide/assets/sass/modules/_links.scss +3 -0
  135. data/styleguide/assets/sass/modules/_logo.scss +182 -0
  136. data/styleguide/assets/sass/modules/_made-at.scss +6 -0
  137. data/styleguide/assets/sass/modules/_markdown.scss +7 -0
  138. data/styleguide/assets/sass/modules/_nav-mobile.scss +72 -0
  139. data/styleguide/assets/sass/modules/_nav.scss +32 -0
  140. data/styleguide/assets/sass/modules/_sidebar.scss +94 -0
  141. data/styleguide/assets/sass/modules/_states.scss +4 -0
  142. data/styleguide/assets/sass/modules/_styleguide.scss +138 -0
  143. data/styleguide/assets/sass/modules/_table.scss +3 -0
  144. data/styleguide/assets/sass/modules/_tooltip.scss +9 -0
  145. data/styleguide/assets/sass/modules/_typography.scss +14 -0
  146. data/styleguide/assets/sass/modules/_version.scss +11 -0
  147. data/styleguide/assets/sass/structure/_base.scss +18 -0
  148. data/styleguide/assets/sass/structure/_header.scss +12 -0
  149. data/styleguide/assets/sass/vendor/_highlight.scss +139 -0
  150. data/styleguide/assets/sass/vendor/_pure-table.scss +75 -0
  151. data/styleguide/content/brand/index.md +47 -0
  152. data/styleguide/content/brand/logo.tpl +279 -0
  153. data/styleguide/content/design/accessibility-testing.md +82 -0
  154. data/styleguide/content/design/index.tpl +367 -0
  155. data/styleguide/content/design/typography.md +68 -0
  156. data/styleguide/content/design/validating-designs.tpl +304 -0
  157. data/styleguide/content/index.tpl +51 -0
  158. data/styleguide/content/language/grammar.md +220 -0
  159. data/styleguide/content/language/microcopy.md +170 -0
  160. data/styleguide/content/language/tone.md +135 -0
  161. data/styleguide/content/pattern-library/grid.tpl +64 -0
  162. data/styleguide/content/pattern-library/index.tpl +88 -0
  163. data/styleguide/partials/_footer.tpl +8 -0
  164. data/styleguide/partials/_head.tpl +26 -0
  165. data/styleguide/partials/_header.tpl +37 -0
  166. data/styleguide/partials/_sidebar.tpl +27 -0
  167. data/styleguide/partials/colour.tpl +24 -0
  168. data/styleguide/partials/icons.tpl +28 -0
  169. data/styleguide/partials/style_block.tpl +44 -0
  170. data/styleguide/templates/simple.tpl +25 -0
  171. data/styleguide/templates/stats.tpl +50 -0
  172. data/styleguide/templates/styleguide.tpl +36 -0
  173. data/tasks/publish.rake +67 -0
  174. data/ustyle.gemspec +32 -0
  175. data/vendor/assets/images/forms/checkbox-rebrand.svg +1 -0
  176. data/vendor/assets/images/forms/checkbox.svg +1 -0
  177. data/vendor/assets/images/icons/alarm.svg +1 -0
  178. data/vendor/assets/images/icons/android.svg +1 -0
  179. data/vendor/assets/images/icons/arrow-circle.svg +1 -0
  180. data/vendor/assets/images/icons/arrow-down.svg +1 -0
  181. data/vendor/assets/images/icons/arrow-up.svg +1 -0
  182. data/vendor/assets/images/icons/book.svg +1 -0
  183. data/vendor/assets/images/icons/bookmark.svg +1 -0
  184. data/vendor/assets/images/icons/breadcrumb.svg +1 -0
  185. data/vendor/assets/images/icons/calculator.svg +1 -0
  186. data/vendor/assets/images/icons/calendar.svg +1 -0
  187. data/vendor/assets/images/icons/car.svg +1 -0
  188. data/vendor/assets/images/icons/checkbox-tick.svg +1 -0
  189. data/vendor/assets/images/icons/chevron-left.svg +1 -0
  190. data/vendor/assets/images/icons/chevron-right.svg +1 -0
  191. data/vendor/assets/images/icons/clock.svg +1 -0
  192. data/vendor/assets/images/icons/close.svg +1 -0
  193. data/vendor/assets/images/icons/cog.svg +1 -0
  194. data/vendor/assets/images/icons/controller.svg +1 -0
  195. data/vendor/assets/images/icons/credit-card.svg +1 -0
  196. data/vendor/assets/images/icons/cross.svg +1 -0
  197. data/vendor/assets/images/icons/dashcam.svg +1 -0
  198. data/vendor/assets/images/icons/dual-fuel.svg +1 -0
  199. data/vendor/assets/images/icons/electric-light.svg +1 -0
  200. data/vendor/assets/images/icons/envelope.svg +1 -0
  201. data/vendor/assets/images/icons/exit-noexit.svg +1 -0
  202. data/vendor/assets/images/icons/facebook-brand.svg +1 -0
  203. data/vendor/assets/images/icons/facebook.svg +1 -0
  204. data/vendor/assets/images/icons/filter.svg +1 -0
  205. data/vendor/assets/images/icons/fixed-variable.svg +1 -0
  206. data/vendor/assets/images/icons/gas.svg +1 -0
  207. data/vendor/assets/images/icons/gauge.svg +1 -0
  208. data/vendor/assets/images/icons/github.svg +1 -0
  209. data/vendor/assets/images/icons/google-brand.svg +1 -0
  210. data/vendor/assets/images/icons/google.svg +1 -0
  211. data/vendor/assets/images/icons/graph-up.svg +1 -0
  212. data/vendor/assets/images/icons/home.svg +1 -0
  213. data/vendor/assets/images/icons/hot.svg +1 -0
  214. data/vendor/assets/images/icons/info.svg +1 -0
  215. data/vendor/assets/images/icons/kettle.svg +1 -0
  216. data/vendor/assets/images/icons/key.svg +1 -0
  217. data/vendor/assets/images/icons/lock.svg +1 -0
  218. data/vendor/assets/images/icons/magnify-in.svg +1 -0
  219. data/vendor/assets/images/icons/magnify.svg +1 -0
  220. data/vendor/assets/images/icons/menu.svg +1 -0
  221. data/vendor/assets/images/icons/message.svg +1 -0
  222. data/vendor/assets/images/icons/mobile.svg +1 -0
  223. data/vendor/assets/images/icons/monthly-dd.svg +1 -0
  224. data/vendor/assets/images/icons/network.svg +1 -0
  225. data/vendor/assets/images/icons/no-exit.svg +1 -0
  226. data/vendor/assets/images/icons/pdf.svg +1 -0
  227. data/vendor/assets/images/icons/pencil.svg +1 -0
  228. data/vendor/assets/images/icons/person-add.svg +1 -0
  229. data/vendor/assets/images/icons/person.svg +1 -0
  230. data/vendor/assets/images/icons/phone.svg +1 -0
  231. data/vendor/assets/images/icons/piggy-bank.svg +1 -0
  232. data/vendor/assets/images/icons/pin.svg +1 -0
  233. data/vendor/assets/images/icons/play.svg +1 -0
  234. data/vendor/assets/images/icons/pound-circle.svg +1 -0
  235. data/vendor/assets/images/icons/pound-note.svg +1 -0
  236. data/vendor/assets/images/icons/present.svg +1 -0
  237. data/vendor/assets/images/icons/print.svg +1 -0
  238. data/vendor/assets/images/icons/quarterly-dd.svg +1 -0
  239. data/vendor/assets/images/icons/question-circle.svg +1 -0
  240. data/vendor/assets/images/icons/quote.svg +1 -0
  241. data/vendor/assets/images/icons/recycle.svg +1 -0
  242. data/vendor/assets/images/icons/remove.svg +1 -0
  243. data/vendor/assets/images/icons/renewable.svg +1 -0
  244. data/vendor/assets/images/icons/results.svg +1 -0
  245. data/vendor/assets/images/icons/save.svg +1 -0
  246. data/vendor/assets/images/icons/share.svg +1 -0
  247. data/vendor/assets/images/icons/shield.svg +1 -0
  248. data/vendor/assets/images/icons/sim.svg +1 -0
  249. data/vendor/assets/images/icons/smiley.svg +1 -0
  250. data/vendor/assets/images/icons/sort.svg +1 -0
  251. data/vendor/assets/images/icons/speech-circle.svg +1 -0
  252. data/vendor/assets/images/icons/speech.svg +1 -0
  253. data/vendor/assets/images/icons/spinner-rebrand.svg +1 -0
  254. data/vendor/assets/images/icons/spinner.svg +1 -0
  255. data/vendor/assets/images/icons/star-half.svg +1 -0
  256. data/vendor/assets/images/icons/star.svg +1 -0
  257. data/vendor/assets/images/icons/starline-half.svg +1 -0
  258. data/vendor/assets/images/icons/starline.svg +1 -0
  259. data/vendor/assets/images/icons/talk.svg +1 -0
  260. data/vendor/assets/images/icons/tick-circle.svg +1 -0
  261. data/vendor/assets/images/icons/tick.svg +1 -0
  262. data/vendor/assets/images/icons/tv.svg +1 -0
  263. data/vendor/assets/images/icons/twitter-brand.svg +1 -0
  264. data/vendor/assets/images/icons/twitter.svg +1 -0
  265. data/vendor/assets/images/icons/ustyle.svg +1 -0
  266. data/vendor/assets/images/icons/uswitch.svg +1 -0
  267. data/vendor/assets/images/icons/variable.svg +1 -0
  268. data/vendor/assets/images/icons/warning-circle.svg +1 -0
  269. data/vendor/assets/images/icons/warning.svg +1 -0
  270. data/vendor/assets/images/icons/wifi.svg +1 -0
  271. data/vendor/assets/images/icons/wiki.svg +1 -0
  272. data/vendor/assets/images/icons/xml.svg +1 -0
  273. data/vendor/assets/images/icons.svg +1 -0
  274. data/vendor/assets/javascripts/ustyle/backdrop.js +56 -0
  275. data/vendor/assets/javascripts/ustyle/classtoggler.js +76 -0
  276. data/vendor/assets/javascripts/ustyle/overlay.js +152 -0
  277. data/vendor/assets/javascripts/ustyle/tabs.js +166 -0
  278. data/vendor/assets/javascripts/ustyle/utils.js +113 -0
  279. data/vendor/assets/javascripts/ustyle.js +4 -0
  280. data/vendor/assets/stylesheets/rebrand-content.scss +1 -0
  281. data/vendor/assets/stylesheets/rebrand.scss +1 -0
  282. data/vendor/assets/stylesheets/ustyle/_all.scss +55 -0
  283. data/vendor/assets/stylesheets/ustyle/_content.scss +5 -0
  284. data/vendor/assets/stylesheets/ustyle/_global.scss +20 -0
  285. data/vendor/assets/stylesheets/ustyle/articles/_base.scss +100 -0
  286. data/vendor/assets/stylesheets/ustyle/articles/_guide.scss +57 -0
  287. data/vendor/assets/stylesheets/ustyle/articles/_more.scss +31 -0
  288. data/vendor/assets/stylesheets/ustyle/articles/_news.scss +213 -0
  289. data/vendor/assets/stylesheets/ustyle/articles/_related.scss +76 -0
  290. data/vendor/assets/stylesheets/ustyle/basics/_extends.scss +73 -0
  291. data/vendor/assets/stylesheets/ustyle/basics/_fonts.scss +27 -0
  292. data/vendor/assets/stylesheets/ustyle/basics/_functions.scss +78 -0
  293. data/vendor/assets/stylesheets/ustyle/basics/_grid.scss +86 -0
  294. data/vendor/assets/stylesheets/ustyle/basics/_typography.scss +123 -0
  295. data/vendor/assets/stylesheets/ustyle/basics/_variables.scss +166 -0
  296. data/vendor/assets/stylesheets/ustyle/basics/variables/_colors.scss +94 -0
  297. data/vendor/assets/stylesheets/ustyle/basics/variables/_forms.scss +98 -0
  298. data/vendor/assets/stylesheets/ustyle/basics/variables/_icons.scss +43 -0
  299. data/vendor/assets/stylesheets/ustyle/components/_backdrop.scss +23 -0
  300. data/vendor/assets/stylesheets/ustyle/components/_breadcrumbs.scss +66 -0
  301. data/vendor/assets/stylesheets/ustyle/components/_button.scss +187 -0
  302. data/vendor/assets/stylesheets/ustyle/components/_calculator.scss +41 -0
  303. data/vendor/assets/stylesheets/ustyle/components/_comp-table-row.scss +341 -0
  304. data/vendor/assets/stylesheets/ustyle/components/_compliance-banner.scss +38 -0
  305. data/vendor/assets/stylesheets/ustyle/components/_content-group.scss +33 -0
  306. data/vendor/assets/stylesheets/ustyle/components/_cta.scss +66 -0
  307. data/vendor/assets/stylesheets/ustyle/components/_grid-classes.scss +52 -0
  308. data/vendor/assets/stylesheets/ustyle/components/_hero.scss +115 -0
  309. data/vendor/assets/stylesheets/ustyle/components/_links.scss +26 -0
  310. data/vendor/assets/stylesheets/ustyle/components/_lists-li.scss +92 -0
  311. data/vendor/assets/stylesheets/ustyle/components/_lists.scss +39 -0
  312. data/vendor/assets/stylesheets/ustyle/components/_loader.scss +139 -0
  313. data/vendor/assets/stylesheets/ustyle/components/_overlay.scss +183 -0
  314. data/vendor/assets/stylesheets/ustyle/components/_progress.scss +138 -0
  315. data/vendor/assets/stylesheets/ustyle/components/_promo-banner.scss +131 -0
  316. data/vendor/assets/stylesheets/ustyle/components/_reminder.scss +87 -0
  317. data/vendor/assets/stylesheets/ustyle/components/_tab-navigation.scss +114 -0
  318. data/vendor/assets/stylesheets/ustyle/components/_table-toolbar.scss +91 -0
  319. data/vendor/assets/stylesheets/ustyle/components/_tabs.scss +300 -0
  320. data/vendor/assets/stylesheets/ustyle/components/_tooltip.scss +243 -0
  321. data/vendor/assets/stylesheets/ustyle/components/_usp.scss +88 -0
  322. data/vendor/assets/stylesheets/ustyle/content/_base.scss +227 -0
  323. data/vendor/assets/stylesheets/ustyle/content/_c-header.scss +27 -0
  324. data/vendor/assets/stylesheets/ustyle/content/_c-social.scss +9 -0
  325. data/vendor/assets/stylesheets/ustyle/content/_c-tabs.scss +30 -0
  326. data/vendor/assets/stylesheets/ustyle/forms/_base.scss +9 -0
  327. data/vendor/assets/stylesheets/ustyle/forms/_fields.scss +78 -0
  328. data/vendor/assets/stylesheets/ustyle/forms/_input-group.scss +154 -0
  329. data/vendor/assets/stylesheets/ustyle/forms/_input.scss +61 -0
  330. data/vendor/assets/stylesheets/ustyle/forms/_radio-checkbox.scss +144 -0
  331. data/vendor/assets/stylesheets/ustyle/forms/_reset.scss +21 -0
  332. data/vendor/assets/stylesheets/ustyle/forms/_select.scss +154 -0
  333. data/vendor/assets/stylesheets/ustyle/forms/_textarea.scss +33 -0
  334. data/vendor/assets/stylesheets/ustyle/forms/_toggle.scss +114 -0
  335. data/vendor/assets/stylesheets/ustyle/forms/_validation.scss +104 -0
  336. data/vendor/assets/stylesheets/ustyle/icons/_base.scss +241 -0
  337. data/vendor/assets/stylesheets/ustyle/mixins/_arrow.scss +51 -0
  338. data/vendor/assets/stylesheets/ustyle/mixins/_base.scss +7 -0
  339. data/vendor/assets/stylesheets/ustyle/mixins/_baseline.scss +43 -0
  340. data/vendor/assets/stylesheets/ustyle/mixins/_forms.scss +84 -0
  341. data/vendor/assets/stylesheets/ustyle/mixins/_general.scss +24 -0
  342. data/vendor/assets/stylesheets/ustyle/mixins/_link-colors.scss +44 -0
  343. data/vendor/assets/stylesheets/ustyle/mixins/_media-query.scss +121 -0
  344. data/vendor/assets/stylesheets/ustyle/mixins/_typography.scss +98 -0
  345. data/vendor/assets/stylesheets/ustyle/tables/_base.scss +4 -0
  346. data/vendor/assets/stylesheets/ustyle/tables/_tables-basic.scss +72 -0
  347. data/vendor/assets/stylesheets/ustyle/tables/_tables-sortable.scss +72 -0
  348. data/vendor/assets/stylesheets/ustyle/tables/_tables-with-key-cells.scss +18 -0
  349. data/vendor/assets/stylesheets/ustyle/tables/_variables.scss +15 -0
  350. data/vendor/assets/stylesheets/ustyle/utilities/_general.scss +116 -0
  351. data/vendor/assets/stylesheets/ustyle/utilities/_grid.scss +13 -0
  352. data/vendor/assets/stylesheets/ustyle/utilities/_images.scss +34 -0
  353. data/vendor/assets/stylesheets/ustyle/utilities/_responsive.scss +101 -0
  354. data/vendor/assets/stylesheets/ustyle/utilities/_spacing.scss +73 -0
  355. data/vendor/assets/stylesheets/ustyle/vendor/normalize.scss +427 -0
  356. data/vendor/assets/stylesheets/ustyle-content.scss +2 -0
  357. data/vendor/assets/stylesheets/ustyle.scss +1 -0
  358. metadata +517 -0
@@ -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
+ }