reustyle 2.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }