├── .gitignore ├── .htaccess ├── .sass-lint.yml ├── .travis.yml ├── LICENSE.md ├── README.md ├── gulpfile.js ├── package.json ├── sache.json └── src ├── browserconfig.xml ├── crossdomain.xml ├── humans.txt ├── icons ├── apple-touch-icon-114x114-precomposed.png ├── apple-touch-icon-57x57-precomposed.png ├── apple-touch-icon-72x72-precomposed.png ├── apple-touch-icon-precomposed.png ├── apple-touch-icon.png ├── favicon.ico └── favicon.png ├── index.html ├── js └── .gitkeep ├── robots.txt └── scss ├── _shame.scss ├── atoms └── _index.scss ├── base ├── _base.scss └── _index.scss ├── layout └── _index.scss ├── libs ├── _index.scss ├── _normalize.scss └── _pesticide.scss ├── molecules └── _index.scss ├── organisms └── _index.scss ├── overrides └── _index.scss ├── states ├── _index.scss └── _print.scss ├── styles.scss ├── themes └── rebeccapurple.scss └── utilities ├── _colors.scss ├── _config.scss ├── _fonts.scss ├── _functions.scss ├── _index.scss ├── _mixins.scss └── _typography.scss /.gitignore: -------------------------------------------------------------------------------- 1 | # Include your project-specific ignores in this file 2 | # Read about how to use .gitignore: https://help.github.com/articles/ignoring-files 3 | 4 | node_modules/ 5 | dist/ 6 | -------------------------------------------------------------------------------- /.htaccess: -------------------------------------------------------------------------------- 1 | # Apache Server Configs v2.14.0 | MIT License 2 | # https://github.com/h5bp/server-configs-apache 3 | 4 | # (!) Using `.htaccess` files slows down Apache, therefore, if you have 5 | # access to the main server configuration file (which is usually called 6 | # `httpd.conf`), you should add this logic there. 7 | # 8 | # https://httpd.apache.org/docs/current/howto/htaccess.html. 9 | 10 | # ###################################################################### 11 | # # CROSS-ORIGIN # 12 | # ###################################################################### 13 | 14 | # ---------------------------------------------------------------------- 15 | # | Cross-origin requests | 16 | # ---------------------------------------------------------------------- 17 | 18 | # Allow cross-origin requests. 19 | # 20 | # https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS 21 | # http://enable-cors.org/ 22 | # http://www.w3.org/TR/cors/ 23 | 24 | # 25 | # Header set Access-Control-Allow-Origin "*" 26 | # 27 | 28 | # ---------------------------------------------------------------------- 29 | # | Cross-origin images | 30 | # ---------------------------------------------------------------------- 31 | 32 | # Send the CORS header for images when browsers request it. 33 | # 34 | # https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image 35 | # https://blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html 36 | 37 | 38 | 39 | 40 | SetEnvIf Origin ":" IS_CORS 41 | Header set Access-Control-Allow-Origin "*" env=IS_CORS 42 | 43 | 44 | 45 | 46 | # ---------------------------------------------------------------------- 47 | # | Cross-origin web fonts | 48 | # ---------------------------------------------------------------------- 49 | 50 | # Allow cross-origin access to web fonts. 51 | 52 | 53 | 54 | Header set Access-Control-Allow-Origin "*" 55 | 56 | 57 | 58 | # ---------------------------------------------------------------------- 59 | # | Cross-origin resource timing | 60 | # ---------------------------------------------------------------------- 61 | 62 | # Allow cross-origin access to the timing information for all resources. 63 | # 64 | # If a resource isn't served with a `Timing-Allow-Origin` header that 65 | # would allow its timing information to be shared with the document, 66 | # some of the attributes of the `PerformanceResourceTiming` object will 67 | # be set to zero. 68 | # 69 | # http://www.w3.org/TR/resource-timing/ 70 | # http://www.stevesouders.com/blog/2014/08/21/resource-timing-practical-tips/ 71 | 72 | # 73 | # Header set Timing-Allow-Origin: "*" 74 | # 75 | 76 | 77 | # ###################################################################### 78 | # # ERRORS # 79 | # ###################################################################### 80 | 81 | # ---------------------------------------------------------------------- 82 | # | Custom error messages/pages | 83 | # ---------------------------------------------------------------------- 84 | 85 | # Customize what Apache returns to the client in case of an error. 86 | # https://httpd.apache.org/docs/current/mod/core.html#errordocument 87 | 88 | ErrorDocument 404 /404.html 89 | 90 | # ---------------------------------------------------------------------- 91 | # | Error prevention | 92 | # ---------------------------------------------------------------------- 93 | 94 | # Disable the pattern matching based on filenames. 95 | # 96 | # This setting prevents Apache from returning a 404 error as the result 97 | # of a rewrite when the directory with the same name does not exist. 98 | # 99 | # https://httpd.apache.org/docs/current/content-negotiation.html#multiviews 100 | 101 | Options -MultiViews 102 | 103 | 104 | # ###################################################################### 105 | # # INTERNET EXPLORER # 106 | # ###################################################################### 107 | 108 | # ---------------------------------------------------------------------- 109 | # | Document modes | 110 | # ---------------------------------------------------------------------- 111 | 112 | # Force Internet Explorer 8/9/10 to render pages in the highest mode 113 | # available in the various cases when it may not. 114 | # 115 | # https://hsivonen.fi/doctype/#ie8 116 | # 117 | # (!) Starting with Internet Explorer 11, document modes are deprecated. 118 | # If your business still relies on older web apps and services that were 119 | # designed for older versions of Internet Explorer, you might want to 120 | # consider enabling `Enterprise Mode` throughout your company. 121 | # 122 | # https://msdn.microsoft.com/en-us/library/ie/bg182625.aspx#docmode 123 | # http://blogs.msdn.com/b/ie/archive/2014/04/02/stay-up-to-date-with-enterprise-mode-for-internet-explorer-11.aspx 124 | 125 | 126 | 127 | Header set X-UA-Compatible "IE=edge" 128 | 129 | # `mod_headers` cannot match based on the content-type, however, 130 | # the `X-UA-Compatible` response header should be send only for 131 | # HTML documents and not for the other resources. 132 | 133 | 134 | Header unset X-UA-Compatible 135 | 136 | 137 | 138 | 139 | # ---------------------------------------------------------------------- 140 | # | Iframes cookies | 141 | # ---------------------------------------------------------------------- 142 | 143 | # Allow cookies to be set from iframes in Internet Explorer. 144 | # 145 | # https://msdn.microsoft.com/en-us/library/ms537343.aspx 146 | # http://www.w3.org/TR/2000/CR-P3P-20001215/ 147 | 148 | # 149 | # Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"" 150 | # 151 | 152 | 153 | # ###################################################################### 154 | # # MEDIA TYPES AND CHARACTER ENCODINGS # 155 | # ###################################################################### 156 | 157 | # ---------------------------------------------------------------------- 158 | # | Media types | 159 | # ---------------------------------------------------------------------- 160 | 161 | # Serve resources with the proper media types (f.k.a. MIME types). 162 | # 163 | # https://www.iana.org/assignments/media-types/media-types.xhtml 164 | # https://httpd.apache.org/docs/current/mod/mod_mime.html#addtype 165 | 166 | 167 | 168 | # Data interchange 169 | 170 | AddType application/atom+xml atom 171 | AddType application/json json map topojson 172 | AddType application/ld+json jsonld 173 | AddType application/rss+xml rss 174 | AddType application/vnd.geo+json geojson 175 | AddType application/xml rdf xml 176 | 177 | 178 | # JavaScript 179 | 180 | # Normalize to standard type. 181 | # https://tools.ietf.org/html/rfc4329#section-7.2 182 | 183 | AddType application/javascript js 184 | 185 | 186 | # Manifest files 187 | 188 | AddType application/manifest+json webmanifest 189 | AddType application/x-web-app-manifest+json webapp 190 | AddType text/cache-manifest appcache 191 | 192 | 193 | # Media files 194 | 195 | AddType audio/mp4 f4a f4b m4a 196 | AddType audio/ogg oga ogg opus 197 | AddType image/bmp bmp 198 | AddType image/svg+xml svg svgz 199 | AddType image/webp webp 200 | AddType video/mp4 f4v f4p m4v mp4 201 | AddType video/ogg ogv 202 | AddType video/webm webm 203 | AddType video/x-flv flv 204 | 205 | # Serving `.ico` image files with a different media type 206 | # prevents Internet Explorer from displaying then as images: 207 | # https://github.com/h5bp/html5-boilerplate/commit/37b5fec090d00f38de64b591bcddcb205aadf8ee 208 | 209 | AddType image/x-icon cur ico 210 | 211 | 212 | # Web fonts 213 | 214 | AddType application/font-woff woff 215 | AddType application/font-woff2 woff2 216 | AddType application/vnd.ms-fontobject eot 217 | 218 | # Browsers usually ignore the font media types and simply sniff 219 | # the bytes to figure out the font type. 220 | # https://mimesniff.spec.whatwg.org/#matching-a-font-type-pattern 221 | # 222 | # However, Blink and WebKit based browsers will show a warning 223 | # in the console if the following font types are served with any 224 | # other media types. 225 | 226 | AddType application/x-font-ttf ttc ttf 227 | AddType font/opentype otf 228 | 229 | 230 | # Other 231 | 232 | AddType application/octet-stream safariextz 233 | AddType application/x-bb-appworld bbaw 234 | AddType application/x-chrome-extension crx 235 | AddType application/x-opera-extension oex 236 | AddType application/x-xpinstall xpi 237 | AddType text/vcard vcard vcf 238 | AddType text/vnd.rim.location.xloc xloc 239 | AddType text/vtt vtt 240 | AddType text/x-component htc 241 | 242 | 243 | 244 | # ---------------------------------------------------------------------- 245 | # | Character encodings | 246 | # ---------------------------------------------------------------------- 247 | 248 | # Serve all resources labeled as `text/html` or `text/plain` 249 | # with the media type `charset` parameter set to `UTF-8`. 250 | # 251 | # https://httpd.apache.org/docs/current/mod/core.html#adddefaultcharset 252 | 253 | AddDefaultCharset utf-8 254 | 255 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 256 | 257 | # Serve the following file types with the media type `charset` 258 | # parameter set to `UTF-8`. 259 | # 260 | # https://httpd.apache.org/docs/current/mod/mod_mime.html#addcharset 261 | 262 | 263 | AddCharset utf-8 .atom \ 264 | .bbaw \ 265 | .css \ 266 | .geojson \ 267 | .js \ 268 | .json \ 269 | .jsonld \ 270 | .manifest \ 271 | .rdf \ 272 | .rss \ 273 | .topojson \ 274 | .vtt \ 275 | .webapp \ 276 | .webmanifest \ 277 | .xloc \ 278 | .xml 279 | 280 | 281 | 282 | # ###################################################################### 283 | # # REWRITES # 284 | # ###################################################################### 285 | 286 | # ---------------------------------------------------------------------- 287 | # | Rewrite engine | 288 | # ---------------------------------------------------------------------- 289 | 290 | # (1) Turn on the rewrite engine (this is necessary in order for 291 | # the `RewriteRule` directives to work). 292 | # 293 | # https://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteEngine 294 | # 295 | # (2) Enable the `FollowSymLinks` option if it isn't already. 296 | # 297 | # https://httpd.apache.org/docs/current/mod/core.html#options 298 | # 299 | # (3) If your web host doesn't allow the `FollowSymlinks` option, 300 | # you need to comment it out or remove it, and then uncomment 301 | # the `Options +SymLinksIfOwnerMatch` line (4), but be aware 302 | # of the performance impact. 303 | # 304 | # https://httpd.apache.org/docs/current/misc/perf-tuning.html#symlinks 305 | # 306 | # (4) Some cloud hosting services will require you set `RewriteBase`. 307 | # 308 | # https://www.rackspace.com/knowledge_center/frequently-asked-question/why-is-modrewrite-not-working-on-my-site 309 | # https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase 310 | # 311 | # (5) Depending on how your server is set up, you may also need to 312 | # use the `RewriteOptions` directive to enable some options for 313 | # the rewrite engine. 314 | # 315 | # https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions 316 | # 317 | # (6) Set %{ENV:PROTO} variable, to allow rewrites to redirect with the 318 | # appropriate schema automatically (http or https). 319 | 320 | 321 | 322 | # (1) 323 | RewriteEngine On 324 | 325 | # (2) 326 | Options +FollowSymlinks 327 | 328 | # (3) 329 | # Options +SymLinksIfOwnerMatch 330 | 331 | # (4) 332 | # RewriteBase / 333 | 334 | # (5) 335 | # RewriteOptions 336 | 337 | # (6) 338 | RewriteCond %{HTTPS} =on 339 | RewriteRule ^ - [env=proto:https] 340 | RewriteCond %{HTTPS} !=on 341 | RewriteRule ^ - [env=proto:http] 342 | 343 | 344 | 345 | # ---------------------------------------------------------------------- 346 | # | Forcing `https://` | 347 | # ---------------------------------------------------------------------- 348 | 349 | # Redirect from the `http://` to the `https://` version of the URL. 350 | # https://wiki.apache.org/httpd/RewriteHTTPToHTTPS 351 | 352 | # 353 | # RewriteEngine On 354 | # RewriteCond %{HTTPS} !=on 355 | # RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] 356 | # 357 | 358 | # ---------------------------------------------------------------------- 359 | # | Suppressing / Forcing the `www.` at the beginning of URLs | 360 | # ---------------------------------------------------------------------- 361 | 362 | # The same content should never be available under two different 363 | # URLs, especially not with and without `www.` at the beginning. 364 | # This can cause SEO problems (duplicate content), and therefore, 365 | # you should choose one of the alternatives and redirect the other 366 | # one. 367 | # 368 | # By default `Option 1` (no `www.`) is activated. 369 | # http://no-www.org/faq.php?q=class_b 370 | # 371 | # If you would prefer to use `Option 2`, just comment out all the 372 | # lines from `Option 1` and uncomment the ones from `Option 2`. 373 | # 374 | # (!) NEVER USE BOTH RULES AT THE SAME TIME! 375 | 376 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 377 | 378 | # Option 1: rewrite www.example.com → example.com 379 | 380 | 381 | RewriteEngine On 382 | RewriteCond %{HTTPS} !=on 383 | RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 384 | RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L] 385 | 386 | 387 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 388 | 389 | # Option 2: rewrite example.com → www.example.com 390 | # 391 | # Be aware that the following might not be a good idea if you use "real" 392 | # subdomains for certain parts of your website. 393 | 394 | # 395 | # RewriteEngine On 396 | # RewriteCond %{HTTPS} !=on 397 | # RewriteCond %{HTTP_HOST} !^www\. [NC] 398 | # RewriteCond %{SERVER_ADDR} !=127.0.0.1 399 | # RewriteCond %{SERVER_ADDR} !=::1 400 | # RewriteRule ^ %{ENV:PROTO}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 401 | # 402 | 403 | 404 | # ###################################################################### 405 | # # SECURITY # 406 | # ###################################################################### 407 | 408 | # ---------------------------------------------------------------------- 409 | # | Clickjacking | 410 | # ---------------------------------------------------------------------- 411 | 412 | # Protect website against clickjacking. 413 | # 414 | # The example below sends the `X-Frame-Options` response header with 415 | # the value `DENY`, informing browsers not to display the content of 416 | # the web page in any frame. 417 | # 418 | # This might not be the best setting for everyone. You should read 419 | # about the other two possible values the `X-Frame-Options` header 420 | # field can have: `SAMEORIGIN` and `ALLOW-FROM`. 421 | # https://tools.ietf.org/html/rfc7034#section-2.1. 422 | # 423 | # Keep in mind that while you could send the `X-Frame-Options` header 424 | # for all of your website’s pages, this has the potential downside that 425 | # it forbids even non-malicious framing of your content (e.g.: when 426 | # users visit your website using a Google Image Search results page). 427 | # 428 | # Nonetheless, you should ensure that you send the `X-Frame-Options` 429 | # header for all pages that allow a user to make a state changing 430 | # operation (e.g: pages that contain one-click purchase links, checkout 431 | # or bank-transfer confirmation pages, pages that make permanent 432 | # configuration changes, etc.). 433 | # 434 | # Sending the `X-Frame-Options` header can also protect your website 435 | # against more than just clickjacking attacks: 436 | # https://cure53.de/xfo-clickjacking.pdf. 437 | # 438 | # https://tools.ietf.org/html/rfc7034 439 | # http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspx 440 | # https://www.owasp.org/index.php/Clickjacking 441 | 442 | # 443 | 444 | # Header set X-Frame-Options "DENY" 445 | 446 | # # `mod_headers` cannot match based on the content-type, however, 447 | # # the `X-Frame-Options` response header should be send only for 448 | # # HTML documents and not for the other resources. 449 | 450 | # 451 | # Header unset X-Frame-Options 452 | # 453 | 454 | # 455 | 456 | # ---------------------------------------------------------------------- 457 | # | Content Security Policy (CSP) | 458 | # ---------------------------------------------------------------------- 459 | 460 | # Mitigate the risk of cross-site scripting and other content-injection 461 | # attacks. 462 | # 463 | # This can be done by setting a `Content Security Policy` which 464 | # whitelists trusted sources of content for your website. 465 | # 466 | # The example header below allows ONLY scripts that are loaded from 467 | # the current website's origin (no inline scripts, no CDN, etc). 468 | # That almost certainly won't work as-is for your website! 469 | # 470 | # To make things easier, you can use an online CSP header generator 471 | # such as: http://cspisawesome.com/. 472 | # 473 | # http://content-security-policy.com/ 474 | # http://www.html5rocks.com/en/tutorials/security/content-security-policy/ 475 | # http://www.w3.org/TR/CSP11/). 476 | 477 | # 478 | 479 | # Header set Content-Security-Policy "script-src 'self'; object-src 'self'" 480 | 481 | # # `mod_headers` cannot match based on the content-type, however, 482 | # # the `Content-Security-Policy` response header should be send 483 | # # only for HTML documents and not for the other resources. 484 | 485 | # 486 | # Header unset Content-Security-Policy 487 | # 488 | 489 | # 490 | 491 | # ---------------------------------------------------------------------- 492 | # | File access | 493 | # ---------------------------------------------------------------------- 494 | 495 | # Block access to directories without a default document. 496 | # 497 | # You should leave the following uncommented, as you shouldn't allow 498 | # anyone to surf through every directory on your server (which may 499 | # includes rather private places such as the CMS's directories). 500 | 501 | 502 | Options -Indexes 503 | 504 | 505 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 506 | 507 | # Block access to all hidden files and directories with the exception of 508 | # the visible content from within the `/.well-known/` hidden directory. 509 | # 510 | # These types of files usually contain user preferences or the preserved 511 | # state of an utility, and can include rather private places like, for 512 | # example, the `.git` or `.svn` directories. 513 | # 514 | # The `/.well-known/` directory represents the standard (RFC 5785) path 515 | # prefix for "well-known locations" (e.g.: `/.well-known/manifest.json`, 516 | # `/.well-known/keybase.txt`), and therefore, access to its visible 517 | # content should not be blocked. 518 | # 519 | # https://www.mnot.net/blog/2010/04/07/well-known 520 | # https://tools.ietf.org/html/rfc5785 521 | 522 | 523 | RewriteEngine On 524 | RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC] 525 | RewriteCond %{SCRIPT_FILENAME} -d [OR] 526 | RewriteCond %{SCRIPT_FILENAME} -f 527 | RewriteRule "(^|/)\." - [F] 528 | 529 | 530 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 531 | 532 | # Block access to files that can expose sensitive information. 533 | # 534 | # By default, block access to backup and source files that may be 535 | # left by some text editors and can pose a security risk when anyone 536 | # has access to them. 537 | # 538 | # http://feross.org/cmsploit/ 539 | # 540 | # (!) Update the `` regular expression from below to 541 | # include any files that might end up on your production server and 542 | # can expose sensitive information about your website. These files may 543 | # include: configuration files, files that contain metadata about the 544 | # project (e.g.: project dependencies), build scripts, etc.. 545 | 546 | 547 | 548 | # Apache < 2.3 549 | 550 | Order allow,deny 551 | Deny from all 552 | Satisfy All 553 | 554 | 555 | # Apache ≥ 2.3 556 | 557 | Require all denied 558 | 559 | 560 | 561 | 562 | # ---------------------------------------------------------------------- 563 | # | HTTP Strict Transport Security (HSTS) | 564 | # ---------------------------------------------------------------------- 565 | 566 | # Force client-side SSL redirection. 567 | # 568 | # If a user types `example.com` in their browser, even if the server 569 | # redirects them to the secure version of the website, that still leaves 570 | # a window of opportunity (the initial HTTP connection) for an attacker 571 | # to downgrade or redirect the request. 572 | # 573 | # The following header ensures that browser will ONLY connect to your 574 | # server via HTTPS, regardless of what the users type in the browser's 575 | # address bar. 576 | # 577 | # (!) Remove the `includeSubDomains` optional directive if the website's 578 | # subdomains are not using HTTPS. 579 | # 580 | # http://www.html5rocks.com/en/tutorials/security/transport-layer-security/ 581 | # https://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14#section-6.1 582 | # http://blogs.msdn.com/b/ieinternals/archive/2014/08/18/hsts-strict-transport-security-attacks-mitigations-deployment-https.aspx 583 | 584 | # 585 | # Header always set Strict-Transport-Security "max-age=16070400; includeSubDomains" 586 | # 587 | 588 | # ---------------------------------------------------------------------- 589 | # | Reducing MIME type security risks | 590 | # ---------------------------------------------------------------------- 591 | 592 | # Prevent some browsers from MIME-sniffing the response. 593 | # 594 | # This reduces exposure to drive-by download attacks and cross-origin 595 | # data leaks, and should be left uncommented, especially if the server 596 | # is serving user-uploaded content or content that could potentially be 597 | # treated as executable by the browser. 598 | # 599 | # http://www.slideshare.net/hasegawayosuke/owasp-hasegawa 600 | # http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx 601 | # https://msdn.microsoft.com/en-us/library/ie/gg622941.aspx 602 | # https://mimesniff.spec.whatwg.org/ 603 | 604 | 605 | Header set X-Content-Type-Options "nosniff" 606 | 607 | 608 | # ---------------------------------------------------------------------- 609 | # | Reflected Cross-Site Scripting (XSS) attacks | 610 | # ---------------------------------------------------------------------- 611 | 612 | # (1) Try to re-enable the cross-site scripting (XSS) filter built 613 | # into most web browsers. 614 | # 615 | # The filter is usually enabled by default, but in some cases it 616 | # may be disabled by the user. However, in Internet Explorer for 617 | # example, it can be re-enabled just by sending the 618 | # `X-XSS-Protection` header with the value of `1`. 619 | # 620 | # (2) Prevent web browsers from rendering the web page if a potential 621 | # reflected (a.k.a non-persistent) XSS attack is detected by the 622 | # filter. 623 | # 624 | # By default, if the filter is enabled and browsers detect a 625 | # reflected XSS attack, they will attempt to block the attack 626 | # by making the smallest possible modifications to the returned 627 | # web page. 628 | # 629 | # Unfortunately, in some browsers (e.g.: Internet Explorer), 630 | # this default behavior may allow the XSS filter to be exploited, 631 | # thereby, it's better to inform browsers to prevent the rendering 632 | # of the page altogether, instead of attempting to modify it. 633 | # 634 | # https://hackademix.net/2009/11/21/ies-xss-filter-creates-xss-vulnerabilities 635 | # 636 | # (!) Do not rely on the XSS filter to prevent XSS attacks! Ensure that 637 | # you are taking all possible measures to prevent XSS attacks, the 638 | # most obvious being: validating and sanitizing your website's inputs. 639 | # 640 | # http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8-security-part-iv-the-xss-filter.aspx 641 | # http://blogs.msdn.com/b/ieinternals/archive/2011/01/31/controlling-the-internet-explorer-xss-filter-with-the-x-xss-protection-http-header.aspx 642 | # https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29 643 | 644 | # 645 | 646 | # # (1) (2) 647 | # Header set X-XSS-Protection "1; mode=block" 648 | 649 | # # `mod_headers` cannot match based on the content-type, however, 650 | # # the `X-XSS-Protection` response header should be send only for 651 | # # HTML documents and not for the other resources. 652 | 653 | # 654 | # Header unset X-XSS-Protection 655 | # 656 | 657 | # 658 | 659 | # ---------------------------------------------------------------------- 660 | # | Server-side technology information | 661 | # ---------------------------------------------------------------------- 662 | 663 | # Remove the `X-Powered-By` response header that: 664 | # 665 | # * is set by some frameworks and server-side languages 666 | # (e.g.: ASP.NET, PHP), and its value contains information 667 | # about them (e.g.: their name, version number) 668 | # 669 | # * doesn't provide any value as far as users are concern, 670 | # and in some cases, the information provided by it can 671 | # be used by attackers 672 | # 673 | # (!) If you can, you should disable the `X-Powered-By` header from the 674 | # language / framework level (e.g.: for PHP, you can do that by setting 675 | # `expose_php = off` in `php.ini`) 676 | # 677 | # https://php.net/manual/en/ini.core.php#ini.expose-php 678 | 679 | 680 | Header unset X-Powered-By 681 | 682 | 683 | # ---------------------------------------------------------------------- 684 | # | Server software information | 685 | # ---------------------------------------------------------------------- 686 | 687 | # Prevent Apache from adding a trailing footer line containing 688 | # information about the server to the server-generated documents 689 | # (e.g.: error messages, directory listings, etc.) 690 | # 691 | # https://httpd.apache.org/docs/current/mod/core.html#serversignature 692 | 693 | ServerSignature Off 694 | 695 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 696 | 697 | # Prevent Apache from sending in the `Server` response header its 698 | # exact version number, the description of the generic OS-type or 699 | # information about its compiled-in modules. 700 | # 701 | # (!) The `ServerTokens` directive will only work in the main server 702 | # configuration file, so don't try to enable it in the `.htaccess` file! 703 | # 704 | # https://httpd.apache.org/docs/current/mod/core.html#servertokens 705 | 706 | #ServerTokens Prod 707 | 708 | 709 | # ###################################################################### 710 | # # WEB PERFORMANCE # 711 | # ###################################################################### 712 | 713 | # ---------------------------------------------------------------------- 714 | # | Compression | 715 | # ---------------------------------------------------------------------- 716 | 717 | 718 | 719 | # Force compression for mangled `Accept-Encoding` request headers 720 | # https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html 721 | 722 | 723 | 724 | SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding 725 | RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding 726 | 727 | 728 | 729 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 730 | 731 | # Compress all output labeled with one of the following media types. 732 | # 733 | # (!) For Apache versions below version 2.3.7 you don't need to 734 | # enable `mod_filter` and can remove the `` 735 | # and `` lines as `AddOutputFilterByType` is still in 736 | # the core directives. 737 | # 738 | # https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype 739 | 740 | 741 | AddOutputFilterByType DEFLATE "application/atom+xml" \ 742 | "application/javascript" \ 743 | "application/json" \ 744 | "application/ld+json" \ 745 | "application/manifest+json" \ 746 | "application/rdf+xml" \ 747 | "application/rss+xml" \ 748 | "application/schema+json" \ 749 | "application/vnd.geo+json" \ 750 | "application/vnd.ms-fontobject" \ 751 | "application/x-font-ttf" \ 752 | "application/x-javascript" \ 753 | "application/x-web-app-manifest+json" \ 754 | "application/xhtml+xml" \ 755 | "application/xml" \ 756 | "font/eot" \ 757 | "font/opentype" \ 758 | "image/bmp" \ 759 | "image/svg+xml" \ 760 | "image/vnd.microsoft.icon" \ 761 | "image/x-icon" \ 762 | "text/cache-manifest" \ 763 | "text/css" \ 764 | "text/html" \ 765 | "text/javascript" \ 766 | "text/plain" \ 767 | "text/vcard" \ 768 | "text/vnd.rim.location.xloc" \ 769 | "text/vtt" \ 770 | "text/x-component" \ 771 | "text/x-cross-domain-policy" \ 772 | "text/xml" 773 | 774 | 775 | 776 | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 777 | 778 | # Map the following filename extensions to the specified 779 | # encoding type in order to make Apache serve the file types 780 | # with the appropriate `Content-Encoding` response header 781 | # (do note that this will NOT make Apache compress them!). 782 | # 783 | # If these files types would be served without an appropriate 784 | # `Content-Enable` response header, client applications (e.g.: 785 | # browsers) wouldn't know that they first need to uncompress 786 | # the response, and thus, wouldn't be able to understand the 787 | # content. 788 | # 789 | # https://httpd.apache.org/docs/current/mod/mod_mime.html#addencoding 790 | 791 | 792 | AddEncoding gzip svgz 793 | 794 | 795 | 796 | 797 | # ---------------------------------------------------------------------- 798 | # | Content transformation | 799 | # ---------------------------------------------------------------------- 800 | 801 | # Prevent intermediate caches or proxies (e.g.: such as the ones 802 | # used by mobile network providers) from modifying the website's 803 | # content. 804 | # 805 | # https://tools.ietf.org/html/rfc2616#section-14.9.5 806 | # 807 | # (!) If you are using `mod_pagespeed`, please note that setting 808 | # the `Cache-Control: no-transform` response header will prevent 809 | # `PageSpeed` from rewriting `HTML` files, and, if the 810 | # `ModPagespeedDisableRewriteOnNoTransform` directive isn't set 811 | # to `off`, also from rewriting other resources. 812 | # 813 | # https://developers.google.com/speed/pagespeed/module/configuration#notransform 814 | 815 | # 816 | # Header merge Cache-Control "no-transform" 817 | # 818 | 819 | # ---------------------------------------------------------------------- 820 | # | ETags | 821 | # ---------------------------------------------------------------------- 822 | 823 | # Remove `ETags` as resources are sent with far-future expires headers. 824 | # 825 | # https://developer.yahoo.com/performance/rules.html#etags 826 | # https://tools.ietf.org/html/rfc7232#section-2.3 827 | 828 | # `FileETag None` doesn't work in all cases. 829 | 830 | Header unset ETag 831 | 832 | 833 | FileETag None 834 | 835 | # ---------------------------------------------------------------------- 836 | # | Expires headers | 837 | # ---------------------------------------------------------------------- 838 | 839 | # Serve resources with far-future expires headers. 840 | # 841 | # (!) If you don't control versioning with filename-based 842 | # cache busting, you should consider lowering the cache times 843 | # to something like one week. 844 | # 845 | # https://httpd.apache.org/docs/current/mod/mod_expires.html 846 | 847 | 848 | 849 | ExpiresActive on 850 | ExpiresDefault "access plus 1 month" 851 | 852 | # CSS 853 | 854 | ExpiresByType text/css "access plus 1 year" 855 | 856 | 857 | # Data interchange 858 | 859 | ExpiresByType application/atom+xml "access plus 1 hour" 860 | ExpiresByType application/rdf+xml "access plus 1 hour" 861 | ExpiresByType application/rss+xml "access plus 1 hour" 862 | 863 | ExpiresByType application/json "access plus 0 seconds" 864 | ExpiresByType application/ld+json "access plus 0 seconds" 865 | ExpiresByType application/schema+json "access plus 0 seconds" 866 | ExpiresByType application/vnd.geo+json "access plus 0 seconds" 867 | ExpiresByType application/xml "access plus 0 seconds" 868 | ExpiresByType text/xml "access plus 0 seconds" 869 | 870 | 871 | # Favicon (cannot be renamed!) and cursor images 872 | 873 | ExpiresByType image/vnd.microsoft.icon "access plus 1 week" 874 | ExpiresByType image/x-icon "access plus 1 week" 875 | 876 | # HTML 877 | 878 | ExpiresByType text/html "access plus 0 seconds" 879 | 880 | 881 | # JavaScript 882 | 883 | ExpiresByType application/javascript "access plus 1 year" 884 | ExpiresByType application/x-javascript "access plus 1 year" 885 | ExpiresByType text/javascript "access plus 1 year" 886 | 887 | 888 | # Manifest files 889 | 890 | ExpiresByType application/manifest+json "access plus 1 week" 891 | ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds" 892 | ExpiresByType text/cache-manifest "access plus 0 seconds" 893 | 894 | 895 | # Media files 896 | 897 | ExpiresByType audio/ogg "access plus 1 month" 898 | ExpiresByType image/bmp "access plus 1 month" 899 | ExpiresByType image/gif "access plus 1 month" 900 | ExpiresByType image/jpeg "access plus 1 month" 901 | ExpiresByType image/png "access plus 1 month" 902 | ExpiresByType image/svg+xml "access plus 1 month" 903 | ExpiresByType image/webp "access plus 1 month" 904 | ExpiresByType video/mp4 "access plus 1 month" 905 | ExpiresByType video/ogg "access plus 1 month" 906 | ExpiresByType video/webm "access plus 1 month" 907 | 908 | 909 | # Web fonts 910 | 911 | # Embedded OpenType (EOT) 912 | ExpiresByType application/vnd.ms-fontobject "access plus 1 month" 913 | ExpiresByType font/eot "access plus 1 month" 914 | 915 | # OpenType 916 | ExpiresByType font/opentype "access plus 1 month" 917 | 918 | # TrueType 919 | ExpiresByType application/x-font-ttf "access plus 1 month" 920 | 921 | # Web Open Font Format (WOFF) 1.0 922 | ExpiresByType application/font-woff "access plus 1 month" 923 | ExpiresByType application/x-font-woff "access plus 1 month" 924 | ExpiresByType font/woff "access plus 1 month" 925 | 926 | # Web Open Font Format (WOFF) 2.0 927 | ExpiresByType application/font-woff2 "access plus 1 month" 928 | 929 | 930 | # Other 931 | 932 | ExpiresByType text/x-cross-domain-policy "access plus 1 week" 933 | 934 | 935 | 936 | # ---------------------------------------------------------------------- 937 | # | File concatenation | 938 | # ---------------------------------------------------------------------- 939 | 940 | # Allow concatenation from within specific files. 941 | # 942 | # e.g.: 943 | # 944 | # If you have the following lines in a file called, for 945 | # example, `main.combined.js`: 946 | # 947 | # 948 | # 949 | # 950 | # Apache will replace those lines with the content of the 951 | # specified files. 952 | 953 | # 954 | # 955 | # Options +Includes 956 | # AddOutputFilterByType INCLUDES application/javascript \ 957 | # application/x-javascript \ 958 | # text/javascript 959 | # SetOutputFilter INCLUDES 960 | # 961 | # 962 | # Options +Includes 963 | # AddOutputFilterByType INCLUDES text/css 964 | # SetOutputFilter INCLUDES 965 | # 966 | # 967 | 968 | # ---------------------------------------------------------------------- 969 | # | Filename-based cache busting | 970 | # ---------------------------------------------------------------------- 971 | 972 | # If you're not using a build process to manage your filename version 973 | # revving, you might want to consider enabling the following directives 974 | # to route all requests such as `/style.12345.css` to `/style.css`. 975 | # 976 | # To understand why this is important and even a better solution than 977 | # using something like `*.css?v231`, please see: 978 | # http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/ 979 | 980 | # 981 | # RewriteEngine On 982 | # RewriteCond %{REQUEST_FILENAME} !-f 983 | # RewriteRule ^(.+)\.(\d+)\.(bmp|css|cur|gif|ico|jpe?g|js|png|svgz?|webp|webmanifest)$ $1.$3 [L] 984 | # 985 | -------------------------------------------------------------------------------- /.sass-lint.yml: -------------------------------------------------------------------------------- 1 | ############################# 2 | ## Sass Lint Configuration ## 3 | ############################# 4 | 5 | options: 6 | formatter: stylish 7 | files: 8 | include: '**/*.s+(a|c)ss' 9 | rules: 10 | # Extends 11 | extends-before-mixins: 1 12 | extends-before-declarations: 1 13 | placeholder-in-extend: 1 14 | 15 | # Mixins 16 | mixins-before-declarations: 17 | - 1 18 | - 19 | exclude: 'mq' 20 | 21 | # Line Spacing 22 | one-declaration-per-line: 1 23 | empty-line-between-blocks: 24 | - 1 25 | - 26 | include: false 27 | single-line-per-selector: 1 28 | 29 | # Disallows 30 | no-color-keywords: 1 31 | no-color-literals: 32 | - 1 33 | - 34 | allow-rgba: true 35 | no-css-comments: 1 36 | no-debug: 1 37 | no-duplicate-properties: 1 38 | no-empty-rulesets: 1 39 | no-extends: 0 40 | no-ids: 1 41 | no-important: 1 42 | no-invalid-hex: 1 43 | no-mergeable-selectors: 44 | - 1 45 | - 46 | - whitelist: [] 47 | no-misspelled-properties: 1 48 | no-qualifying-elements: 49 | - 1 50 | - 51 | - allow-element-with-attribute: true 52 | - allow-element-with-class: false 53 | - allow-element-with-id: false 54 | no-trailing-zero: 1 55 | no-transition-all: 1 56 | no-url-protocols: 1 57 | no-vendor-prefixes: 58 | - 1 59 | - 60 | - additional-identifiers: [] 61 | - excluded-identifiers: [] 62 | no-warn: 0 63 | 64 | # Nesting 65 | force-attribute-nesting: 1 66 | force-element-nesting: 1 67 | force-pseudo-nesting: 1 68 | 69 | # Name Formats 70 | function-name-format: 1 71 | mixin-name-format: 1 72 | placeholder-name-format: 1 73 | variable-name-format: 1 74 | 75 | # Style Guide 76 | border-zero: 77 | - 1 78 | - 79 | convention: 'none' # 0 80 | brace-style: 81 | - 1 82 | - 83 | - style: '1tbs' 84 | - allow-single-line: true 85 | clean-import-paths: 86 | - 1 87 | - 88 | - leading-underscore: false 89 | - filename-extension: false 90 | empty-args: 1 91 | hex-length: 92 | - 1 93 | - 94 | style: short # long 95 | hex-notation: 96 | - 1 97 | - 98 | style: lowercase # uppercase 99 | indentation: 100 | - 1 101 | - 102 | size: 2 103 | leading-zero: 1 104 | nesting-depth: 105 | - 2 106 | - 107 | max-depth: 3 108 | property-sort-order: 109 | - 1 110 | - 111 | order: 'alphabetical' # array of properties 112 | quotes: 113 | - 1 114 | - 115 | style: single # double 116 | shorthand-values: 117 | - 0 118 | - 119 | allowed-shorthands: [1, 2, 3] 120 | url-quotes: 1 121 | variable-for-property: 122 | - 1 123 | - 124 | properties: [] 125 | zero-unit: 126 | - 1 127 | - 128 | include: false 129 | 130 | # Inner Spacing 131 | space-after-comma: 1 132 | space-before-colon: 1 133 | space-after-colon: 1 134 | space-before-brace: 1 135 | space-before-bang: 1 136 | space-after-bang: 1 137 | space-between-parens: 1 138 | 139 | # Final Items 140 | trailing-semicolon: 1 141 | final-newline: 1 142 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # For more information about the configurations used 2 | # in this file, please see the Travis CI documentation: 3 | # http://docs.travis-ci.com 4 | 5 | after_success: 6 | - | 7 | 8 | # Automatically update the content from the `dist/` directory 9 | $(npm bin)/commit-changes --branch "master" \ 10 | --commands "npm run build" \ 11 | --commit-message "Update content from the \`dist\` directory [skip ci]" 12 | 13 | env: 14 | global: 15 | 16 | # The `secure` key contains three encrypted environment variables 17 | # (GH_TOKEN, GH_USER_EMAIL and GH_USER_NAME), the values of which 18 | # are used by the scripts that are automatically executed by Travis. 19 | # 20 | # Note: The `secure` key will only work for this repository, so if 21 | # you create your own fork, you will need to generate your own key: 22 | # 23 | # travis encrypt -r "/" \ 24 | # GH_TOKEN="" \ 25 | # GH_USER_EMAIL="" \ 26 | # GH_USER_NAME="" 27 | # 28 | # To learn more about how to generate the: 29 | # 30 | # * `secure` key, see: 31 | # http://docs.travis-ci.com/user/encryption-keys/ 32 | # 33 | # * GitHub access token, see: 34 | # https://help.github.com/articles/creating-an-access-token-for-command-line-use/ 35 | 36 | - secure: "OQnRHkXKdvSujTPm0DSXJFrso0zKltkso0e8zF/2GLI7ouv60ELHhYCrWFuoeefSJFbiPeH/9GXnTAv7y+gC08Ba/DSlXGaHl4db5xU/7AazzQR4YaTks6z0CfvlftdlimGOY27tuDU8hMfqHJKybJGcEvFKCVJms/7udYYh+CA=" 37 | 38 | git: 39 | depth: 10 40 | 41 | language: node_js 42 | 43 | node_js: 44 | - "0.12" 45 | - "4" 46 | 47 | sudo: false 48 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Mina Markham 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![forthebadge](http://forthebadge.com/images/badges/built-with-love.svg)](http://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/uses-css.svg)](http://forthebadge.com) [![forthebadge](http://forthebadge.com/images/badges/powered-by-netflix.svg)](http://forthebadge.com) 2 | 3 | # Sassy Starter [![Stories in Ready](https://badge.waffle.io/minamarkham/sassy-starter.png?label=ready&title=Ready)](https://waffle.io/minamarkham/sassy-starter) 4 | 5 | A starter toolkit based on [Scalable and Modular Architecture for CSS](http://smacss.com/) (SMACSS) and [Atomic Design](http://atomicdesign.bradfrost.com) for [Sass](http://sass-lang.com/) (SCSS) projects. Do what you'd like with it :) 6 | 7 | Styles are broken down into the following groups: **Base, Layout, Atoms, Molecules, Organisms, States, Themes, Utilities and Overrides** 8 | 9 | ## Getting Started 10 | 11 | 1. If needed, [install](http://blog.nodeknockout.com/post/65463770933/how-to-install-node-js-and-npm) `node` and `npm` (Node Package Manager). 12 | - If needed, install `gulp` with `npm install gulp -g`. 13 | - Clone this repo with `git clone https://github.com/minamarkham/sassy-starter` or download the zip. 14 | - In terminal, `cd` to the folder containing your project. Alternatively, you can type `cd ` and drag the location of the folder into your terminal and hit enter (on Macs). 15 | - In terminal, type `npm install`. If (and _only_ if) `npm install` isn't working, try `sudo npm install`. This should install all [dependencies](#dependencies). 16 | - In terminal, enter `gulp`. 17 | - Your browser should open at `http://localhost:3000`. You can access this same page on any device on the same wifi network and they'll see whats on your screen. It'll even sync scrolls and clicks! 18 | - Edit your code inside of the `src` folder. 19 | - Your complied and minified css, html, and javascript files will be created and updated in `dist/`. Never edit files within the `dist/` folder, as it gets deleted frequently. 20 | - Keep `gulp` running while you're making changes. When you want to stop the gulp task, hit `ctrl + C`. 21 | 22 | _For theming: add separate file (theme.scss) in`src/scss/themes/`, override the default `$theme` variable, and run `gulp themes`._ 23 | 24 | ## Requirements 25 | - Node/NPM 26 | - LibSass 27 | - Gulp 28 | 29 | ## Features 30 | - Live reloading with BrowserSync 31 | - Image Minification 32 | - Github Pages deployment 33 | - Sass linting (based on [default](https://github.com/sasstools/sass-lint/blob/master/lib/config/sass-lint.yml) config) 34 | - Autoprefixer configuration 35 | - SMACSS and Atomic Design-based folder structure 36 | - `px` to `em`, `px` to `rem` and other useful functions. 37 | - Mixins for inlining media queries. 38 | * Useful CSS helper classes. 39 | * Default print styles, performance optimized. 40 | * "Delete-key friendly." Easy to strip out parts you don't need. 41 | - Includes: 42 | - [`Normalize.css`](https://necolas.github.com/normalize.css/) 43 | for CSS normalizations and common bug fixes 44 | - [`CSS Pesticide`](https://pesticide.io) 45 | for easy CSS debugging 46 | - [`jQuery`](https://jquery.com/) via CDN, with a local fallback 47 | - [`Modernizr`](http://modernizr.com/), via CDN, for feature 48 | detection 49 | - [`Apache Server Configs`](https://github.com/h5bp/server-configs-apache) 50 | that, among other, improve the web site's performance and security 51 | 52 | ## Dependencies 53 | ``` 54 | "browser-sync": "^2.0.0-rc4", 55 | "colors": "^1.1.2", 56 | "del": "^2.0.2", 57 | "gulp-autoprefixer": "^2.1.0", 58 | "gulp-concat": "^2.4.3", 59 | "gulp-gh-pages": "^0.4.0", 60 | "gulp-imagemin": "^2.1.0", 61 | "gulp-jshint": "^1.9.0", 62 | "gulp-minify-css": "^0.3.12", 63 | "gulp-minify-html": "^0.1.8", 64 | "gulp-notify": "^2.2.0", 65 | "gulp-plumber": "^0.6.6", 66 | "gulp-rename": "^1.2.0", 67 | "gulp-sass": "^1.3.2", 68 | "gulp-sass-lint": "1.0.1", 69 | "gulp-size": "^1.2.0", 70 | "gulp-sourcemaps": "^1.5.2", 71 | "gulp-uglify": "^1.0.2", 72 | "imagemin-pngquant": "^4.0.0", 73 | "sassdoc": "^2.1.15", 74 | "vinyl-paths": "^2.0.0" 75 | ``` 76 | 77 | ## Tasks 78 | - clean:dist 79 | - styles 80 | - browser-sync 81 | - deploy 82 | - js-app 83 | - js-libs 84 | - sass-lint 85 | - minify-html 86 | - watch 87 | - imagemin 88 | - stats 89 | - sassdoc 90 | - themes 91 | - default 92 | - clean:dist 93 | - browser-sync 94 | - js-app 95 | - js-libs 96 | - imgmin 97 | - minify-html 98 | - styles 99 | - watch 100 | - build 101 | - clean:dist 102 | - js-app 103 | - js-libs 104 | - imgmin 105 | - minify-html 106 | - styles 107 | - copy 108 | - audit 109 | - sass-lint 110 | - stats 111 | 112 | ## Directory structure 113 | 114 | ``` 115 | ┌── .gitignore 116 | ├── .htaccess 117 | ├── .sass-lint.yml 118 | ├── .travis.yml 119 | ├── src 120 | │   ├── browserconfig.xml 121 | │   ├── crossdomain.xml 122 | │   ├── humans.txt 123 | │   ├── icons 124 | │   │   ├── apple-touch-icon-114x114-precomposed.png 125 | │   │   ├── apple-touch-icon-57x57-precomposed.png 126 | │   │   ├── apple-touch-icon-72x72-precomposed.png 127 | │   │   ├── apple-touch-icon-precomposed.png 128 | │   │   ├── apple-touch-icon.png 129 | │   │   ├── favicon.ico 130 | │   │   └── favicon.png 131 | │   ├── img 132 | │   ├── index.html 133 | │   ├── js 134 | │   ├── robots.txt 135 | │   └── scss 136 | │   ├── atoms 137 | │   │   └── _index.scss 138 | │   ├── base 139 | │   │   ├── _base.scss 140 | │   │   └── _index.scss 141 | │   ├── layout 142 | │   │   └── _index.scss 143 | │   ├── libs 144 | │   │   ├── _index.scss 145 | │   │   ├── _normalize.scss 146 | │   │   └── _pesticide.scss 147 | │   ├── molecules 148 | │   │   └── _index.scss 149 | │   ├── organisms 150 | │   │   └── _index.scss 151 | │   ├── overrides 152 | │   │   └── _index.scss 153 | │   ├── states 154 | │   │   ├── _index.scss 155 | │   │   └── _print.scss 156 | │   ├── themes 157 | │   │   └── rebeccapurple.scss 158 | │   ├── utilities 159 | │   │   ├── _colors.scss 160 | │   │   ├── _config.scss 161 | │   │   ├── _fonts.scss 162 | │   │   ├── _functions.scss 163 | │   │   ├── _index.scss 164 | │   │   ├── _mixins.scss 165 | │   │ └── _typography.scss 166 | │   ├── styles.scss 167 | │   └── _shame.scss 168 | ├── gulpfile.js 169 | └── package.json 170 | ``` 171 | 172 | ## Bugs & Support 173 | Developed by [@MinaMarkham](http://twitter.com/MinaMarkham). Please list all bugs and feature requests in the Github issue tracker. 174 | 175 | ## Thanks & Resources 176 | 177 | This toolkit is based on the work of the following fine people & projects. 178 | 179 | - [HTML5 Boilerplate](https://github.com/h5bp/html5-boilerplate) 180 | - [Scalable and Modular Architecture for CSS](http://smacss.com/book) (SMACSS) 181 | - [Atomic Design](http://atomicdesign.bradfrost.com) 182 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'), 2 | sass = require('gulp-sass'), 3 | rename = require('gulp-rename'), 4 | cleanCSS = require('gulp-clean-css'), 5 | concat = require('gulp-concat'), 6 | uglify = require('gulp-uglify'), 7 | jshint = require('gulp-jshint'), 8 | prefix = require('gulp-autoprefixer'), 9 | browserSync = require('browser-sync'), 10 | reload = browserSync.reload, 11 | htmlmin = require('gulp-htmlmin'), 12 | size = require('gulp-size'), 13 | imagemin = require('gulp-imagemin'), 14 | pngquant = require('imagemin-pngquant'), 15 | plumber = require('gulp-plumber'), 16 | deploy = require('gulp-gh-pages'), 17 | notify = require('gulp-notify'), 18 | sassLint = require('gulp-sass-lint'), 19 | del = require('del'), 20 | vinylPaths = require('vinyl-paths'), 21 | sourcemaps = require('gulp-sourcemaps'), 22 | colors = require('colors'), 23 | sassdoc = require('sassdoc'), 24 | // Temporary solution until gulp 4 25 | // https://github.com/gulpjs/gulp/issues/355 26 | runSequence = require('run-sequence'); 27 | 28 | var bases = { 29 | app: 'src/', 30 | dist: 'dist/', 31 | }; 32 | 33 | colors.setTheme({ 34 | silly: 'rainbow', 35 | input: 'grey', 36 | verbose: 'cyan', 37 | prompt: 'grey', 38 | info: 'green', 39 | data: 'grey', 40 | help: 'cyan', 41 | warn: 'yellow', 42 | debug: 'blue', 43 | error: 'red' 44 | }); 45 | 46 | var displayError = function(error) { 47 | // Initial building up of the error 48 | var errorString = '[' + error.plugin.error.bold + ']'; 49 | errorString += ' ' + error.message.replace("\n",''); // Removes new line at the end 50 | 51 | // If the error contains the filename or line number add it to the string 52 | if(error.fileName) 53 | errorString += ' in ' + error.fileName; 54 | 55 | if(error.lineNumber) 56 | errorString += ' on line ' + error.lineNumber.bold; 57 | 58 | // This will output an error like the following: 59 | // [gulp-sass] error message in file_name on line 1 60 | console.error(errorString); 61 | } 62 | 63 | var onError = function(err) { 64 | notify.onError({ 65 | title: "Gulp", 66 | subtitle: "Failure!", 67 | message: "Error: <%= error.message %>", 68 | sound: "Basso" 69 | })(err); 70 | this.emit('end'); 71 | }; 72 | 73 | var sassOptions = { 74 | outputStyle: 'expanded' 75 | }; 76 | 77 | var prefixerOptions = { 78 | browsers: ['last 2 versions'] 79 | }; 80 | 81 | // BUILD SUBTASKS 82 | // --------------- 83 | 84 | gulp.task('clean:dist', function() { 85 | return gulp.src(bases.dist) 86 | .pipe(vinylPaths(del)); 87 | }); 88 | 89 | 90 | gulp.task('styles', function() { 91 | return gulp.src(bases.app + 'scss/styles.scss') 92 | .pipe(plumber({errorHandler: onError})) 93 | .pipe(sourcemaps.init()) 94 | .pipe(sass(sassOptions)) 95 | .pipe(size({ gzip: true, showFiles: true })) 96 | .pipe(prefix(prefixerOptions)) 97 | .pipe(rename('styles.css')) 98 | .pipe(gulp.dest(bases.dist + 'css')) 99 | .pipe(reload({stream:true})) 100 | .pipe(cleanCSS({debug: true}, function(details) { 101 | console.log(details.name + ': ' + details.stats.originalSize); 102 | console.log(details.name + ': ' + details.stats.minifiedSize); 103 | })) 104 | .pipe(size({ gzip: true, showFiles: true })) 105 | .pipe(rename({ suffix: '.min' })) 106 | .pipe(gulp.dest(bases.dist + 'css')) 107 | }); 108 | 109 | gulp.task('themes', function() { 110 | return gulp.src(bases.app + 'scss/themes/*.scss') 111 | .pipe(plumber({errorHandler: onError})) 112 | .pipe(sourcemaps.init()) 113 | .pipe(sass(sassOptions)) 114 | .pipe(size({ gzip: true, showFiles: true })) 115 | .pipe(prefix(prefixerOptions)) 116 | .pipe(gulp.dest(bases.dist + 'css/themes')) 117 | .pipe(reload({stream:true})) 118 | .pipe(cleanCSS({debug: true}, function(details) { 119 | console.log(details.name + ': ' + details.stats.originalSize); 120 | console.log(details.name + ': ' + details.stats.minifiedSize); 121 | })) 122 | .pipe(size({ gzip: true, showFiles: true })) 123 | .pipe(rename({ suffix: '.min' })) 124 | .pipe(gulp.dest(bases.dist + 'css/themes')) 125 | }); 126 | 127 | gulp.task('browser-sync', function() { 128 | browserSync({ 129 | server: { 130 | baseDir: bases.dist 131 | } 132 | }); 133 | }); 134 | 135 | gulp.task('deploy', function() { 136 | return gulp.src(bases.dist) 137 | .pipe(deploy()); 138 | }); 139 | 140 | gulp.task('js-app', function() { 141 | gulp.src(bases.app + 'js/*.js') 142 | .pipe(uglify()) 143 | .pipe(size({ gzip: true, showFiles: true })) 144 | .pipe(concat('app.js')) 145 | .pipe(gulp.dest(bases.dist + 'js')) 146 | .pipe(reload({stream:true})); 147 | }); 148 | 149 | gulp.task('js-libs', function() { 150 | gulp.src([bases.app + 'js/libs/*.js', '!' + bases.app + 'js/libs/modernizr.js']) 151 | .pipe(uglify()) 152 | .pipe(size({ gzip: true, showFiles: true })) 153 | .pipe(concat('libs.js')) 154 | .pipe(gulp.dest(bases.dist + 'js')) 155 | .pipe(reload({stream:true})); 156 | }); 157 | 158 | 159 | gulp.task('copy', function() { 160 | 161 | // copy modernizr to dist directly 162 | gulp.src(bases.app + 'js/libs/modernizr.js') 163 | .pipe(size({ gzip: true, showFiles: true })) 164 | .pipe(gulp.dest(bases.dist + 'js/libs')) 165 | .pipe(reload({stream:true})); 166 | 167 | // copy icons to dist directly 168 | gulp.src(bases.app + 'icons/**/*.*') 169 | .pipe(size({ gzip: true, showFiles: true })) 170 | .pipe(gulp.dest(bases.dist)) 171 | .pipe(reload({stream:true})); 172 | 173 | // copy meta files to dist directly 174 | gulp.src([bases.app + '*.xml', bases.app + '*.txt']) 175 | .pipe(size({ gzip: true, showFiles: true })) 176 | .pipe(gulp.dest(bases.dist)) 177 | .pipe(reload({stream:true})); 178 | 179 | }); 180 | 181 | gulp.task('sass-lint', function() { 182 | gulp.src([bases.app + 'scss/**/*.scss', '!' + bases.app + 'scss/libs/**/*.scss', '!' + bases.app + 'scss/states/_print.scss']) 183 | .pipe(sassLint()) 184 | .pipe(sassLint.format()) 185 | .pipe(sassLint.failOnError()); 186 | }); 187 | 188 | gulp.task('minify-html', function() { 189 | gulp.src(bases.app + './*.html') 190 | .pipe(htmlmin({collapseWhitespace: true})) 191 | .pipe(gulp.dest(bases.dist)) 192 | .pipe(reload({stream:true})); 193 | }); 194 | 195 | gulp.task('watch', function() { 196 | gulp.watch(bases.app + 'scss/**/*.scss', ['styles']); 197 | gulp.watch(bases.app + './*.html', ['minify-html']); 198 | gulp.watch(bases.app + 'img/*', ['imagemin']); 199 | }); 200 | 201 | gulp.task('imagemin', function() { 202 | return gulp.src(bases.app + 'img/*') 203 | .pipe(imagemin({ 204 | progressive: true, 205 | svgoPlugins: [{removeViewBox: false}], 206 | use: [pngquant()] 207 | })) 208 | .pipe(gulp.dest(bases.dist + 'img')); 209 | }); 210 | 211 | gulp.task('sassdoc', function () { 212 | var options = { 213 | dest: 'docs', 214 | verbose: true, 215 | display: { 216 | access: ['public', 'private'], 217 | alias: true, 218 | watermark: true, 219 | }, 220 | groups: { 221 | 'undefined': 'Ungrouped', 222 | }, 223 | basePath: 'https://github.com/SassDoc/sassdoc', 224 | }; 225 | return gulp.src(bases.app + 'scss/**/*.scss') 226 | .pipe(sassdoc(options)); 227 | }); 228 | 229 | // BUILD TASKS 230 | // ------------ 231 | 232 | gulp.task('default', function(done) { 233 | runSequence('clean:dist', 'browser-sync', 'js-app', 'js-libs', 'imagemin', 'minify-html', 'styles', 'themes', 'copy', 'watch', done); 234 | }); 235 | 236 | gulp.task('build', function(done) { 237 | runSequence('clean:dist', 'js-app', 'js-libs', 'imagemin', 'minify-html', 'styles', 'copy', done); 238 | }); 239 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sassy-starter", 3 | "title": "Sassy Starter", 4 | "description": "A starter toolkit based on Scalable and Modular Architecture for CSS (SMACSS) for Sass (SCSS) projects", 5 | "author": { 6 | "name": "Mina Markham", 7 | "url": "https://github.com/minamarkham" 8 | }, 9 | "version": "2.1.0", 10 | "license": "MIT", 11 | "repository": { 12 | "type": "git", 13 | "url": "git://github.com/minamarkham/sassy-starter.git" 14 | }, 15 | "homepage": "https://minamarkham.github.io/sassy-starter/", 16 | "keywords": [ 17 | "sass", 18 | "scss", 19 | "doc", 20 | "boilerplate", 21 | "starter", 22 | "gulp", 23 | "smacss" 24 | ], 25 | "bugs": { 26 | "url": "https://github.com/minamarkham/sassy-starter/issues" 27 | }, 28 | "dependencies": {}, 29 | "devDependencies": { 30 | "browser-sync": "^2.0.0-rc4", 31 | "colors": "^1.1.2", 32 | "del": "^2.0.2", 33 | "gulp": "^3.9.0", 34 | "gulp-autoprefixer": "^2.1.0", 35 | "gulp-clean-css": "^2.0.7", 36 | "gulp-concat": "^2.4.3", 37 | "gulp-gh-pages": "^0.4.0", 38 | "gulp-htmlmin": "^2.0.0", 39 | "gulp-imagemin": "^2.1.0", 40 | "gulp-jshint": "^1.9.0", 41 | "gulp-notify": "^2.2.0", 42 | "gulp-plumber": "^0.6.6", 43 | "gulp-rename": "^1.2.0", 44 | "gulp-sass": "^2.3.1", 45 | "gulp-sass-lint": "1.0.1", 46 | "gulp-size": "^1.2.0", 47 | "gulp-sourcemaps": "^1.5.2", 48 | "gulp-uglify": "^1.0.2", 49 | "imagemin-pngquant": "^4.0.0", 50 | "run-sequence": "^1.1.4", 51 | "sassdoc": "^2.1.15", 52 | "vinyl-paths": "^2.0.0" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /sache.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Sassy Starter", 3 | "description": "A starter toolkit based on Scalable and Modular Architecture for CSS (SMACSS) for Sass (SCSS) projects. Do what you'd like with it :)", 4 | "tags": ["sass", "starter kit", "boilerplate", "mixin library", "gulp", "smacss"] 5 | } 6 | -------------------------------------------------------------------------------- /src/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/crossdomain.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /src/humans.txt: -------------------------------------------------------------------------------- 1 | # humanstxt.org/ 2 | # The humans responsible & technology colophon 3 | 4 | # TEAM 5 | 6 | -- -- 7 | 8 | # THANKS 9 | 10 | 11 | 12 | # TECHNOLOGY COLOPHON 13 | 14 | CSS3, HTML5 15 | Apache Server Configs, jQuery, Modernizr, Normalize.css 16 | -------------------------------------------------------------------------------- /src/icons/apple-touch-icon-114x114-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minamarkham/sassy-starter/75502a54947542c7b4094a07798bc1f7de709cd7/src/icons/apple-touch-icon-114x114-precomposed.png -------------------------------------------------------------------------------- /src/icons/apple-touch-icon-57x57-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minamarkham/sassy-starter/75502a54947542c7b4094a07798bc1f7de709cd7/src/icons/apple-touch-icon-57x57-precomposed.png -------------------------------------------------------------------------------- /src/icons/apple-touch-icon-72x72-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minamarkham/sassy-starter/75502a54947542c7b4094a07798bc1f7de709cd7/src/icons/apple-touch-icon-72x72-precomposed.png -------------------------------------------------------------------------------- /src/icons/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minamarkham/sassy-starter/75502a54947542c7b4094a07798bc1f7de709cd7/src/icons/apple-touch-icon-precomposed.png -------------------------------------------------------------------------------- /src/icons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minamarkham/sassy-starter/75502a54947542c7b4094a07798bc1f7de709cd7/src/icons/apple-touch-icon.png -------------------------------------------------------------------------------- /src/icons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minamarkham/sassy-starter/75502a54947542c7b4094a07798bc1f7de709cd7/src/icons/favicon.ico -------------------------------------------------------------------------------- /src/icons/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minamarkham/sassy-starter/75502a54947542c7b4094a07798bc1f7de709cd7/src/icons/favicon.png -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | Sassy Starter 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |

Hello, Gorgeous!

60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /src/js/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minamarkham/sassy-starter/75502a54947542c7b4094a07798bc1f7de709cd7/src/js/.gitkeep -------------------------------------------------------------------------------- /src/robots.txt: -------------------------------------------------------------------------------- 1 | # www.robotstxt.org/ 2 | 3 | # Allow crawling of all content 4 | User-agent: * 5 | Disallow: 6 | -------------------------------------------------------------------------------- /src/scss/_shame.scss: -------------------------------------------------------------------------------- 1 | // ========================================================================== 2 | // $Shame 3 | // @see http://csswizardry.com/2013/04/shame-css/ 4 | // Thanks https://github.com/heroheman/shepherd/blob/master/sass/_shame.scss 5 | // ========================================================================== 6 | 7 | // ========================================================================== 8 | // because hacks happen. 9 | // 10 | // be very specific about what each piece of code is doing, and 11 | // how to better fix it later 12 | // ========================================================================== 13 | 14 | // Try: $ git blame _shame.scss 15 | 16 | // Rules: 17 | // --------------- 18 | // 1. If it’s a hack, it goes in _shame.scss. 19 | // 2. Document all hacks fully: 20 | // 3. What part of the codebase does it relate to? 21 | // 4. Why was this needed? 22 | // 5. How does this fix it? 23 | // 6. How might you fix it properly, given more time? 24 | // 7. Do not blame the developer; if they explained why they had to do it then their reasons are probably (hopefully) valid. 25 | // 8. Try and clean _shame.scss up when you have some down time. 26 | 27 | // Example: 28 | // --------------- 29 | // Nav specificity fix. 30 | 31 | // Someone used an ID in the header code (`#header a{}`) which trumps the 32 | // nav selectors (`.site-nav a{}`). Use !important to override it until I 33 | // have time to refactor the header stuff. 34 | 35 | // .site-nav a { color:#BADA55!important; } 36 | -------------------------------------------------------------------------------- /src/scss/atoms/_index.scss: -------------------------------------------------------------------------------- 1 | // Atoms 2 | // 3 | // If atoms are the basic building blocks of matter, then the atoms of 4 | // our interfaces serve as the foundational building blocks that 5 | // comprise all our user interfaces. Therefore these atoms would include 6 | // basic HTML tags like form labels, inputs, buttons, and other elements 7 | // that can’t be broken down any further without ceasing to be functional. 8 | // 9 | // @source - http://atomicdesign.bradfrost.com/chapter-2/ 10 | -------------------------------------------------------------------------------- /src/scss/base/_base.scss: -------------------------------------------------------------------------------- 1 | @viewport { width: device-width; } 2 | 3 | html { 4 | background-color: $color-background; 5 | box-sizing: border-box; 6 | height: 100%; 7 | } 8 | 9 | * { 10 | &:before, 11 | &:after { box-sizing: inherit; } 12 | } 13 | 14 | body { 15 | -webkit-font-smoothing: antialiased; 16 | color: $color-text; 17 | font-family: $font-family-default; 18 | min-height: 100%; 19 | overflow-x: hidden; 20 | text-rendering: optimizeLegibility; 21 | } 22 | 23 | a { 24 | background: transparent; 25 | color: $color-link; 26 | text-decoration: none; 27 | transition: color .2s; 28 | } 29 | 30 | img { 31 | height: auto; 32 | max-width: 100%; 33 | } 34 | 35 | h1, 36 | h2, 37 | h3, 38 | h4, 39 | h5, 40 | h6 { 41 | font-family: $font-family-display; 42 | font-weight: normal; 43 | } 44 | -------------------------------------------------------------------------------- /src/scss/base/_index.scss: -------------------------------------------------------------------------------- 1 | // @source http://smacss.com/book/type-base 2 | // 3 | // Base Rules 4 | // 5 | // A Base rule is applied to an element using an element selector, a 6 | // descendent selector, or a child selector, along with any pseudo-classes. 7 | // It doesn’t include any class or ID selectors. It is defining the default 8 | // styling for how that element should look in all occurrences on the page. 9 | 10 | // ========================================================================== 11 | // $Base 12 | // ========================================================================== 13 | @import 'base'; 14 | -------------------------------------------------------------------------------- /src/scss/layout/_index.scss: -------------------------------------------------------------------------------- 1 | // @source http://smacss.com/book/type-layout 2 | // 3 | // Layout Rules 4 | // 5 | // Layout styles can also be divided into major and minor styles based on 6 | // reuse. Major layout styles such as header and footer are traditionally 7 | // styled using ID selectors but take the time to think about the elements 8 | // that are common across all components of the page and use class selectors 9 | // where appropriate. 10 | -------------------------------------------------------------------------------- /src/scss/libs/_index.scss: -------------------------------------------------------------------------------- 1 | // ========================================================================== 2 | // Third-Party Styles 3 | // ========================================================================== 4 | 5 | // Convert vendor styles to SCSS (basically just change the extension 6 | // to ".scss" and add "_" to the beginning) and import them here. 7 | 8 | // ========================================================================== 9 | // $CSS Pesticide 10 | // ========================================================================== 11 | // Can always be included as it only renders css if the 12 | // variable $pesticide-debug is set to "true" 13 | 14 | @import 'pesticide'; 15 | 16 | // ========================================================================== 17 | // $Normalize 18 | // ========================================================================== 19 | 20 | @import 'normalize'; 21 | -------------------------------------------------------------------------------- /src/scss/libs/_normalize.scss: -------------------------------------------------------------------------------- 1 | // ============================================================================= 2 | // Normalize.scss based on Nicolas Gallagher and Jonathan Neal's 3 | // normalize.css v2.1.3 | MIT License | git.io/normalize 4 | // ============================================================================= 5 | 6 | // ============================================================================= 7 | // Normalize.scss settings 8 | // ============================================================================= 9 | 10 | 11 | // Set to true if you want to add support for IE6 and IE7 12 | // Notice: setting to true might render some elements 13 | // slightly differently than when set to false 14 | $legacy_support_for_ie: false !default; // Used also in Compass 15 | 16 | 17 | // Set the default font family here so you don't have to override it later 18 | $normalized_font_family: sans-serif !default; 19 | 20 | $normalize_headings: true !default; 21 | 22 | $h1_font_size: 2em !default; 23 | $h2_font_size: 1.5em !default; 24 | $h3_font_size: 1.17em !default; 25 | $h4_font_size: 1em !default; 26 | $h5_font_size: 0.83em !default; 27 | $h6_font_size: 0.75em !default; 28 | 29 | $h1_margin: 0.67em 0 !default; 30 | $h2_margin: 0.83em 0 !default; 31 | $h3_margin: 1em 0 !default; 32 | $h4_margin: 1.33em 0 !default; 33 | $h5_margin: 1.67em 0 !default; 34 | $h6_margin: 2.33em 0 !default; 35 | 36 | $background: #fff !default; 37 | $color: #000 !default; 38 | 39 | // ============================================================================= 40 | // HTML5 display definitions 41 | // ============================================================================= 42 | 43 | // Corrects block display not defined in IE6/7/8/9 & FF3 44 | 45 | article, 46 | aside, 47 | details, 48 | figcaption, 49 | figure, 50 | footer, 51 | header, 52 | hgroup, 53 | nav, 54 | section, 55 | summary { 56 | display: block; 57 | } 58 | 59 | // Corrects inline-block display not defined in IE6/7/8/9 & FF3 60 | 61 | audio, 62 | canvas, 63 | video { 64 | display: inline-block; 65 | @if $legacy_support_for_ie { 66 | *display: inline; 67 | *zoom: 1; 68 | } 69 | } 70 | 71 | // 1. Prevents modern browsers from displaying 'audio' without controls 72 | // 2. Remove excess height in iOS5 devices 73 | 74 | audio:not([controls]) { 75 | display: none; // 1 76 | height: 0; // 2 77 | } 78 | 79 | // 80 | // Address `[hidden]` styling not present in IE 8/9. 81 | // Hide the `template` element in IE, Safari, and Firefox < 22. 82 | // 83 | 84 | [hidden], template { 85 | display: none; 86 | } 87 | 88 | // ============================================================================= 89 | // Base 90 | // ============================================================================= 91 | 92 | // 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units 93 | // http://clagnut.com/blog/348/#c790 94 | // 2. Prevents iOS text size adjust after orientation change, without disabling user zoom 95 | // www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/ 96 | 97 | html { 98 | @if $legacy_support_for_ie { 99 | font-size: 100%; // 1 100 | } 101 | background: $background; 102 | color: $color; 103 | -webkit-text-size-adjust: 100%; // 2 104 | -ms-text-size-adjust: 100%; // 2 105 | } 106 | 107 | // Addresses font-family inconsistency between 'textarea' and other form elements. 108 | 109 | html, 110 | button, 111 | input, 112 | select, 113 | textarea { 114 | font-family: $normalized_font_family; 115 | } 116 | 117 | // Addresses margins handled incorrectly in IE6/7 118 | 119 | body { 120 | margin: 0; 121 | } 122 | 123 | // ============================================================================= 124 | // Links 125 | // ============================================================================= 126 | 127 | // 1. Remove the gray background color from active links in IE 10. 128 | // 2. Addresses outline displayed oddly in Chrome 129 | // 3. Improves readability when focused and also mouse hovered in all browsers 130 | // people.opera.com/patrickl/experiments/keyboard/test 131 | 132 | a { 133 | // 1 134 | 135 | background: transparent; 136 | 137 | // 2 138 | 139 | &:focus { 140 | outline: thin dotted; 141 | } 142 | 143 | // 3 144 | 145 | &:hover, 146 | &:active { 147 | outline: 0; 148 | } 149 | } 150 | 151 | // ============================================================================= 152 | // Typography 153 | // ============================================================================= 154 | 155 | // Addresses font sizes and margins set differently in IE6/7 156 | // Addresses font sizes within 'section' and 'article' in FF4+, Chrome, S5 157 | 158 | @if $normalize_headings == true { 159 | h1 { 160 | font-size: $h1_font_size; 161 | margin: $h1_margin; 162 | } 163 | 164 | h2 { 165 | font-size: $h2_font_size; 166 | margin: $h2_margin; 167 | } 168 | 169 | h3 { 170 | font-size: $h3_font_size; 171 | margin: $h3_margin; 172 | } 173 | 174 | h4 { 175 | font-size: $h4_font_size; 176 | margin: $h4_margin; 177 | } 178 | 179 | h5 { 180 | font-size: $h5_font_size; 181 | margin: $h5_margin; 182 | } 183 | 184 | h6 { 185 | font-size: $h6_font_size; 186 | margin: $h6_margin; 187 | } 188 | } 189 | 190 | @if $legacy_support_for_ie { 191 | blockquote { 192 | margin: 1em 40px; 193 | } 194 | } 195 | 196 | // Addresses styling not present in S5, Chrome 197 | 198 | dfn { 199 | font-style: italic; 200 | } 201 | 202 | // Addresses styling not present in IE6/7/8/9 203 | 204 | mark { 205 | background: #ff0; 206 | color: #000; 207 | } 208 | 209 | // Addresses margins set differently in IE6/7 210 | @if $legacy_support_for_ie { 211 | p, 212 | pre { 213 | margin: 1em 0; 214 | } 215 | } 216 | 217 | // Corrects font family set oddly in IE6, S4/5, Chrome 218 | // en.wikipedia.org/wiki/User:Davidgothberg/Test59 219 | 220 | code, 221 | kbd, 222 | pre, 223 | samp { 224 | font-family: monospace, serif; 225 | @if $legacy_support_for_ie { 226 | _font-family: 'courier new', monospace; 227 | } 228 | font-size: 1em; 229 | } 230 | 231 | // Improves readability of pre-formatted text in all browsers 232 | 233 | pre { 234 | white-space: pre; 235 | white-space: pre-wrap; 236 | word-wrap: break-word; 237 | } 238 | 239 | // Set consistent quote types. 240 | 241 | q { 242 | quotes: "\201C" "\201D" "\2018" "\2019"; 243 | } 244 | 245 | // 1. Addresses CSS quotes not supported in IE6/7 246 | // 2. Addresses quote property not supported in S4 247 | 248 | // 1 249 | @if $legacy_support_for_ie { 250 | q { 251 | quotes: none; 252 | } 253 | } 254 | 255 | // 2 256 | q { 257 | &:before, 258 | &:after { 259 | content: ''; 260 | content: none; 261 | } 262 | } 263 | 264 | // Address inconsistent and variable font size in all browsers. 265 | 266 | small { 267 | font-size: 80%; 268 | } 269 | 270 | // Prevents sub and sup affecting line-height in all browsers 271 | // gist.github.com/413930 272 | 273 | sub, 274 | sup { 275 | font-size: 75%; 276 | line-height: 0; 277 | position: relative; 278 | vertical-align: baseline; 279 | } 280 | 281 | sup { 282 | top: -0.5em; 283 | } 284 | 285 | sub { 286 | bottom: -0.25em; 287 | } 288 | 289 | // ============================================================================= 290 | // Lists 291 | // ============================================================================= 292 | 293 | // Addresses margins set differently in IE6/7 294 | @if $legacy_support_for_ie { 295 | dl, 296 | menu, 297 | ol, 298 | ul { 299 | margin: 1em 0; 300 | } 301 | } 302 | 303 | @if $legacy_support_for_ie { 304 | dd { 305 | margin: 0 0 0 40px; 306 | } 307 | } 308 | 309 | // Addresses paddings set differently in IE6/7 310 | @if $legacy_support_for_ie { 311 | menu, 312 | ol, 313 | ul { 314 | padding: 0 0 0 40px; 315 | } 316 | } 317 | 318 | // Corrects list images handled incorrectly in IE7 319 | 320 | nav { 321 | ul, 322 | ol { 323 | @if $legacy_support_for_ie { 324 | list-style-image: none; 325 | } 326 | } 327 | } 328 | 329 | // ============================================================================= 330 | // Embedded content 331 | // ============================================================================= 332 | 333 | // 1. Removes border when inside 'a' element in IE6/7/8/9, FF3 334 | // 2. Improves image quality when scaled in IE7 335 | // code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/ 336 | 337 | img { 338 | border: 0; // 1 339 | @if $legacy_support_for_ie { 340 | -ms-interpolation-mode: bicubic; // 2 341 | } 342 | } 343 | 344 | // Corrects overflow displayed oddly in IE9 345 | 346 | svg:not(:root) { 347 | overflow: hidden; 348 | } 349 | 350 | // ============================================================================= 351 | // Figures 352 | // ============================================================================= 353 | 354 | // Addresses margin not present in IE6/7/8/9, S5, O11 355 | 356 | figure { 357 | margin: 0; 358 | } 359 | 360 | // ============================================================================= 361 | // Forms 362 | // ============================================================================= 363 | 364 | // Corrects margin displayed oddly in IE6/7 365 | @if $legacy_support_for_ie { 366 | form { 367 | margin: 0; 368 | } 369 | } 370 | 371 | // Define consistent border, margin, and padding 372 | 373 | fieldset { 374 | border: 1px solid #c0c0c0; 375 | margin: 0 2px; 376 | padding: 0.35em 0.625em 0.75em; 377 | } 378 | 379 | // 1. Corrects color not being inherited in IE6/7/8/9 380 | // 2. Remove padding so people aren't caught out if they zero out fieldsets. 381 | // 3. Corrects text not wrapping in FF3 382 | // 4. Corrects alignment displayed oddly in IE6/7 383 | 384 | legend { 385 | border: 0; // 1 386 | padding: 0; // 2 387 | white-space: normal; // 3 388 | @if $legacy_support_for_ie { 389 | *margin-left: -7px; // 4 390 | } 391 | } 392 | 393 | // 1. Correct font family not being inherited in all browsers. 394 | // 2. Corrects font size not being inherited in all browsers 395 | // 3. Addresses margins set differently in IE6/7, FF3+, S5, Chrome 396 | // 4. Improves appearance and consistency in all browsers 397 | 398 | button, 399 | input, 400 | select, 401 | textarea { 402 | font-family: inherit; // 1 403 | font-size: 100%; // 2 404 | margin: 0; // 3 405 | vertical-align: baseline; // 4 406 | @if $legacy_support_for_ie { 407 | *vertical-align: middle; // 4 408 | } 409 | } 410 | 411 | // Addresses FF3/4 setting line-height on 'input' using !important in the UA stylesheet 412 | 413 | button, input { 414 | line-height: normal; 415 | } 416 | 417 | // Address inconsistent `text-transform` inheritance for `button` and `select`. 418 | // All other form control elements do not inherit `text-transform` values. 419 | // Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. 420 | // Correct `select` style inheritance in Firefox 4+ and Opera. 421 | 422 | button, 423 | select { 424 | text-transform: none; 425 | } 426 | 427 | // 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 428 | // and `video` controls 429 | // 2. Corrects inability to style clickable 'input' types in iOS 430 | // 3. Improves usability and consistency of cursor style between image-type 431 | // 'input' and others 432 | // 4. Removes inner spacing in IE7 without affecting normal text inputs 433 | // Known issue: inner spacing remains in IE6 434 | 435 | button, 436 | html input[type="button"], // 1 437 | input[type="reset"], 438 | input[type="submit"] { 439 | -webkit-appearance: button; // 2 440 | cursor: pointer; // 3 441 | @if $legacy_support_for_ie { 442 | *overflow: visible; // 4 443 | } 444 | } 445 | 446 | // Re-set default cursor for disabled elements 447 | 448 | button[disabled], 449 | input[disabled] { 450 | cursor: default; 451 | } 452 | 453 | // Removes inner padding and border in FF3+ 454 | // www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/ 455 | 456 | button, input { 457 | &::-moz-focus-inner { 458 | border: 0; 459 | padding: 0; 460 | } 461 | } 462 | 463 | // 1. Removes default vertical scrollbar in IE6/7/8/9 464 | // 2. Improves readability and alignment in all browsers 465 | 466 | textarea { 467 | overflow: auto; // 1 468 | vertical-align: top; // 2 469 | } 470 | 471 | // ============================================================================= 472 | // Tables 473 | // ============================================================================= 474 | 475 | // Remove most spacing between table cells 476 | 477 | table { 478 | border-collapse: collapse; 479 | border-spacing: 0; 480 | } 481 | 482 | input { 483 | // 1. Addresses appearance set to searchfield in S5, Chrome 484 | // 2. Addresses box-sizing set to border-box in S5, Chrome (include -moz to future-proof) 485 | &[type="search"] { 486 | -webkit-appearance: textfield; // 1 487 | -moz-box-sizing: content-box; 488 | -webkit-box-sizing: content-box; // 2 489 | box-sizing: content-box; 490 | 491 | // Remove inner padding and search cancel button in Safari 5 and Chrome 492 | // on OS X. 493 | &::-webkit-search-cancel-button, 494 | &::-webkit-search-decoration { 495 | -webkit-appearance: none; 496 | } 497 | } 498 | 499 | // 1. Address box sizing set to `content-box` in IE 8/9/10. 500 | // 2. Remove excess padding in IE 8/9/10. 501 | // 3. Removes excess padding in IE7 502 | // Known issue: excess padding remains in IE6 503 | &[type="checkbox"], 504 | &[type="radio"] { 505 | box-sizing: border-box; // 1 506 | padding: 0; // 2 507 | @if $legacy_support_for_ie { 508 | *height: 13px; // 3 509 | *width: 13px; // 3 510 | } 511 | } 512 | } 513 | -------------------------------------------------------------------------------- /src/scss/libs/_pesticide.scss: -------------------------------------------------------------------------------- 1 | // pesticide v0.1.0 . @mrmrs . MIT 2 | 3 | $pesticide-debug-outline: true !default; 4 | $pesticide-debug-depth: true !default; 5 | 6 | @if $pesticide-debug-outline == true { 7 | body { outline: 1px solid #2980b9 !important; } 8 | article { outline: 1px solid #3498db !important; } 9 | nav { outline: 1px solid #0088c3 !important; } 10 | aside { outline: 1px solid #33a0ce !important; } 11 | section { outline: 1px solid #66b8da !important; } 12 | header { outline: 1px solid #99cfe7 !important; } 13 | footer { outline: 1px solid #cce7f3 !important; } 14 | h1 { outline: 1px solid #162544 !important; } 15 | h2 { outline: 1px solid #314e6e !important; } 16 | h3 { outline: 1px solid #3e5e85 !important; } 17 | h4 { outline: 1px solid #449baf !important; } 18 | h5 { outline: 1px solid #c7d1cb !important; } 19 | h6 { outline: 1px solid #4371d0 !important; } 20 | main { outline: 1px solid #2f4f90 !important; } 21 | address { outline: 1px solid #1a2c51 !important; } 22 | div { outline: 1px solid #036cdb !important; } 23 | p { outline: 1px solid #ac050b !important; } 24 | hr { outline: 1px solid #ff063f !important; } 25 | pre { outline: 1px solid #850440 !important; } 26 | blockquote { outline: 1px solid #f1b8e7 !important; } 27 | ol { outline: 1px solid #ff050c !important; } 28 | ul { outline: 1px solid #d90416 !important; } 29 | li { outline: 1px solid #d90416 !important; } 30 | dl { outline: 1px solid #fd3427 !important; } 31 | dt { outline: 1px solid #ff0043 !important; } 32 | dd { outline: 1px solid #e80174 !important; } 33 | figure { outline: 1px solid #ff00bb !important; } 34 | figcaption { outline: 1px solid #bf0032 !important; } 35 | table { outline: 1px solid #00cc99 !important; } 36 | caption { outline: 1px solid #37ffc4 !important; } 37 | thead { outline: 1px solid #98daca !important; } 38 | tbody { outline: 1px solid #64a7a0 !important; } 39 | tfoot { outline: 1px solid #22746b !important; } 40 | tr { outline: 1px solid #86c0b2 !important; } 41 | th { outline: 1px solid #a1e7d6 !important; } 42 | td { outline: 1px solid #3f5a54 !important; } 43 | col { outline: 1px solid #6c9a8f !important; } 44 | colgroup { outline: 1px solid #6c9a9d !important; } 45 | button { outline: 1px solid #da8301 !important; } 46 | datalist { outline: 1px solid #c06000 !important; } 47 | fieldset { outline: 1px solid #d95100 !important; } 48 | form { outline: 1px solid #d23600 !important; } 49 | input { outline: 1px solid #fca600 !important; } 50 | keygen { outline: 1px solid #b31e00 !important; } 51 | label { outline: 1px solid #ee8900 !important; } 52 | legend { outline: 1px solid #de6d00 !important; } 53 | meter { outline: 1px solid #e8630c !important; } 54 | optgroup { outline: 1px solid #b33600 !important; } 55 | option { outline: 1px solid #ff8a00 !important; } 56 | output { outline: 1px solid #ff9619 !important; } 57 | progress { outline: 1px solid #e57c00 !important; } 58 | select { outline: 1px solid #e26e0f !important; } 59 | textarea { outline: 1px solid #cc5400 !important; } 60 | details { outline: 1px solid #33848f !important; } 61 | summary { outline: 1px solid #60a1a6 !important; } 62 | command { outline: 1px solid #438da1 !important; } 63 | menu { outline: 1px solid #449da6 !important; } 64 | del { outline: 1px solid #bf0000 !important; } 65 | ins { outline: 1px solid #400000 !important; } 66 | img { outline: 1px solid #22746b !important; } 67 | iframe { outline: 1px solid #64a7a0 !important; } 68 | embed { outline: 1px solid #98daca !important; } 69 | object { outline: 1px solid #00cc99 !important; } 70 | param { outline: 1px solid #37ffc4 !important; } 71 | video { outline: 1px solid #6ee866 !important; } 72 | audio { outline: 1px solid #027353 !important; } 73 | source { outline: 1px solid #012426 !important; } 74 | canvas { outline: 1px solid #a2f570 !important; } 75 | track { outline: 1px solid #59a600 !important; } 76 | map { outline: 1px solid #7be500 !important; } 77 | area { outline: 1px solid #305900 !important; } 78 | a { outline: 1px solid #ff62ab !important; } 79 | em { outline: 1px solid #800b41 !important; } 80 | strong { outline: 1px solid #ff1583 !important; } 81 | i { outline: 1px solid #803156 !important; } 82 | b { outline: 1px solid #cc1169 !important; } 83 | u { outline: 1px solid #ff0430 !important; } 84 | s { outline: 1px solid #f805e3 !important; } 85 | small { outline: 1px solid #d107b2 !important; } 86 | abbr { outline: 1px solid #4a0263 !important; } 87 | q { outline: 1px solid #240018 !important; } 88 | cite { outline: 1px solid #64003c !important; } 89 | dfn { outline: 1px solid #b4005a !important; } 90 | sub { outline: 1px solid #dba0c8 !important; } 91 | sup { outline: 1px solid #cc0256 !important; } 92 | time { outline: 1px solid #d6606d !important; } 93 | code { outline: 1px solid #e04251 !important; } 94 | kbd { outline: 1px solid #5e001f !important; } 95 | samp { outline: 1px solid #9c0033 !important; } 96 | var { outline: 1px solid #d90047 !important; } 97 | mark { outline: 1px solid #ff0053 !important; } 98 | bdi { outline: 1px solid #bf3668 !important; } 99 | bdo { outline: 1px solid #6f1400 !important; } 100 | ruby { outline: 1px solid #ff7b93 !important; } 101 | rt { outline: 1px solid #ff2f54 !important; } 102 | rp { outline: 1px solid #803e49 !important; } 103 | span { outline: 1px solid #cc2643 !important; } 104 | br { outline: 1px solid #db687d !important; } 105 | wbr { outline: 1px solid #db175b !important; } 106 | } 107 | 108 | @if $pesticide-debug-depth == true { 109 | body { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(17,34,99,0.25) } 110 | article { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 111 | nav { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 112 | aside { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 113 | section { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 114 | header { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 115 | footer { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 116 | h1 { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 117 | h2 { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 118 | h3 { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 119 | h4 { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 120 | h5 { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 121 | h6 { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 122 | main { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 123 | address { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 124 | div { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 125 | p { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 126 | hr { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 127 | pre { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 128 | blockquote { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 129 | ol { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 130 | ul { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 131 | li { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 132 | dl { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 133 | dt { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 134 | dd { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 135 | figure { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 136 | figcaption { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 137 | table { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 138 | caption { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 139 | thead { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 140 | tbody { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 141 | tfoot { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 142 | tr { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 143 | th { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 144 | td { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 145 | col { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 146 | colgroup { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 147 | button { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 148 | datalist { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 149 | fieldset { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 150 | form { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 151 | input { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 152 | keygen { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 153 | label { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 154 | legend { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 155 | meter { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 156 | optgroup { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 157 | option { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 158 | output { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 159 | progress { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 160 | select { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 161 | textarea { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 162 | details { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 163 | summary { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 164 | command { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 165 | menu { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 166 | del { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 167 | ins { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 168 | img { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 169 | iframe { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 170 | embed { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 171 | object { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 172 | param { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 173 | video { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 174 | audio { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 175 | source { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 176 | canvas { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 177 | track { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 178 | map { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 179 | area { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 180 | a { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 181 | em { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 182 | strong { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 183 | i { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 184 | b { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 185 | u { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 186 | s { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 187 | small { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 188 | abbr { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 189 | q { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 190 | cite { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 191 | dfn { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 192 | sub { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 193 | sup { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 194 | time { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 195 | code { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 196 | kbd { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 197 | samp { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 198 | var { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 199 | mark { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 200 | bdi { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 201 | bdo { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 202 | ruby { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 203 | rt { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 204 | rp { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 205 | span { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 206 | br { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 207 | wbr { box-shadow: 0 0 1rem rgba(0,0,0,.6); background-color: rgba(255,255,255,0.25) } 208 | } 209 | -------------------------------------------------------------------------------- /src/scss/molecules/_index.scss: -------------------------------------------------------------------------------- 1 | // Molecules 2 | // 3 | // In chemistry, molecules are groups of atoms bonded 4 | // together that resultantly take on new properties. 5 | // In interfaces, molecules are relatively simple groups of 6 | // UI elements functioning together as a unit. For example, 7 | // a form label, search input, and button can combine them 8 | // together to create a search form molecule. 9 | // 10 | // @source - http://atomicdesign.bradfrost.com/chapter-2/ 11 | -------------------------------------------------------------------------------- /src/scss/organisms/_index.scss: -------------------------------------------------------------------------------- 1 | // Organisms 2 | // 3 | // Organisms can consist of similar or different molecule types. 4 | // A header organism might consist of dissimilar elements such as 5 | // a logo image, primary navigation list, and search form. 6 | // 7 | // @source - http://atomicdesign.bradfrost.com/chapter-2/ 8 | -------------------------------------------------------------------------------- /src/scss/overrides/_index.scss: -------------------------------------------------------------------------------- 1 | // Overrides 2 | // 3 | // [These styles override] all other layers, and has the power 4 | // to override anything at all that has gone before it. It is 5 | // inelegant and heavy-handed, and contains utility and helper 6 | // classes, and hacks. 7 | // 8 | // @source - http://www.creativebloq.com/web-design/manage-large-css-projects-itcss-101517528 9 | -------------------------------------------------------------------------------- /src/scss/states/_index.scss: -------------------------------------------------------------------------------- 1 | // @source http://smacss.com/book/type-state 2 | // 3 | // State Rules 4 | // 5 | // A state is something that augments and overrides all other styles. 6 | // For example, an accordion section may be in a collapsed or expanded state. 7 | // A message may be in a success or error state. 8 | // 9 | // States are generally applied to the same element as a layout rule or 10 | // applied to the same element as a base module class. 11 | 12 | // ========================================================================== 13 | // $States 14 | // ========================================================================== 15 | -------------------------------------------------------------------------------- /src/scss/states/_print.scss: -------------------------------------------------------------------------------- 1 | // ========================================================================== 2 | // $Print 3 | // Inlined to avoid required HTTP connection: h5bp.com/r 4 | // ========================================================================== 5 | 6 | @media print { 7 | *{ 8 | &:before, 9 | &:after { 10 | background: transparent !important; 11 | color: #000 !important; // Black prints faster: http://www.sanbeiji.com/archives/953 12 | box-shadow: none !important; 13 | text-shadow: none !important; 14 | } 15 | } 16 | a, 17 | a:visited { 18 | text-decoration: underline; 19 | } 20 | 21 | a[href]:after { 22 | content: " (" attr(href) ")"; 23 | } 24 | 25 | abbr[title]:after { 26 | content: " (" attr(title) ")"; 27 | } 28 | 29 | // Don't show links that are fragment identifiers, 30 | // or use the `javascript:` pseudo protocol 31 | 32 | a[href^="#"]:after, 33 | a[href^="javascript:"]:after { 34 | content: ""; 35 | } 36 | 37 | pre, 38 | blockquote { 39 | border: 1px solid #999; 40 | page-break-inside: avoid; 41 | } 42 | 43 | // Printing Tables: 44 | // http://css-discuss.incutio.com/wiki/Printing_Tables 45 | 46 | thead { display: table-header-group; } 47 | 48 | tr, 49 | img { page-break-inside: avoid; } 50 | 51 | img { max-width: 100% !important; } 52 | 53 | p, 54 | h2, 55 | h3 { 56 | orphans: 3; 57 | widows: 3; 58 | } 59 | 60 | h2, 61 | h3 { 62 | page-break-after: avoid; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/scss/styles.scss: -------------------------------------------------------------------------------- 1 | @charset 'utf-8'; 2 | 3 | // ========================================================================== 4 | // Sassy Starter by Mina Markham 5 | // A SMACSS-based starter toolkit for SCSS projects 6 | // 7 | // The toolkit uses recommendations from Scalable and Modular Architecture for CSS (SMACSS) 8 | // @link http://smacss.com/book 9 | // 10 | // Site: https://minamarkham.github.io/sassy-starter 11 | // Author: Mina Markham 12 | // Email: mina@mina.codes 13 | // Date: 10/25/15 14 | // ========================================================================== 15 | 16 | // CSS Debugging 17 | // 18 | // Toggle layout debugging with CSS Pesticide. 19 | // 20 | // $pesticide-debug-outline - {boolean} adds outlines to all elements. 21 | // $pesticide-debug-depth - {boolean} adds shadows to all elements. 22 | // @source - http://pesticide.io/ 23 | 24 | $pesticide-debug-outline: false; 25 | $pesticide-debug-depth: false; 26 | 27 | // ========================================================================== 28 | // $Libs 29 | // ========================================================================== 30 | @import 'libs/index'; 31 | 32 | // ========================================================================== 33 | // $Utilities 34 | // ========================================================================== 35 | @import 'utilities/index'; 36 | 37 | // ========================================================================== 38 | // $Base 39 | // ========================================================================== 40 | @import 'base/index'; 41 | 42 | // ========================================================================== 43 | // $Layout 44 | // ========================================================================== 45 | @import 'layout/index'; 46 | 47 | // ========================================================================== 48 | // $Atoms 49 | // ========================================================================== 50 | @import 'atoms/index'; 51 | 52 | // ========================================================================== 53 | // $Molecules 54 | // ========================================================================== 55 | @import 'molecules/index'; 56 | 57 | // ========================================================================== 58 | // $Organisms 59 | // ========================================================================== 60 | @import 'organisms/index'; 61 | 62 | // ========================================================================== 63 | // $States 64 | // ========================================================================== 65 | @import 'states/index'; 66 | 67 | // ========================================================================== 68 | // $Overrides 69 | // ========================================================================== 70 | @import 'overrides/index'; 71 | 72 | // ========================================================================== 73 | // $Print 74 | // ========================================================================== 75 | @import 'states/print'; 76 | 77 | // ========================================================================== 78 | // $Fonts 79 | // ========================================================================== 80 | @import 'utilities/fonts'; 81 | 82 | // ========================================================================== 83 | // $Shame 84 | // ========================================================================== 85 | @import 'shame'; 86 | -------------------------------------------------------------------------------- /src/scss/themes/rebeccapurple.scss: -------------------------------------------------------------------------------- 1 | // Themes 2 | // 3 | // Themes can affect any of the primary types. They can 4 | // override base styles like default link colours. They can change 5 | // module elements such as colours and borders. They can affect 6 | // layout with different arrangements. They can also alter how states look. 7 | // 8 | // @source http://smacss.com/book/type-theme 9 | 10 | $theme: rebeccapurple; 11 | 12 | @import '../styles'; 13 | -------------------------------------------------------------------------------- /src/scss/utilities/_colors.scss: -------------------------------------------------------------------------------- 1 | // Color Palette 2 | // examples based on the official Sass styleguide 3 | 4 | // descriptive colors 5 | // ============= 6 | 7 | $hopbush: #c69; 8 | $bouquet: #b37399; 9 | $venus: #998099; 10 | $patina: #699; 11 | $nebula: #d2e1dd; 12 | $white: #fff; 13 | $dawn-pink: #f2ece4; 14 | $wafer: #e1d7d2; 15 | $iron: #dadbdf; 16 | $regent-grey: #808c99; 17 | $pale-sky: #6b717f; 18 | $midnight-blue: #036; 19 | $black: #000; 20 | 21 | // main color palette 22 | // ============= 23 | $color-primary: $hopbush; 24 | $color-secondary: $bouquet; 25 | $color-accent: $patina; 26 | $color-shadow: rgba($black, .125); 27 | $color-note: #666; 28 | 29 | // Common colors 30 | $color-background: $white; 31 | $color-background-shade: $iron; 32 | $color-background-invert: $hopbush; 33 | $color-text: darken($pale-sky, 15); 34 | $color-text-weak: $regent-grey; 35 | $color-text-strong: $midnight-blue; 36 | $color-text-heading: $regent-grey; 37 | $color-text-invert: rgba($color-background, .75); 38 | $color-text-strong-invert: $color-background; 39 | 40 | // Links 41 | $color-link: $color-primary; 42 | $color-link-hover: $midnight-blue; 43 | $color-link-visited: $bouquet; 44 | 45 | // Code 46 | $color-code: #333; 47 | $color-code-background: #f3f3f3; 48 | $color-pre: #d4d4d4; 49 | $color-pre-background: #333; 50 | 51 | // Selections 52 | $color-selection: #b3d4fc; 53 | 54 | // Messages 55 | $color-message: #f4ecbb; 56 | $color-success: #2cde2c; 57 | $color-warning: #cf8600; 58 | $color-important: #d00; 59 | $color-notice: #66b; 60 | -------------------------------------------------------------------------------- /src/scss/utilities/_config.scss: -------------------------------------------------------------------------------- 1 | // Variables 2 | 3 | // Configurations 4 | 5 | // $fix-mqs 6 | // 7 | // Define width for browsers w/out media query support 8 | // 9 | // $fix-mqs - {boolean} 10 | // @source - http://jakearchibald.github.com/sass-ie/ 11 | 12 | $fix-mqs: false !default; 13 | 14 | // $old-ie 15 | // 16 | // Turn on/off IE specific styles 17 | // 18 | // $old-ie - {boolean} 19 | // @source - http://jakearchibald.github.com/sass-ie/ 20 | 21 | $old-ie: false !default; 22 | 23 | // $breakpoints 24 | // 25 | // Define major breakpoints 26 | // There are no common breakpoints; examples based on the official Sass styleguide 27 | // You'll need to define your own breakpoints to suit your design 28 | // 29 | // $breakpoints - {map} 30 | 31 | $breakpoints: ( 32 | xsmall: null, 33 | small: 480, 34 | medium: 768, 35 | large: 1024, 36 | xlarge: 1280, 37 | ); 38 | 39 | // $zindex 40 | // 41 | // Define z-indexes for various elements 42 | // 43 | // $zindex - {map} 44 | // @source - http://www.sitepoint.com/using-sass-maps/ 45 | 46 | $zindex: ( 47 | overlay: 9000, 48 | dropdown: 8000, 49 | nav: 7000, 50 | header: 6000, 51 | footer: 5000, 52 | pseduo: 4000, 53 | default: 1, 54 | bottomless-pit: -10000 55 | ); 56 | -------------------------------------------------------------------------------- /src/scss/utilities/_fonts.scss: -------------------------------------------------------------------------------- 1 | // ========================================================================== 2 | // $FONT-FACE 3 | // ========================================================================== 4 | 5 | @if variable-exists(google-fonts-url) { 6 | @import url($google-fonts-url); 7 | } 8 | 9 | @if variable-exists(typefaces) { 10 | @each $file, $option in $typefaces { 11 | @font-face { 12 | font-family: map-get(map-get($typefaces, $file), family); 13 | font-style: map-get(map-get($typefaces, $file), style); 14 | font-weight: map-get(map-get($typefaces, $file), weight); 15 | src: url('../fonts/#{$file}.ttf') format('truetype'), 16 | url('../fonts/#{$file}.woff') format('woff'), 17 | url('../fonts/#{$file}.woff2') format('woff2'); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/scss/utilities/_functions.scss: -------------------------------------------------------------------------------- 1 | // Functions 2 | 3 | // Unit Conversion 4 | 5 | // strip-unit($num) 6 | // 7 | // Strip units from values. 8 | // 9 | // $num - Value to be stripped. 10 | // @returns - number 11 | // @source - http://hugogiraudel.com/2013/08/12/sass-functions 12 | 13 | @function strip-unit($num) { 14 | @return $num / ($num * 0 + 1); 15 | } 16 | 17 | // em() 18 | // 19 | // Convert pixel values to ems. 20 | // 21 | // $target - Value to convert to ems. 22 | // $context - The context the conversion is based on. Defaults to `$base-font-size` 23 | // @requires - `$base-font-size` / `@strip-units` 24 | // @returns - number 25 | // @source - http://www.pjmccormick.com/sweet-sass-function-convert-px-em 26 | 27 | @function em($target, $context: $base-font-size) { 28 | @if not unitless($target) { 29 | $target: strip-units($target); 30 | } 31 | @if not unitless($context) { 32 | $context: strip-units($context); 33 | } 34 | @if $target == 0 { @return 0 } 35 | @return $target / $context + 0em; 36 | } 37 | // rem() 38 | // 39 | // Convert pixel values to rems. 40 | // 41 | // $target - Value to convert to ems. 42 | // $context - The context the conversion is based on. Defaults to `$base-font-size` 43 | // @requires - `$base-font-size` / `@strip-units` 44 | // @returns - number 45 | // @source - http://www.pjmccormick.com/sweet-sass-function-convert-px-em 46 | 47 | @function rem($target, $context: $base-font-size) { 48 | @if not unitless($target) { 49 | $target: strip-units($target); 50 | } 51 | @if not unitless($context) { 52 | $context: strip-units($context); 53 | } 54 | @if $target == 0 { @return 0 } 55 | @return $target / $context + 0rem; 56 | } 57 | 58 | // px() 59 | // 60 | // Convery em values to pixels. 61 | // 62 | // $target - Value to convert to ems. 63 | // $context - The context the conversion is based on. Defaults to `$base-font-size` 64 | // @requires - `$base-font-size` / `@strip-units` 65 | // @returns - number 66 | // @source - http://www.pjmccormick.com/sweet-sass-function-convert-px-em 67 | 68 | @function px($target, $context: $base-font-size) { 69 | @if not unitless($target) { 70 | $pxval: strip-units($target); 71 | } 72 | @if not unitless($context) { 73 | $base: strip-units($context); 74 | } 75 | @if $target == 0 { @return 0 } 76 | @return $target * $context + 0px; 77 | } 78 | 79 | // Map Functions 80 | // 81 | // Styleguide 11.2 82 | 83 | // map-has-nested-keys($map) 84 | // 85 | // $map - Parent map to get values from. 86 | // @returns - boolean 87 | // @source - http://www.sitepoint.com/better-solution-managing-z-index-sass/ 88 | 89 | @function map-has-nested-keys($map, $keys...) { 90 | @each $key in $keys { 91 | @if not map-has-key($map, $key) { 92 | @return false; 93 | } 94 | $map: map-get($map, $key); 95 | } @return true; 96 | } 97 | 98 | // map-deep-get($map) 99 | // 100 | // $map - Parent map to get values from. 101 | // @returns - `$map` 102 | // @source - http://www.sitepoint.com/better-solution-managing-z-index-sass/ 103 | 104 | @function map-deep-get($map, $keys...) { 105 | @each $key in $keys { 106 | $map: map-get($map, $key); 107 | } @return $map; 108 | } 109 | 110 | // z() 111 | // 112 | // @requires - `@map-has-nested-keys` / `@map-deep-get` / `$zindex` 113 | // @returns - `map-deep-get($zindex, $indexes...)` 114 | // @source - http://www.sitepoint.com/extra-map-functions-sass/ 115 | 116 | @function z($indexes...) { 117 | @if not map-has-nested-keys($zindex, $indexes...) { 118 | @warn 'No index found for `#{inspect($indexes...)}` in $zindex map. Property omitted.'; 119 | } @return map-deep-get($zindex, $indexes...); 120 | } 121 | 122 | // bp() 123 | // 124 | // @requires - `@map-has-nested-keys` / `@map-deep-get` / `$breakpoints` 125 | // @returns - `map-deep-get($breakpoints, $point...)` 126 | // @source - http://www.sitepoint.com/extra-map-functions-sass/ 127 | 128 | @function bp($point...) { 129 | @if not map-has-nested-keys($breakpoints, $point...) { 130 | @warn 'No breakpoint found for `#{inspect($point...)}` in $breakpoints map. Property omitted.'; 131 | } @return map-deep-get($breakpoints, $point...); 132 | } 133 | -------------------------------------------------------------------------------- /src/scss/utilities/_index.scss: -------------------------------------------------------------------------------- 1 | // ========================================================================== 2 | // $Global Settings 3 | // ========================================================================== 4 | @import 'config'; 5 | @import 'colors'; 6 | @import 'typography'; 7 | 8 | // ========================================================================== 9 | // $Functions 10 | // ========================================================================== 11 | @import 'functions'; 12 | 13 | // ========================================================================== 14 | // $Mixins 15 | // ========================================================================== 16 | @import 'mixins'; 17 | -------------------------------------------------------------------------------- /src/scss/utilities/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | 3 | // Reset List 4 | // 5 | // Resets default list styling. 6 | // 7 | // @usage - `@include reset-list` 8 | // 9 | // Styleguide 10.1 10 | 11 | @mixin reset-list { 12 | list-style: none; 13 | margin: 0; 14 | padding: 0; 15 | } 16 | 17 | // Hovers 18 | // 19 | // Create pseduo-classes for `:hover`, `:active`, and `:focus`. 20 | // 21 | // @usage - `@include hover` 22 | // 23 | // Styleguide 10.3 24 | 25 | @mixin hover { 26 | &:hover, 27 | &:active, 28 | &:focus { @content; } 29 | } 30 | 31 | // Feature Detection 32 | // 33 | // $feature - Feature-specific class, i.e. `cssgradients`. 34 | // @usage - `@include supported($feature)` 35 | // @usage - `@include not-supported($feature)` 36 | 37 | @mixin supported($feature) { 38 | .#{$feature} & { 39 | @content; 40 | } 41 | } 42 | 43 | @mixin not-supported($feature) { 44 | .no-js &, 45 | .no-#{$feature} & { 46 | @content; 47 | } 48 | } 49 | 50 | // Media Queries 51 | // 52 | // Allows you to use inline media queries. Includes options for `$fix-mqs`. 53 | // 54 | // $breakpoint - Desired breakpoint. Can be variable or unit. 55 | // $query - Defaults to `min-width`. 56 | // $type - Defaults to `screen`. 57 | 58 | @mixin mq($breakpoint, $query: 'min-width', $type: 'screen') { 59 | @if $fix-mqs { 60 | @if $fix-mqs >= $breakpoint { @content; } 61 | } @else { 62 | @media #{$type} and (#{$query}: #{$breakpoint}) { @content; } 63 | } 64 | } 65 | 66 | // Clearfix 67 | // 68 | // Nicolas Gallagher's micro clearfix hack 69 | // 70 | // @source - http://nicolasgallagher.com/micro-clearfix-hack/ 71 | 72 | @mixin clearfix { 73 | *zoom: 1; 74 | 75 | &:before, 76 | &:after { 77 | content: ''; 78 | display: table; 79 | } 80 | 81 | &:after { clear: both; } 82 | } 83 | 84 | // Hide Text 85 | // 86 | // @usage - `@include hide-text` 87 | 88 | @mixin hide-text { 89 | overflow: hidden; 90 | text-indent: 101%; 91 | white-space: nowrap; 92 | } 93 | 94 | // Hidden 95 | // 96 | // Hide from both screenreaders and browsers 97 | // 98 | // @usage - `@include hidden` 99 | 100 | @mixin hidden { 101 | display: none !important; 102 | visibility: hidden; 103 | } 104 | 105 | // Visually Hidden 106 | // 107 | // Hide only visually, but have it available for screenreaders 108 | // 109 | // @usage - `@include visuallyhidden` 110 | 111 | @mixin visuallyhidden { 112 | border: 0; 113 | clip: rect(0 0 0 0); 114 | height: 1px; 115 | margin: -1px; 116 | overflow: hidden; 117 | padding: 0; 118 | position: absolute; 119 | width: 1px; 120 | 121 | // Extends the .visuallyhidden class to allow the element to be focusable 122 | // when navigated to via the keyboard: h5bp.com/p 123 | 124 | &.focusable { 125 | &:active, 126 | &:focus { 127 | clip: auto; 128 | height: auto; 129 | margin: 0; 130 | overflow: visible; 131 | position: static; 132 | width: auto; 133 | } 134 | } 135 | } 136 | 137 | // Invisible 138 | // 139 | // Hide visually and from screenreaders, but maintain layout 140 | // 141 | // @usage - `@include invisible` 142 | 143 | @mixin invisible { visibility: hidden; } 144 | -------------------------------------------------------------------------------- /src/scss/utilities/_typography.scss: -------------------------------------------------------------------------------- 1 | // Typography 2 | 3 | // $base-font-size 4 | // 5 | // Base font size in used in _mixins.scss 6 | // 7 | // $base-font-size - {number} 8 | 9 | $base-font-size: 16; 10 | 11 | // $base-line-height 12 | // 13 | // Base line-height in used in _mixins.scss 14 | // 15 | // $base-line-height - {number} 16 | 17 | $base-line-height: 24; 18 | 19 | // Font Stacks 20 | 21 | // $typefaces 22 | // 23 | // Configuration of webfonts imports. 24 | // 25 | // $typefaces - {map} 26 | // @family - {string} 27 | // @weight - {integer} or {keyword} i.e. 800, bold 28 | // @style - {keyword} i.e. normal, italic 29 | 30 | //$typefaces: ( 31 | // 'FILENAME': ( 32 | // family: 'fontname', 33 | // weight: 100, 34 | // style: normal, 35 | // ), 36 | //); 37 | 38 | // $font-family-sans-fallback 39 | // 40 | // Define font stack used for sans-serifs. 41 | // 42 | // $font-family-sans-fallback - {list} 43 | 44 | $font-family-sans-fallback: 'Arial', sans-serif; 45 | 46 | // $font-family-sans 47 | // 48 | // Define font stack used for sans-serifs. 49 | // 50 | // $font-family-sans - {list} 51 | // @requires - `$font-family-sans-fallback` 52 | 53 | $font-family-sans: 'Helvetica Neue', 'Helvetica', $font-family-sans-fallback; 54 | 55 | // $font-family-serif 56 | // 57 | // Define font stack used for serifs. 58 | // 59 | // $font-family-serif - {list} 60 | 61 | $font-family-serif: 'Georgia', 'Cambria', 'Times New Roman', 'Times', serif; 62 | 63 | // $font-family-monospace 64 | // 65 | // Define font stack used for monospaced copy. 66 | // 67 | // $font-family-monospace - {list} 68 | 69 | $font-family-monospace: 'Inconsolata', 'Menlo', 'Consolas', 'Bitstream Vera Sans Mono', 'Courier', monospace; 70 | 71 | // $font-family-display 72 | // 73 | // Define font stack used for headings. 74 | // 75 | // $font-family-display - {list} 76 | 77 | $font-family-display: $font-family-sans; 78 | 79 | // $font-family-default 80 | // 81 | // Define font stack used for paragraphs. 82 | // 83 | // $font-family-default - {string} 84 | // @requires - `$font-family-sans` 85 | 86 | $font-family-default: $font-family-sans; 87 | --------------------------------------------------------------------------------