[
  {
    "path": ".circleci/config.yml",
    "content": "version: 2.1\n\norbs:\n  # orbs are basically bundles of pre-written build scripts that work for common cases\n  # https://github.com/CircleCI-Public/ruby-orb\n  ruby: circleci/ruby@1.1\n\njobs:\n  test:\n    parameters:\n      ruby-version:\n        type: string\n    docker:\n      - image: cimg/ruby:<< parameters.ruby-version >>-node\n    steps:\n      - checkout\n      - restore_cache:\n          keys:\n            - bourbon-bundle-v1-{{ checksum \"bourbon.gemspec\" }}\n            - bourbon-bundle-v1-\n      - run:\n          name: Run Bundler\n          command: bundle install --path vendor/bundle\n      - save_cache:\n          key: bourbon-bundle-v1-{{ checksum \"bourbon.gemspec\" }}\n          paths:\n            - vendor/bundle\n      - run:\n          name: Run the tests\n          command: bundle exec rake\n      - run:\n          name: Parse SassDoc comments\n          command: npm run sassdoc\nworkflows:\n  build_and_test:\n    jobs:\n      - test:\n          matrix:\n            parameters:\n              # https://github.com/CircleCI-Public/cimg-ruby\n              # only supports the last three ruby versions\n              ruby-version: [\"2.7\", \"3.0\", \"3.1\", \"3.2\"]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "<!-- Feel free to remove any part of this issue template that is not relevant -->\n<!-- Providing context helps us come up with a useful solution -->\n\n## Description\n\n<!-- What did you expect to happen? What happened instead? Was a specific error thrown? -->\n\n## Steps to Reproduce\n\n<!-- If you can reproduce the bug in a CodePen, link to it here -->\n\n1. Step 1…\n2.\n3.\n\n## Development Environment\n\n<!--- Include as many relevant details about the environment you experienced the bug in -->\n\n- Bourbon version:\n- Platform:\n- Link to the code repository:\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!-- Feel free to remove any part of this pull request template that is not relevant -->\n\n## Description\n\n<!-- What do your changes do or fix? -->\n\n## Additional Information\n\n<!-- Links to demos, e.g. CodePen, can be helpful, as are research and support documents -->\n<!-- If this fixes or is related to an existing issue, link to it here (and in the commit message) -->\n"
  },
  {
    "path": ".github/workflows/dynamic-readme.yml",
    "content": "name: update-templates\n\non: \n  push:\n    branches:\n      - main\n  workflow_dispatch:\n\njobs:\n  update-templates:\n    permissions:\n      contents: write\n      pull-requests: write\n      pages: write\n    uses: thoughtbot/templates/.github/workflows/dynamic-readme.yaml@main\n    secrets:\n      token: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/dynamic-security.yml",
    "content": "name: update-security\n\non:\n  push:\n    paths:\n      - SECURITY.md\n    branches:\n      - main\n  workflow_dispatch:\n\njobs:\n  update-security:\n    permissions:\n      contents: write\n      pull-requests: write\n      pages: write\n    uses: thoughtbot/templates/.github/workflows/dynamic-security.yaml@main\n    secrets:\n      token: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "*gem\n*swp\n.DS_store\n.sass-cache\n_site\nGemfile.lock\nnpm-debug.log\ntmp/\n"
  },
  {
    "path": ".hound.yml",
    "content": "ruby:\n  enabled: true\nscss:\n  enabled: false\nstylelint:\n  config_file: .stylelintrc.json\n  enabled: true\n  # version: 10.1.0\n"
  },
  {
    "path": ".npmignore",
    "content": ".circleci/\n.github/\n.gitignore\n.hound.yml\n.ruby-version\n.sass-cache\n.stylelintrc.json\n_site\nbin/\nbourbon.gemspec\nCODE_OF_CONDUCT.md\nCONTRIBUTING.md\nfeatures/\nGemfile\nGemfile.lock\nlib/\npkg/\nRakefile\nRELEASING.md\nspec/\n"
  },
  {
    "path": ".stylelintrc.json",
    "content": "{\n  \"extends\": \"@thoughtbot/stylelint-config\"\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Change Log\n\nAll notable changes to this project will be documented in this file. This\nproject adheres to [Semantic Versioning](http://semver.org).\n\n## [7.3.0] - 2023-01-20\n\n## Changed\n- Update initializers so they only include assets for >=Rails 5. [https://github.com/thoughtbot/bourbon/pull/1109/](https://github.com/thoughtbot/bourbon/pull/1109/files)\n\n## [7.2.0] - 2022-02-22\n\n### Changed\n\n- Revert \"Replace `/` with `math.div` per Dart Sass 2.0.0 updates.\"\n\n[7.2.0]: https://github.com/thoughtbot/bourbon/compare/v7.1.0...v7.2.0\n\n## [7.1.0] - 2022-02-22\n\n### Changed\n\n- Replace `/` with `math.div` per Dart Sass 2.0.0 updates.\n\n[7.1.0]: https://github.com/thoughtbot/bourbon/compare/v7.0.0...v7.1.0\n\n## [7.0.0] - 2020-03-09\n\n### Added\n\n- Improved error handling of unsupported font file formats in the `font-face`\n  mixin (supported formats are `woff2` and `woff`).\n- CSS `var()` and `env()` functions are now accepted as values in the\n  `position` and `size` mixins.\n\n### Changed\n\n- Updated `thor` from 0.x to 1.x\n\n### Removed\n\n- The `font-face` mixin no longer supports `ttf`, `svg`, and `eot`\n  font file formats.\n\n[7.0.0]: https://github.com/thoughtbot/bourbon/compare/v6.0.0...v7.0.0\n\n## [6.0.0] - 2019-07-10\n\n### Removed\n\n- Installation through Bower is no longer supported.\n- The sass gem (the deprecated Ruby Sass) is no longer a runtime dependency.\n\n[6.0.0]: https://github.com/thoughtbot/bourbon/compare/v5.1.0...v6.0.0\n\n## [5.1.0] - 2018-07-20\n\n### Added\n\n- `$font-stack-system` now includes the `system-ui` value.\n\n### Changed\n\n- The `_gamma` function will use a `pow` function, if available.\n\n[5.1.0]: https://github.com/thoughtbot/bourbon/compare/v5.0.1...v5.1.0\n\n## [5.0.1] - 2018-06-08\n\n### Fixed\n\n- Fixed an issue that would cause Bourbon to not be found when using SassC.\n\n[5.0.1]: https://github.com/thoughtbot/bourbon/compare/v5.0.0...v5.0.1\n\n## [5.0.0] - 2018-01-05\n\nBourbon 5.0.0 is a major release with lots of changes and removals, which are\ndocumented below in each of the alpha and beta releases. There are no changes\nbetween v5.0.0-beta.8 and v5.0.0. For information on how to upgrade from v4 to\nv5, read our [migrating guide][migrating-guide].\n\n[5.0.0]: https://github.com/thoughtbot/bourbon/compare/v5.0.0.beta.8...v5.0.0\n[migrating-guide]: https://www.bourbon.io/docs/migrating-from-v4-to-v5/\n\n## [5.0.0-beta.8] - 2017-06-26\n\n### Added\n\n- A `style` property has been added to our `package.json`, which makes for easy\n  importing when using npm-sass, sass-module-importer and others.\n\n### Changed\n\n- The `triangle` mixin no longer has default argument values. The order of the\n  arguments also changed: `$width` and `$height` now come before `$color`.\n\n### Fixed\n\n- The `bourbon update` CLI command now works when Bourbon is installed using a\n  custom path.\n- Fixed an issue that would cause Bourbon to not be found within Rails apps.\n\n[5.0.0-beta.8]: https://github.com/thoughtbot/bourbon/compare/v5.0.0.beta.7...v5.0.0.beta.8\n\n## [5.0.0-beta.7] - 2016-11-03\n\n### Added\n\n- Added `white-space: nowrap;` to the `hide-visually` mixin so that content\n  renders on one line and is correctly pronounced by screen readers. You can\n  read more about this in Jesse Beach’s article “[Beware smushed off-screen\n    accessible text][smushed-text-article].”\n\n### Changed\n\n- Removed the default values from the `$position` and `$coordinates` arguments\n  for the `position` mixin.\n- Updated `contrast-switch` to calculate contrast based on the WCAG 2.0\n  specification. Please note that it is an approximation and we cannot guarantee\n  full compliance, though all of our manual testing passed.\n- Renamed the `$coordinates` argument in the `position` mixin\n  to `$box-edge-values`.\n- Updated `$font-stack-system` to include Avenir Next, Avenir, Lucida\n  Grande, Helvetica, Noto, Franklin Gothic Medium, Century Gothic, and\n  Liberation Sans. This follows [system-fonts] by Adam Morse.\n- The `word-break` property was removed from the `word-wrap` mixin and\n  is no longer output.\n- Renamed the `word-wrap` mixin to `overflow-wrap` to align with the\n  name change in the [CSS spec].\n\n[smushed-text-article]: https://medium.com/@jessebeach/beware-smushed-off-screen-accessible-text-5952a4c2cbfe#.l4hkljiza\n[system-fonts]: https://github.com/mrmrs/css-system-fonts\n[CSS spec]: https://drafts.csswg.org/css-text-3/#propdef-overflow-wrap\n\n[5.0.0-beta.7]: https://github.com/thoughtbot/bourbon/compare/v5.0.0.beta.6...v5.0.0.beta.7\n\n## [5.0.0-beta.6] - 2016-06-06\n\n### Added\n\n- Added a `value-prefixer` mixin for generating vendor prefixes on values.\n\n[5.0.0-beta.6]: https://github.com/thoughtbot/bourbon/compare/v5.0.0.beta.5...v5.0.0.beta.6\n\n## [5.0.0-beta.5] - 2016-03-23\n\n### Fixed\n\n- Fixed a Sass load path issue that would intermittently break the importing of\n  Bourbon in Rails apps.\n\n### Changed\n\n- Swapped the order of the `$file-formats` and `$asset-pipeline` arguments in\n  the `font-face` mixin, so that `$asset-pipeline` is last (because it has a\n  default and is likely used the least).\n\n[5.0.0-beta.5]: https://github.com/thoughtbot/bourbon/compare/v5.0.0.beta.4...v5.0.0.beta.5\n\n## [5.0.0-beta.4] - 2016-03-11\n\n### Fixed\n\n- We accidentally published `5.0.0.beta.3` as a stable release on npm, rather\n  than a prerelease. We’ve unpublished that to go back to `4.2.6` on the stable\n  channel.\n\n[5.0.0-beta.4]: https://github.com/thoughtbot/bourbon/compare/v5.0.0.beta.3...v5.0.0.beta.4\n\n## [5.0.0-beta.3] - 2016-03-04\n\n### Fixed\n\n- Added `pathname` requirement to fix install issues.\n\n[5.0.0-beta.3]: https://github.com/thoughtbot/bourbon/compare/v5.0.0.beta.2...v5.0.0.beta.3\n\n## [5.0.0-beta.2] - 2016-03-03\n\n### Added\n\n- Added global settings for the `contrast-switch` mixin:\n  `contrast-switch-dark-color` & `contrast-switch-light-color`.\n- Added the `triangle` mixin back, but note that it’s been refactored and the\n  arguments have changed. See [43e5a90].\n\n### Changed\n\n- Switched argument names in `contrast-switch`; `$dark-color` is now\n  `$light-color` and `$light-color` is now `$dark-color`.\n- The `is-light` function is now private.\n\n### Removed\n\n- Dropped support for Ruby on Rails versions older than 4.2.\n- Dropped support for LibSass versions older than 3.3.\n\n[5.0.0-beta.2]: https://github.com/thoughtbot/bourbon/compare/v5.0.0.beta.1...v5.0.0.beta.2\n[43e5a90]: https://github.com/thoughtbot/bourbon/commit/43e5a90e7e624d2977731030ccdb36b3c2e460d9\n\n## [5.0.0-beta.1] - 2016-02-09\n\n### Added\n\n- Added a `contrast-switch` function that switches between two colors based on the\n  lightness of a another color. Great for building button styles.\n- Added an `$all-text-inputs-invalid` variable to target the `:invalid`\n  pseudo-class on all text-based inputs.\n- The `ellipsis` mixin now takes a `$display` argument.\n- Added a font stack for system fonts: `$font-stack-system`.\n- Added a `hide-visually` mixin that hides an element visually while still\n  allowing the content to be accessible to assistive technology,\n  e.g. screen readers.\n- The `font-face` mixin now allows additional CSS properties to be included in\n  its block, which will output as part of the `@font-face` declaration.\n  See [2356719].\n\n### Changed\n\n- The global default for the `modular-scale` ratio is now set to\n  `$major-third` (`1.25`), instead of `$perfect-fourth` (`1.333`).\n- All font stack variables are now prefixed with `$font-stack-`,\n  e.g. `$font-stack-helvetica`.\n- Global settings are now set via a `$bourbon` map, instead of variables.\n  See [4e43c2d].\n- The `clearfix` mixin now uses `block` display, instead of `table`.\n\n### Removed\n\n- The `$weight` and `$style` arguments in the `font-face` mixin have been\n  removed. Instead, you can now include these—along with other CSS\n  properties—within the mixin block and they’ll be output as part of the\n  `@font-face` declaration.\n\n[5.0.0-beta.1]: https://github.com/thoughtbot/bourbon/compare/da4451e...v5.0.0.beta.1\n[2356719]: https://github.com/thoughtbot/bourbon/commit/235671948ef3a9c343c4391d250082a0373c8d83\n[4e43c2d]: https://github.com/thoughtbot/bourbon/commit/4e43c2d7507999b539771bdc1b3733b18b3c1883\n\n## [5.0.0.alpha.0] - 2015-08-21\n\n### Added\n\n- Added a `$global-font-file-formats` setting to globally set the file formats\n  for the `font-face` mixin. The default is `(\"ttf\", \"woff2\", \"woff\")`.\n- Add `$consolas`, `$courier-new` and `$monaco` variables (these replace the\n  removed `$monospace` variable).\n\n### Changed\n\n- Removed the type selectors in `$all-text-inputs` and `$all-buttons` to\n  reduce specificity.\n- Font stacks have been modernized. See [3cf106a].\n- The `strip-units` function is now `strip-unit`.\n- The `size` mixin now requires a comma-separated argument list,\n  e.g. `@include size(1em, 2em);`.\n\n### Removed\n\n- All vendor prefixing mixins have been removed. These include:\n  - `align-items`\n  - `animation-delay`\n  - `animation-direction`\n  - `animation-duration`\n  - `animation-fill-mode`\n  - `animation-iteration-count`\n  - `animation-name`\n  - `animation-play-state`\n  - `animation-timing-function`\n  - `animation`\n  - `appearance`\n  - `backface-visibility`\n  - `background-image`\n  - `background`\n  - `border-image`\n  - `calc`\n  - `column-count`\n  - `column-fill`\n  - `column-gap`\n  - `column-rule-color`\n  - `column-rule-style`\n  - `column-rule-width`\n  - `column-rule`\n  - `column-span`\n  - `column-width`\n  - `columns`\n  - `display`\n  - `filter`\n  - `flex-direction`\n  - `flex`\n  - `font-feature-settings`\n  - `hidpi`\n  - `hyphens`\n  - `image-rendering`\n  - `justify-content`\n  - `keyframes`\n  - `linear-gradient`\n  - `perspective`\n  - `placeholder`\n  - `radial-gradient`\n  - `selection`\n  - `text-decoration-color`\n  - `text-decoration-line`\n  - `text-decoration-style`\n  - `text-decoration`\n  - `transform-origin`\n  - `transform-style`\n  - `transform`\n  - `transition-delay`\n  - `transition-duration`\n  - `transition-property`\n  - `transition-timing-function`\n  - `transition`\n  - `user-select`\n  - For prefixing, we recommend using a more robust and maintainable solution\n    like [Autoprefixer].\n- The `$global-prefixes` setting has been removed and the `prefixer` mixin\n  has been refactored and no longer uses it.\n- The `$monospace` variable has been removed.\n- The `box-sizing` mixin has been removed.\n- The `button` mixin has been removed.\n- The `em` and `rem` functions have been removed.\n  - [See the discussion on why these were removed][em-rem-issue].\n- The `flex-grid` function has been removed.\n- The `flex-gutter` function has been removed.\n- The `golden-ratio` function has been removed.\n- The `grid-width` function has been removed.\n- The `inline-block` mixin has been removed.\n- The `retina-image` mixin has been removed.\n- The `triangle` mixin has been removed.\n\n[5.0.0.alpha.0]: https://github.com/thoughtbot/bourbon/compare/v4.3.4...v5.0.0.alpha.0\n[3cf106a]: https://github.com/thoughtbot/bourbon/commit/3cf106a210c1bae7765e6193f62310f95fdee0b7\n[Autoprefixer]: https://github.com/postcss/autoprefixer\n[em-rem-issue]: https://github.com/thoughtbot/bourbon/issues/691\n\n## [4.3.4] - 2017-04-01\n\n### Changed\n\n- Updated deprecation warning message for `strip-units`. ([#1016])\n\n[4.3.4]: https://github.com/thoughtbot/bourbon/compare/v4.3.3...v4.3.4\n[#1016]: https://github.com/thoughtbot/bourbon/pull/1016\n\n## [4.3.3] - 2017-02-23\n\n### Fixed\n\n- Internal Bourbon deprecation warnings for `is-size` and `is-length` will no\n  longer be thrown when using the `size` mixin.\n\n[4.3.3]: https://github.com/thoughtbot/bourbon/compare/v4.3.2...v4.3.3\n\n## [4.3.2] - 2017-02-10\n\n### Fixed\n\n- Internal Bourbon deprecation warnings for `unpack` and `is-length` will no\n  longer be thrown when using the `position` mixin. ([#1004])\n\n[4.3.2]: https://github.com/thoughtbot/bourbon/compare/v4.3.1...v4.3.2\n[#1004]: https://github.com/thoughtbot/bourbon/pull/1004\n\n## [4.3.1] - 2017-02-07\n\n### Fixed\n\n- Internal Bourbon deprecation warnings will no longer be thrown. ([#1002])\n\n[4.3.1]: https://github.com/thoughtbot/bourbon/compare/v4.3.0...v4.3.1\n[#1002]: https://github.com/thoughtbot/bourbon/pull/1002\n\n## [4.3.0] - 2017-02-03\n\n### Added\n\n- Added deprecation warnings for features that will be removed in 5.0.0. Please\n  reference our [change log], which includes a list of these changes and\n  removals. ([#891])\n\n[4.3.0]: https://github.com/thoughtbot/bourbon/compare/v4.2.7...v4.3.0\n[change log]: https://github.com/thoughtbot/bourbon/blob/master/CHANGELOG.md\n[#891]: https://github.com/thoughtbot/bourbon/pull/891\n\n## [4.2.7] - 2016-04-15\n\n### Fixed\n\n- Fixed a Sass deprecation warning when using the `background` and\n  `background-image` mixins.\n\n[4.2.7]: https://github.com/thoughtbot/bourbon/compare/v4.2.6...v4.2.7\n\n## [4.2.6] - 2015-10-17\n\n### Fixed\n\n- Fixed a bug with eyeglass support.\n\n[4.2.6]: https://github.com/thoughtbot/bourbon/compare/v4.2.5...v4.2.6\n\n## [4.2.5] - 2015-09-17\n\n## Added\n\n- Support for [eyeglass].\n\n[4.2.5]: https://github.com/thoughtbot/bourbon/compare/v4.2.4...v4.2.5\n[eyeglass]: http://eyeglass.rocks/\n\n## [4.2.4] - 2015-08-21\n\n## Changed\n\n- [`$all-text-inputs`] now accounts for `input`’s that don’t have a `type`\n  attribute specified, as they default to `type=\"text\"`.\n  (https://github.com/thoughtbot/bourbon/commit/8e7e36e01c47194d83951fb6315c5b26a008f2b7)\n- The [`bourbon` npm package] now has a proper load path.\n  (https://github.com/thoughtbot/bourbon/commit/36c2d5576f1fe9dbdfd9543e15064c5a4a16343e)\n\n[4.2.4]: https://github.com/thoughtbot/bourbon/compare/v4.2.3...v4.2.4\n[`$all-text-inputs`]: http://bourbon.io/docs/#text-inputs\n[`bourbon` npm package]: https://npmjs.com/package/bourbon\n\n## [4.2.3] - 2015-05-18\n\n## Fixed\n\n- Fixed an issue with the `font-face` mixin outputting an extraneous commas when\n  using LibSass set to compressed output.\n\n[4.2.3]: https://github.com/thoughtbot/bourbon/compare/v4.2.2...v4.2.3\n\n## [4.2.2] - 2015-04-01\n\n## Fixed\n\n- The `flex-direction` mixin now properly outputs box-direction (old syntax) if\n  set to normal.\n\n[4.2.2]: https://github.com/thoughtbot/bourbon/compare/v4.2.1...v4.2.2\n\n## [4.2.1] - 2015-02-23\n\n## Fixed\n\n- Restored the `app/` directory for npm.\n\n[4.2.1]: https://github.com/thoughtbot/bourbon/compare/v4.2.0...v4.2.1\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Code of Conduct\n\nBy participating in this project, you agree to abide by the\n[thoughtbot code of conduct][tb-coc].\n\n[tb-coc]: https://thoughtbot.com/open-source-code-of-conduct\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\n## Governance\n\nWe, the maintainers of Bourbon, would like you to know what to expect when\ninteracting with this project's repo.\n\nAs a *user* of Bourbon, you can expect care to be put into official releases.\nThe maintainers cannot guarantee that the `master` branch will have the same\nAPI forever.\n\nIf you *review pull requests* or *comment on issues*, you are expected to abide\nby our [code of conduct].\n\nAs a *contributor*, submitting a pull request or opening an issue, you can\nexpect an initial response from a maintainer within two weeks. The maintainers\ncannot guarantee that we will accept all feature requests, and may fix bugs in\nways other than how the contributor suggests. You are expected to abide by our\n[code of conduct].\n\nAs a *maintainer*, you can merge pull requests (even your own) at any time.\nMaintainers are encouraged to request code review from others at thoughtbot or\nany relevant peers. You are expected to abide by our [code of conduct].\n\nOnly members of thoughtbot may be maintainers.\n\n## Pull Requests\n\nWe welcome pull requests from everyone. Here’s a quick guide:\n\n1. [Fork the repository][fork] and clone to your machine.\n1. Run `bundle install`.\n1. Make sure the tests pass: `bundle exec rake`.\n1. Make your change, following our style guide (below). Write tests. Make sure\n   the tests pass: `bundle exec rake`.\n1. Write a [good commit message][commit]. Push to your fork and\n   [submit a pull request][pr]. If [Hound] catches style violations, fix them.\n1. Wait for us. We try to at least comment on pull requests within one week. We\n   may suggest changes.\n\n[fork]: https://github.com/thoughtbot/bourbon/fork\n[commit]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html\n[pr]: https://github.com/thoughtbot/bourbon/compare/\n[hound]: https://houndci.com\n\n### Style Guide\n\nBourbon uses Sass’s SCSS syntax and aligns to\n[thoughtbot’s style guides][sass guide]. High-level notes:\n\n- Use two-space indentation (no tabs).\n- Use double quotation marks.\n- Use hyphens when naming things: `hide-visually` rather than `hide_visually` or\n  `hideVisually`.\n- Use one space between property and value: `width: 20px` rather than\n  `width:20px`.\n- Names should be descriptive and aim for clarity over brevity:\n  `$all-text-inputs-hover` rather than `$inputshover` or `$alltxthvr`.\n- Order CSS declarations alphabetically.\n- No trailing whitespace.\n\nWe use [stylelint][stylelint] to lint our CSS and Sass. It's configuration can\nbe found in `.stylelintrc.json`. You can run stylelint from the command line via\n`npm run stylelint`, or integrate it with your text editor.\n\n[sass guide]: https://github.com/thoughtbot/guides\n[stylelint]: https://stylelint.io/\n\n### Documentation\n\nWe use [SassDoc] to document Bourbon. [Annotations] should be ordered:\n\n- `@link`\n- `@see`\n- `@type`\n- `@argument`\n- `@content`\n- `@property`\n- `@return`\n- `@example`\n- `@require`\n- `@access`\n- `@since`\n- `@author`\n- `@deprecated`\n- `@todo`\n\n[SassDoc]: http://sassdoc.com\n[Annotations]: http://sassdoc.com/annotations\n[code of conduct]: https://thoughtbot.com/open-source-code-of-conduct\n"
  },
  {
    "path": "Gemfile",
    "content": "source \"https://rubygems.org\"\n\ngemspec\n"
  },
  {
    "path": "LICENSE.md",
    "content": "The MIT License (MIT)\n\nCopyright © 2011-2020 [thoughtbot, inc.](http://thoughtbot.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the “Software”), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "[<img src=\"https://images.thoughtbot.com/bourbon/bourbon-logo.svg\" width=\"200\" alt=\"Bourbon logo\">][Bourbon]\n\n[![Reviewed by Hound](https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg)](https://houndci.com)\n\n## Deprecated as of September 13, 2024\n\nThis project is no longer maintained. We encourage people to leverage the modern native CSS features in lieu of this library. You can refer to [our blog post](https://thoughtbot.com/blog/you-might-not-need-bourbon) on how to go about replacing or rethinking each helper.\n\n## A Lightweight Sass Tool Set\n\n[Bourbon] is a library of [Sass] mixins and functions that are designed to make\nyou a more efficient style sheet author.\n\nIt is…\n\n- Dependency-free: Bourbon is pure Sass.\n- Human-readable: We aim for clarity over brevity.\n- Lightweight: Zero output post-install and has no visual opinion.\n\n  [Bourbon]: https://www.bourbon.io/\n  [Sass]: http://sass-lang.com\n\n### Helpful Links\n\n- [Documentation](https://www.bourbon.io/docs/latest/)\n- [Change log](CHANGELOG.md)\n- [Twitter](https://twitter.com/bourbonsass)\n- [Stack Overflow](https://stackoverflow.com/questions/tagged/bourbon)\n\n## Table of Contents\n\n- [Requirements](#requirements)\n- [Installation](#installation)\n- [Command Line Interface](#command-line-interface)\n- [Browser Support](#browser-support)\n- [Contributing](#contributing)\n- [License](#license)\n- [About](#about)\n\n## Requirements\n\n- [Sass] 3.4+ or [LibSass] 3.3+\n\n  [Sass]: https://github.com/sass/sass\n  [LibSass]: https://github.com/sass/libsass\n\n## Installation\n\n1. Install the Bourbon gem using the [RubyGems] package manager:\n\n    ```bash\n    gem install bourbon\n    ```\n\n1. Install the Bourbon library into the current directory:\n\n    ```bash\n    bourbon install\n    ```\n\n    **Pro Tip:** You can target installation into a specific directory using the\n    `path` flag:\n\n    ```bash\n    bourbon install --path my/custom/path/\n    ```\n\n1. Import Bourbon at the beginning of your stylesheet:\n\n    ```scss\n    @import \"bourbon/bourbon\";\n    ```\n\n    It’s not recommended that you modify Bourbon’s files directly as it will\n    make updating to future versions difficult, by overwriting your custom\n    changes or causing merge conflicts.\n\n  [RubyGems]: https://rubygems.org\n\n### Installation for Ruby on Rails 4.2+\n\n1. Add Bourbon to your Gemfile:\n\n    ```ruby\n    gem \"bourbon\"\n    ```\n\n1. Then run:\n\n    ```bash\n    bundle install\n    ```\n\n1. Restart your server and rename `application.css` to `application.scss`:\n\n    ```bash\n    mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss\n    ```\n\n1. Delete _all_ Sprockets directives in `application.scss` (`require`,\n   `require_tree` and `require_self`) and use Sass’s native `@import` instead\n   ([why?][sass-import]).\n\n1. Import Bourbon at the beginning of `application.scss`. Any project styles\n   that utilize Bourbon’s features must be imported after Bourbon.\n\n    ```scss\n    @import \"bourbon\";\n    @import \"home\";\n    @import \"users\";\n    ```\n\n  [sass-import]: https://content.pivotal.io/blog/structure-your-sass-files-with-import\n\n### Installing with npm and using a Node-based asset pipeline\n\n1. Add Bourbon as a dependency:\n\n    ```bash\n    npm install --save bourbon\n    ```\n\n1. If you’re using [eyeglass], skip to Step 3. Otherwise, you’ll need to add\n   Bourbon to your node-sass `includePaths` option.\n   `require(\"bourbon\").includePaths` is an array of directories that you should\n   pass to node-sass. How you do this depends on how node-sass is integrated\n   into your project.\n\n1. Import Bourbon into your Sass files:\n\n    ```scss\n    @import \"bourbon\";\n    ```\n\n  [eyeglass]: https://github.com/sass-eyeglass/eyeglass\n\n### Installing older versions of Bourbon\n\n1. Uninstall any Bourbon gem versions you already have:\n\n    ```bash\n    gem uninstall bourbon\n    ```\n\n1. Reinstall the Bourbon gem, using the `-v` flag to specify the version\n   you need:\n\n    ```bash\n    gem install bourbon -v 4.2.7\n    ```\n\n1. Follow the [instructions above](#installation) to install Bourbon into\n   your project.\n\n## Command Line Interface\n\n```bash\nbourbon [options]\n```\n\n### Options\n\n| Option            | Description               |\n| :---------------- | :------------------------ |\n| `-h`, `--help`    | Show help                 |\n| `-v`, `--version` | Show the version number   |\n| `--path`          | Specify a custom path     |\n| `--force`         | Force install (overwrite) |\n\n### Commands\n\n| Command           | Description                                           |\n| :---------------- | :---------------------------------------------------- |\n| `bourbon install` | Install Bourbon into the current directory            |\n| `bourbon update`  | Overwrite and update Bourbon in the current directory |\n| `bourbon help`    | Show help                                             |\n\n## Browser Support\n\nBourbon supports Internet Explorer 11+ and the latest versions of Chrome,\nFirefox, Safari, and Edge.\n\n## Contributing\n\nSee the [contributing] document. Thank you, [contributors]!\n\n  [contributing]: CONTRIBUTING.md\n  [contributors]: https://github.com/thoughtbot/bourbon/graphs/contributors\n\n## License\n\nBourbon is copyright © 2011 [thoughtbot, inc.][thoughtbot] It is free\nsoftware, and may be redistributed under the terms specified in the [license].\n\n  [license]: LICENSE.md\n\n<!-- START /templates/footer.md -->\n## About thoughtbot\n\n![thoughtbot](https://thoughtbot.com/thoughtbot-logo-for-readmes.svg)\n\nThis repo is maintained and funded by thoughtbot, inc.\nThe names and logos for thoughtbot are trademarks of thoughtbot, inc.\n\nWe love open source software!\nSee [our other projects][community].\nWe are [available for hire][hire].\n\n[community]: https://thoughtbot.com/community?utm_source=github\n[hire]: https://thoughtbot.com/hire-us?utm_source=github\n\n\n<!-- END /templates/footer.md -->\n\n[thoughtbot]: https://thoughtbot.com?utm_source=github\n"
  },
  {
    "path": "RELEASING.md",
    "content": "# Releasing\n\n1. Update the version number in these places:\n\n    - `lib/bourbon/version.rb`\n    - `core/_bourbon.scss`\n    - `package.json`\n\n1. Update `CHANGELOG.md`. We follow the guidelines from\n   [Keep a Changelog][keep-a-changelog].\n\n1. Commit changes. Use the convention “Bourbon vX.X.X” in your commit message.\n   There shouldn’t be code changes, and thus CI doesn’t need to run.\n\n1. Run `bundle exec rake release`, which tags the release, pushes the tag to\n   GitHub, and pushes the gem to RubyGems.org.\n\n1. Run `npm publish`, which pushes the new version to npm’s registry (if\n   releasing a pre-release, run `npm publish --tag beta`).\n\n1. Draft a [new GitHub release][github-release].\n\n1. Tweet about the release from the [@bourbonsass] Twitter account, e.g.\n\n    > We’ve released Bourbon {release_title}: {release_link}\n\n1. Re-generate and publish the [documentation website][website].\n\n[keep-a-changelog]: https://keepachangelog.com/en/1.0.0/\n[github-release]: https://github.com/thoughtbot/bourbon/releases/new\n[@bourbonsass]: https://twitter.com/bourbonsass\n[website]: https://github.com/thoughtbot/bourbon.io\n"
  },
  {
    "path": "Rakefile",
    "content": "require \"bundler\"\nrequire \"cucumber/rake/task\"\nrequire \"rspec/core/rake_task\"\n\nBundler::GemHelper.install_tasks\nCucumber::Rake::Task.new\nRSpec::Core::RakeTask.new(:spec)\n\ntask :default => [:spec, :cucumber]\n"
  },
  {
    "path": "SECURITY.md",
    "content": "<!-- START /templates/security.md -->\n# Security Policy\n\n## Supported Versions\n\nOnly the the latest version of this project is supported at a given time. If\nyou find a security issue with an older version, please try updating to the\nlatest version first.\n\nIf for some reason you can't update to the latest version, please let us know\nyour reasons so that we can have a better understanding of your situation.\n\n## Reporting a Vulnerability\n\nFor security inquiries or vulnerability reports, visit\n<https://thoughtbot.com/security>.\n\nIf you have any suggestions to improve this policy, visit <https://thoughtbot.com/security>.\n\n<!-- END /templates/security.md -->\n"
  },
  {
    "path": "bin/bourbon",
    "content": "#!/usr/bin/env ruby\n\nrequire File.dirname(__FILE__) + \"/../lib/bourbon.rb\"\n\nBourbon::Generator.start\n"
  },
  {
    "path": "bourbon.gemspec",
    "content": "$:.push File.expand_path(\"../lib\", __FILE__)\nrequire \"bourbon/version\"\n\nGem::Specification.new do |s|\n  s.add_development_dependency \"aruba\", \"~> 0.14\"\n  s.add_development_dependency \"css_parser\", \"~> 1.4\"\n  s.add_development_dependency \"cucumber\", \"~> 2.0\"\n  s.add_development_dependency \"rake\"\n  s.add_development_dependency \"rspec\", \"~> 3.4\"\n  s.add_development_dependency \"sass\"\n  s.add_runtime_dependency \"thor\", \"~> 1.0\"\n  s.authors = [\n    \"Christian Reuter\",\n    \"Damian Galarza\",\n    \"Gabe Berke-Williams\",\n    \"Hugo Giraudel\",\n    \"Joshua Ogle\",\n    \"Kyle Fiedler\",\n    \"Phil LaPier\",\n    \"Reda Lemeden\",\n    \"Tyson Gach\",\n    \"Will McMahan\"\n  ]\n  s.description = <<-DESC\n    Bourbon is a library of pure Sass mixins and functions that are designed to\n    make you a more efficient developer.\n  DESC\n  s.email = \"design+bourbon@thoughtbot.com\"\n  s.executables = `git ls-files -- bin/*`.split(\"\\n\").map{ |f| File.basename(f) }\n  s.files = `git ls-files`.split(\"\\n\")\n  s.homepage = \"https://www.bourbon.io/\"\n  s.license = \"MIT\"\n  s.name = \"bourbon\"\n  s.platform = Gem::Platform::RUBY\n  s.require_paths = [\"lib\"]\n  s.summary = \"A lightweight Sass tool set.\"\n  s.test_files = `git ls-files -- {test,spec,features}/*`.split(\"\\n\")\n  s.version = Bourbon::VERSION\nend\n"
  },
  {
    "path": "core/_bourbon.scss",
    "content": "// Bourbon 7.3.0\n// https://www.bourbon.io/\n// Copyright 2011-2020 thoughtbot, inc.\n// MIT License\n\n@import \"bourbon/helpers/buttons-list\";\n@import \"bourbon/helpers/scales\";\n@import \"bourbon/helpers/text-inputs-list\";\n\n@import \"bourbon/settings/settings\";\n\n@import \"bourbon/validators/contains\";\n@import \"bourbon/validators/contains-falsy\";\n@import \"bourbon/validators/is-color\";\n@import \"bourbon/validators/is-length\";\n@import \"bourbon/validators/is-number\";\n@import \"bourbon/validators/is-size\";\n\n@import \"bourbon/utilities/assign-inputs\";\n@import \"bourbon/utilities/compact-shorthand\";\n@import \"bourbon/utilities/directional-property\";\n@import \"bourbon/utilities/fetch-bourbon-setting\";\n@import \"bourbon/utilities/font-source-declaration\";\n@import \"bourbon/utilities/gamma\";\n@import \"bourbon/utilities/lightness\";\n@import \"bourbon/utilities/contrast-ratio\";\n@import \"bourbon/utilities/unpack-shorthand\";\n\n@import \"bourbon/library/border-color\";\n@import \"bourbon/library/border-radius\";\n@import \"bourbon/library/border-style\";\n@import \"bourbon/library/border-width\";\n@import \"bourbon/library/buttons\";\n@import \"bourbon/library/clearfix\";\n@import \"bourbon/library/contrast-switch\";\n@import \"bourbon/library/ellipsis\";\n@import \"bourbon/library/font-face\";\n@import \"bourbon/library/font-stacks\";\n@import \"bourbon/library/hide-text\";\n@import \"bourbon/library/hide-visually\";\n@import \"bourbon/library/margin\";\n@import \"bourbon/library/modular-scale\";\n@import \"bourbon/library/overflow-wrap\";\n@import \"bourbon/library/padding\";\n@import \"bourbon/library/position\";\n@import \"bourbon/library/prefixer\";\n@import \"bourbon/library/shade\";\n@import \"bourbon/library/size\";\n@import \"bourbon/library/strip-unit\";\n@import \"bourbon/library/text-inputs\";\n@import \"bourbon/library/timing-functions\";\n@import \"bourbon/library/tint\";\n@import \"bourbon/library/triangle\";\n@import \"bourbon/library/value-prefixer\";\n"
  },
  {
    "path": "core/bourbon/helpers/_buttons-list.scss",
    "content": "@charset \"UTF-8\";\n\n/// A list of all HTML button elements.\n///\n/// @type list\n///\n/// @access private\n\n$_buttons-list: (\n  \"button\",\n  \"[type='button']\",\n  \"[type='reset']\",\n  \"[type='submit']\",\n);\n"
  },
  {
    "path": "core/bourbon/helpers/_scales.scss",
    "content": "@charset \"UTF-8\";\n\n////\n/// Pre-defined scales for use with the `modular-scale` function.\n///\n/// @type number (unitless)\n///\n/// @see {function} modular-scale\n////\n\n$minor-second: 1.067;\n$major-second: 1.125;\n$minor-third: 1.2;\n$major-third: 1.25;\n$perfect-fourth: 1.333;\n$augmented-fourth: 1.414;\n$perfect-fifth: 1.5;\n$minor-sixth: 1.6;\n$golden: 1.618;\n$major-sixth: 1.667;\n$minor-seventh: 1.778;\n$major-seventh: 1.875;\n$octave: 2;\n$major-tenth: 2.5;\n$major-eleventh: 2.667;\n$major-twelfth: 3;\n$double-octave: 4;\n"
  },
  {
    "path": "core/bourbon/helpers/_text-inputs-list.scss",
    "content": "@charset \"UTF-8\";\n\n/// A list of all _text-based_ HTML inputs.\n///\n/// @type list\n///\n/// @access private\n\n$_text-inputs-list: (\n  \"[type='color']\",\n  \"[type='date']\",\n  \"[type='datetime']\",\n  \"[type='datetime-local']\",\n  \"[type='email']\",\n  \"[type='month']\",\n  \"[type='number']\",\n  \"[type='password']\",\n  \"[type='search']\",\n  \"[type='tel']\",\n  \"[type='text']\",\n  \"[type='time']\",\n  \"[type='url']\",\n  \"[type='week']\",\n  \"input:not([type])\",\n  \"textarea\",\n);\n"
  },
  {
    "path": "core/bourbon/library/_border-color.scss",
    "content": "@charset \"UTF-8\";\n\n/// Provides a concise, one-line method for setting `border-color` on specific\n/// edges of a box. Use a `null` value to “skip” edges of the box with standard\n/// CSS shorthand.\n///\n/// @argument {list} $values\n///   List of colors; accepts CSS shorthand.\n///\n/// @example scss\n///   .element {\n///     @include border-color(#a60b55 #76cd9c null #e8ae1a);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     border-left-color: #e8ae1a;\n///     border-right-color: #76cd9c;\n///     border-top-color: #a60b55;\n///   }\n///\n/// @require {mixin} _directional-property\n\n@mixin border-color($values) {\n  @include _directional-property(border, color, $values);\n}\n"
  },
  {
    "path": "core/bourbon/library/_border-radius.scss",
    "content": "@charset \"UTF-8\";\n\n/// Provides a concise, one-line method for setting `border-radius` on both the\n/// top-left and top-right of a box.\n///\n/// @argument {number (with unit)} $radii\n///\n/// @example scss\n///   .element {\n///     @include border-top-radius(4px);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     border-top-left-radius: 4px;\n///     border-top-right-radius: 4px;\n///   }\n\n@mixin border-top-radius($radii) {\n  border-top-left-radius: $radii;\n  border-top-right-radius: $radii;\n}\n\n/// Provides a concise, one-line method for setting `border-radius` on both the\n/// top-right and bottom-right of a box.\n///\n/// @argument {number (with unit)} $radii\n///\n/// @example scss\n///   .element {\n///     @include border-right-radius(3px);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     border-bottom-right-radius: 3px;\n///     border-top-right-radius: 3px;\n///   }\n\n@mixin border-right-radius($radii) {\n  border-bottom-right-radius: $radii;\n  border-top-right-radius: $radii;\n}\n\n/// Provides a concise, one-line method for setting `border-radius` on both the\n/// bottom-left and bottom-right of a box.\n///\n/// @argument {number (with unit)} $radii\n///\n/// @example scss\n///   .element {\n///     @include border-bottom-radius(2px);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     border-bottom-left-radius: 2px;\n///     border-bottom-right-radius: 2px;\n///   }\n\n@mixin border-bottom-radius($radii) {\n  border-bottom-left-radius: $radii;\n  border-bottom-right-radius: $radii;\n}\n\n/// Provides a concise, one-line method for setting `border-radius` on both the\n/// top-left and bottom-left of a box.\n///\n/// @argument {number (with unit)} $radii\n///\n/// @example scss\n///   .element {\n///     @include border-left-radius(1px);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     border-bottom-left-radius: 1px;\n///     border-top-left-radius: 1px;\n///   }\n\n@mixin border-left-radius($radii) {\n  border-bottom-left-radius: $radii;\n  border-top-left-radius: $radii;\n}\n"
  },
  {
    "path": "core/bourbon/library/_border-style.scss",
    "content": "@charset \"UTF-8\";\n\n/// Provides a concise, one-line method for setting `border-style` on specific\n/// edges of a box. Use a `null` value to “skip” edges of the box with standard\n/// CSS shorthand.\n///\n/// @argument {list} $values\n///   List of border styles; accepts CSS shorthand.\n///\n/// @example scss\n///   .element {\n///     @include border-style(dashed null solid);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     border-bottom-style: solid;\n///     border-top-style: dashed;\n///   }\n///\n/// @require {mixin} _directional-property\n\n@mixin border-style($values) {\n  @include _directional-property(border, style, $values);\n}\n"
  },
  {
    "path": "core/bourbon/library/_border-width.scss",
    "content": "@charset \"UTF-8\";\n\n/// Provides a concise, one-line method for setting `border-width` on specific\n/// edges of a box. Use a `null` value to “skip” edges of the box with standard\n/// CSS shorthand.\n///\n/// @argument {list} $values\n///   List of border widths; accepts CSS shorthand.\n///\n/// @example scss\n///   .element {\n///     @include border-width(1em null 20px);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     border-bottom-width: 20px;\n///     border-top-width: 1em;\n///   }\n///\n/// @require {mixin} _directional-property\n\n@mixin border-width($values) {\n  @include _directional-property(border, width, $values);\n}\n"
  },
  {
    "path": "core/bourbon/library/_buttons.scss",
    "content": "@charset \"UTF-8\";\n\n////\n/// @type list\n///\n/// @require {function} _assign-inputs\n///\n/// @require {variable} $_buttons-list\n////\n\n/// A list of all HTML button elements. Please note that you must interpolate\n/// the variable (`#{}`) to use it as a selector.\n///\n/// @example scss\n///   #{$all-buttons} {\n///     background-color: #f00;\n///   }\n///\n///   // CSS Output\n///   button,\n///   [type='button'],\n///   [type='reset'],\n///   [type='submit'] {\n///     background-color: #f00;\n///   }\n\n$all-buttons: _assign-inputs($_buttons-list);\n\n/// A list of all HTML button elements with the `:active` pseudo-class applied.\n/// Please note that you must interpolate the variable (`#{}`) to use it as a\n/// selector.\n///\n/// @example scss\n///   #{$all-buttons-active} {\n///     background-color: #00f;\n///   }\n///\n///   // CSS Output\n///   button:active,\n///   [type='button']:active,\n///   [type='reset']:active,\n///   [type='submit']:active {\n///     background-color: #00f;\n///   }\n\n$all-buttons-active: _assign-inputs($_buttons-list, active);\n\n/// A list of all HTML button elements with the `:focus` pseudo-class applied.\n/// Please note that you must interpolate the variable (`#{}`) to use it as a\n/// selector.\n///\n/// @example scss\n///   #{$all-buttons-focus} {\n///     background-color: #0f0;\n///   }\n///\n///   // CSS Output\n///   button:focus,\n///   [type='button']:focus,\n///   [type='reset']:focus,\n///   [type='submit']:focus {\n///     background-color: #0f0;\n///   }\n\n$all-buttons-focus: _assign-inputs($_buttons-list, focus);\n\n/// A list of all HTML button elements with the `:hover` pseudo-class applied.\n/// Please note that you must interpolate the variable (`#{}`) to use it as a\n/// selector.\n///\n/// @example scss\n///   #{$all-buttons-hover} {\n///     background-color: #0f0;\n///   }\n///\n///   // CSS Output\n///   button:hover,\n///   [type='button']:hover,\n///   [type='reset']:hover,\n///   [type='submit']:hover {\n///     background-color: #0f0;\n///   }\n\n$all-buttons-hover: _assign-inputs($_buttons-list, hover);\n"
  },
  {
    "path": "core/bourbon/library/_clearfix.scss",
    "content": "@charset \"UTF-8\";\n\n/// Provides an easy way to include a clearfix for containing floats.\n///\n/// @link https://goo.gl/yP5hiZ\n///\n/// @example scss\n///   .element {\n///     @include clearfix;\n///   }\n///\n///   // CSS Output\n///   .element::after {\n///     clear: both;\n///     content: \"\";\n///     display: block;\n///   }\n\n@mixin clearfix {\n  &::after {\n    clear: both;\n    content: \"\";\n    display: block;\n  }\n}\n"
  },
  {
    "path": "core/bourbon/library/_contrast-switch.scss",
    "content": "@charset \"UTF-8\";\n\n/// Switches between two colors based on the contrast to another color. It’s\n/// like a [ternary operator] for color contrast and can be useful for building\n/// a button system.\n///\n/// The calculation of the contrast ratio is based on the [WCAG 2.0\n/// specification]. However, we cannot guarantee full compliance, though all of\n/// our manual testing passed.\n///\n///   [ternary operator]: https://goo.gl/ccfLqi\n///   [WCAG 2.0 specification]: https://goo.gl/zhQuYA\n///\n/// @argument {color} $base-color\n///   The color to evaluate lightness against.\n///\n/// @argument {color} $dark-color [#000]\n///   The color to be output when `$base-color` is light. Can also be set\n///   globally using the `contrast-switch-dark-color` key in the\n///   Bourbon settings.\n///\n/// @argument {color} $light-color [#fff]\n///   The color to be output when `$base-color` is dark. Can also be set\n///   globally using the `contrast-switch-light-color` key in the\n///   Bourbon settings.\n///\n/// @return {color}\n///\n/// @example scss\n///   .element {\n///     color: contrast-switch(#bae6e6);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     color: #000;\n///   }\n///\n/// @example scss\n///   .element {\n///     $button-color: #2d72d9;\n///     background-color: $button-color;\n///     color: contrast-switch($button-color, #222, #eee);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     background-color: #2d72d9;\n///     color: #eee;\n///   }\n///\n/// @require {function} _fetch-bourbon-setting\n///\n/// @require {function} _is-color\n///\n/// @require {function} _contrast-ratio\n///\n/// @since 5.0.0\n\n@function contrast-switch(\n  $base-color,\n  $dark-color: _fetch-bourbon-setting(\"contrast-switch-dark-color\"),\n  $light-color: _fetch-bourbon-setting(\"contrast-switch-light-color\")\n) {\n  @if not _is-color($base-color) {\n    @error \"`#{$base-color}` is not a valid color for the `$base-color` \" +\n      \"argument in the `contrast-switch` function.\";\n  } @else if not _is-color($dark-color) {\n    @error \"`#{$dark-color}` is not a valid color for the `$dark-color` \" +\n      \"argument in the `contrast-switch` function.\";\n  } @else if not _is-color($light-color) {\n    @error \"`#{$light-color}` is not a valid color for the `$light-color` \" +\n      \"argument in the `contrast-switch` function.\";\n  } @else {\n    $-contrast-to-dark: _contrast-ratio($base-color, $dark-color);\n    $-contrast-to-light: _contrast-ratio($base-color, $light-color);\n    $-prefer-dark: $-contrast-to-dark >= $-contrast-to-light;\n\n    @return if($-prefer-dark, $dark-color, $light-color);\n  }\n}\n"
  },
  {
    "path": "core/bourbon/library/_ellipsis.scss",
    "content": "@charset \"UTF-8\";\n\n/// Truncates text and adds an ellipsis to represent overflow.\n///\n/// @argument {number} $width [100%]\n///   The `max-width` for the string to respect before being truncated.\n///\n/// @argument {string} $display [inline-block]\n///   Sets the display-value of the element.\n///\n/// @example scss\n///   .element {\n///     @include ellipsis;\n///   }\n///\n///   // CSS Output\n///   .element {\n///     display: inline-block;\n///     max-width: 100%;\n///     overflow: hidden;\n///     text-overflow: ellipsis;\n///     white-space: nowrap;\n///     word-wrap: normal;\n///   }\n\n@mixin ellipsis(\n  $width: 100%,\n  $display: inline-block\n) {\n  display: $display;\n  max-width: $width;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  word-wrap: normal;\n}\n"
  },
  {
    "path": "core/bourbon/library/_font-face.scss",
    "content": "@charset \"UTF-8\";\n\n/// Generates an `@font-face` declaration. You can choose the specific file\n/// formats you need to output; the mixin supports `woff2`\n/// and `woff`. The mixin also supports usage with the Rails Asset Pipeline,\n/// which you can enable per use, or globally in the `$bourbon()` settings.\n///\n/// @argument {string} $font-family\n///\n/// @argument {string} $file-path\n///\n/// @argument {string | list} $file-formats [(\"woff2\", \"woff\")]\n///   List of the font file formats to include. Can also be set globally using\n///   the `global-font-file-formats` key in the Bourbon settings.\n///\n/// @argument {boolean} $asset-pipeline [false]\n///   Set to `true` if you’re using the Rails Asset Pipeline (place the fonts\n///   in `app/assets/fonts/`). Can also be set globally using the\n///   `rails-asset-pipeline` key in the Bourbon settings.\n///\n/// @content\n///   Any additional CSS properties that are included in the `@include`\n///   directive will be output within the `@font-face` declaration, e.g. you can\n///   pass in `font-weight`, `font-style` and/or `unicode-range`.\n///\n/// @example scss\n///   @include font-face(\n///     \"source-sans-pro\",\n///     \"fonts/source-sans-pro-regular\",\n///     (\"woff2\", \"woff\")\n///   ) {\n///     font-style: normal;\n///     font-weight: 400;\n///   }\n///\n///   // CSS Output\n///   @font-face {\n///     font-family: \"source-sans-pro\";\n///     src: url(\"fonts/source-sans-pro-regular.woff2\") format(\"woff2\"),\n///          url(\"fonts/source-sans-pro-regular.woff\") format(\"woff\");\n///     font-style: normal;\n///     font-weight: 400;\n///   }\n///\n/// @require {function} _font-source-declaration\n///\n/// @require {function} _fetch-bourbon-setting\n\n@mixin font-face(\n  $font-family,\n  $file-path,\n  $file-formats: _fetch-bourbon-setting(\"global-font-file-formats\"),\n  $asset-pipeline: _fetch-bourbon-setting(\"rails-asset-pipeline\")\n) {\n  @font-face {\n    font-family: $font-family;\n    src: _font-source-declaration(\n      $font-family,\n      $file-path,\n      $asset-pipeline,\n      $file-formats\n    );\n    @content;\n  }\n}\n"
  },
  {
    "path": "core/bourbon/library/_font-stacks.scss",
    "content": "@charset \"UTF-8\";\n\n/// A variable that outputs a Helvetica font stack.\n///\n/// @link https://goo.gl/uSJvZe\n///\n/// @type list\n///\n/// @example scss\n///   .element {\n///     font-family: $font-stack-helvetica;\n///   }\n///\n///   // CSS Output\n///   .element {\n///     font-family: \"Helvetica Neue\", \"Helvetica\", \"Arial\", sans-serif;\n///   }\n\n$font-stack-helvetica: (\n  \"Helvetica Neue\",\n  \"Helvetica\",\n  \"Arial\",\n  sans-serif,\n);\n\n/// A variable that outputs a Lucida Grande font stack.\n///\n/// @link https://goo.gl/R5UyYE\n///\n/// @type list\n///\n/// @example scss\n///   .element {\n///     font-family: $font-stack-lucida-grande;\n///   }\n///\n///   // CSS Output\n///   .element {\n///     font-family: \"Lucida Grande\", \"Lucida Sans Unicode\", \"Geneva\", \"Verdana\", sans-serif;\n///   }\n\n$font-stack-lucida-grande: (\n  \"Lucida Grande\",\n  \"Lucida Sans Unicode\",\n  \"Geneva\",\n  \"Verdana\",\n  sans-serif,\n);\n\n/// A variable that outputs a Verdana font stack.\n///\n/// @link https://goo.gl/yGXWSS\n///\n/// @type list\n///\n/// @example scss\n///   .element {\n///     font-family: $font-stack-verdana;\n///   }\n///\n///   // CSS Output\n///   .element {\n///     font-family: \"Verdana\", \"Geneva\", sans-serif;\n///   }\n\n$font-stack-verdana: (\n  \"Verdana\",\n  \"Geneva\",\n  sans-serif,\n);\n\n/// A variable that outputs a system font stack.\n///\n/// @type list\n///\n/// @example scss\n///   .element {\n///     font-family: $font-stack-system;\n///   }\n///\n///   // CSS Output\n///   .element {\n///     font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Avenir Next\", \"Avenir\", \"Segoe UI\", \"Lucida Grande\", \"Helvetica Neue\", \"Helvetica\", \"Fira Sans\", \"Roboto\", \"Noto\", \"Droid Sans\", \"Cantarell\", \"Oxygen\", \"Ubuntu\", \"Franklin Gothic Medium\", \"Century Gothic\", \"Liberation Sans\", sans-serif;\n///   }\n\n$font-stack-system: (\n  system-ui,\n  -apple-system,\n  BlinkMacSystemFont,\n  \"Avenir Next\",\n  \"Avenir\",\n  \"Segoe UI\",\n  \"Lucida Grande\",\n  \"Helvetica Neue\",\n  \"Helvetica\",\n  \"Fira Sans\",\n  \"Roboto\",\n  \"Noto\",\n  \"Droid Sans\",\n  \"Cantarell\",\n  \"Oxygen\",\n  \"Ubuntu\",\n  \"Franklin Gothic Medium\",\n  \"Century Gothic\",\n  \"Liberation Sans\",\n  sans-serif,\n);\n\n/// A variable that outputs a Garamond font stack.\n///\n/// @link https://goo.gl/QQFEkV\n///\n/// @type list\n///\n/// @example scss\n///   .element {\n///     font-family: $font-stack-garamond;\n///   }\n///\n///   // CSS Output\n///   .element {\n///     font-family: \"Garamond\", \"Baskerville\", \"Baskerville Old Face\", \"Hoefler Text\", \"Times New Roman\", serif;\n///   }\n\n$font-stack-garamond: (\n  \"Garamond\",\n  \"Baskerville\",\n  \"Baskerville Old Face\",\n  \"Hoefler Text\",\n  \"Times New Roman\",\n  serif,\n);\n\n/// A variable that outputs a Georgia font stack.\n///\n/// @link https://goo.gl/wtzVPy\n///\n/// @type list\n///\n/// @example scss\n///   .element {\n///     font-family: $font-stack-georgia;\n///   }\n///\n///   // CSS Output\n///   .element {\n///     font-family: \"Georgia\", \"Times\", \"Times New Roman\", serif;\n///   }\n\n$font-stack-georgia: (\n  \"Georgia\",\n  \"Times\",\n  \"Times New Roman\",\n  serif,\n);\n\n/// A variable that outputs a Hoefler Text font stack.\n///\n/// @link https://goo.gl/n7U7zx\n///\n/// @type list\n///\n/// @example scss\n///   .element {\n///     font-family: $font-stack-hoefler-text;\n///   }\n///\n///   // CSS Output\n///   .element {\n///     font-family: \"Hoefler Text\", \"Baskerville Old Face\", \"Garamond\", \"Times New Roman\", serif;\n///   }\n\n$font-stack-hoefler-text: (\n  \"Hoefler Text\",\n  \"Baskerville Old Face\",\n  \"Garamond\",\n  \"Times New Roman\",\n  serif,\n);\n\n/// A variable that outputs a Consolas font stack.\n///\n/// @link https://goo.gl/iKrtqv\n///\n/// @type list\n///\n/// @example scss\n///   .element {\n///     font-family: $font-stack-consolas;\n///   }\n///\n///   // CSS Output\n///   .element {\n///     font-family: \"Consolas\", \"monaco\", monospace;\n///   }\n\n$font-stack-consolas: (\n  \"Consolas\",\n  \"monaco\",\n  monospace,\n);\n\n/// A variable that outputs a Courier New font stack.\n///\n/// @link https://goo.gl/bHfWMP\n///\n/// @type list\n///\n/// @example scss\n///   .element {\n///     font-family: $font-stack-courier-new;\n///   }\n///\n///   // CSS Output\n///   .element {\n///     font-family: \"Courier New\", \"Courier\", \"Lucida Sans Typewriter\", \"Lucida Typewriter\", monospace;\n///   }\n\n$font-stack-courier-new: (\n  \"Courier New\",\n  \"Courier\",\n  \"Lucida Sans Typewriter\",\n  \"Lucida Typewriter\",\n  monospace,\n);\n\n/// A variable that outputs a Monaco font stack.\n///\n/// @link https://goo.gl/9PgKDO\n///\n/// @type list\n///\n/// @example scss\n///   .element {\n///     font-family: $font-stack-monaco;\n///   }\n///\n///   // CSS Output\n///   .element {\n///     font-family: \"Monaco\", \"Consolas\", \"Lucida Console\", monospace;\n///   }\n\n$font-stack-monaco: (\n  \"Monaco\",\n  \"Consolas\",\n  \"Lucida Console\",\n  monospace,\n);\n"
  },
  {
    "path": "core/bourbon/library/_hide-text.scss",
    "content": "@charset \"UTF-8\";\n\n/// Hides the text in an element, commonly used to show an image instead. Some\n/// elements will need block-level styles applied.\n///\n/// @link https://goo.gl/EvLRIu\n///\n/// @example scss\n///   .element {\n///     @include hide-text;\n///   }\n///\n///   // CSS Output\n///   .element {\n///     overflow: hidden;\n///     text-indent: 101%;\n///     white-space: nowrap;\n///   }\n\n@mixin hide-text {\n  overflow: hidden;\n  text-indent: 101%;\n  white-space: nowrap;\n}\n"
  },
  {
    "path": "core/bourbon/library/_hide-visually.scss",
    "content": "@charset \"UTF-8\";\n\n/// Hides an element visually while still allowing the content to be accessible\n/// to assistive technology, e.g. screen readers. Passing `unhide` will reverse\n/// the affects of the hiding, which is handy for showing the element on focus,\n/// for example.\n///\n/// @link https://goo.gl/Vf1TGn\n///\n/// @argument {string} $toggle [hide]\n///   Accepts `hide` or `unhide`. `unhide` reverses the affects of `hide`.\n///\n/// @example scss\n///   .element {\n///     @include hide-visually;\n///\n///     &:active,\n///     &:focus {\n///       @include hide-visually(\"unhide\");\n///     }\n///   }\n///\n///   // CSS Output\n///   .element {\n///     border: 0;\n///     clip: rect(1px, 1px, 1px, 1px);\n///     clip-path: inset(100%);\n///     height: 1px;\n///     overflow: hidden;\n///     padding: 0;\n///     position: absolute;\n///     width: 1px;\n///   }\n///\n///   .hide-visually:active,\n///   .hide-visually:focus {\n///     clip: auto;\n///     clip-path: none;\n///     height: auto;\n///     overflow: visible;\n///     position: static;\n///     width: auto;\n///   }\n///\n/// @since 5.0.0\n\n@mixin hide-visually($toggle: \"hide\") {\n  @if not index(\"hide\" \"unhide\", $toggle) {\n    @error \"`#{$toggle}` is not a valid value for the `$toggle` argument in \" +\n      \"the `hide-visually` mixin. Must be either `hide` or `unhide`.\";\n  } @else if $toggle == \"hide\" {\n    border: 0;\n    clip: rect(1px, 1px, 1px, 1px);\n    clip-path: inset(100%);\n    height: 1px;\n    overflow: hidden;\n    padding: 0;\n    position: absolute;\n    white-space: nowrap;\n    width: 1px;\n  } @else if $toggle == \"unhide\" {\n    clip: auto;\n    clip-path: none;\n    height: auto;\n    overflow: visible;\n    position: static;\n    white-space: inherit;\n    width: auto;\n  }\n}\n"
  },
  {
    "path": "core/bourbon/library/_margin.scss",
    "content": "@charset \"UTF-8\";\n\n/// Provides a concise, one-line method for setting `margin` on specific edges\n/// of a box. Use a `null` value to “skip” edges of the box with standard\n/// CSS shorthand.\n///\n/// @argument {list} $values\n///   List of margin values; accepts CSS shorthand.\n///\n/// @example scss\n///   .element {\n///     @include margin(null auto);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     margin-left: auto;\n///     margin-right: auto;\n///   }\n///\n/// @example scss\n///   .element {\n///     @include margin(10px 3em 20vh null);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     margin-bottom: 20vh;\n///     margin-right: 3em;\n///     margin-top: 10px;\n///   }\n///\n/// @require {mixin} _directional-property\n\n@mixin margin($values) {\n  @include _directional-property(margin, null, $values);\n}\n"
  },
  {
    "path": "core/bourbon/library/_modular-scale.scss",
    "content": "@charset \"UTF-8\";\n\n/// Increments up or down a defined scale and returns an adjusted value. This\n/// helps establish consistent measurements and spacial relationships throughout\n/// your project. We provide a list of commonly used scales as\n/// [pre-defined variables][scales].\n///\n/// [scales]: https://github.com/thoughtbot/bourbon/blob/master/core/bourbon/helpers/_scales.scss\n///\n/// @argument {number (unitless)} $increment\n///   How many steps to increment up or down the scale.\n///\n/// @argument {number (with unit) | list} $value [1em]\n///   The base value the scale starts at. Can also be set globally using the\n///   `modular-scale-base` key in the Bourbon settings.\n///\n/// @argument {number (unitless)} $ratio [1.25]\n///   The ratio the scale is built on. Can also be set globally using the\n///   `modular-scale-ratio` key in the Bourbon settings.\n///\n/// @return {number (with unit)}\n///\n/// @example scss\n///   .element {\n///     font-size: modular-scale(2);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     font-size: 1.5625em;\n///   }\n///\n/// @example scss\n///   .element {\n///     margin-right: modular-scale(3, 2em);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     margin-right: 3.90625em;\n///   }\n///\n/// @example scss\n///   .element {\n///     font-size: modular-scale(3, 1em 1.6em, $major-seventh);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     font-size: 3em;\n///   }\n///\n/// @example scss\n///   // Globally change the base ratio\n///   $bourbon: (\n///     \"modular-scale-ratio\": 1.2,\n///   );\n///\n///   .element {\n///     font-size: modular-scale(3);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     font-size: 1.728em;\n///   }\n///\n/// @require {function} _fetch-bourbon-setting\n\n@function modular-scale(\n  $increment,\n  $value: _fetch-bourbon-setting(\"modular-scale-base\"),\n  $ratio: _fetch-bourbon-setting(\"modular-scale-ratio\")\n) {\n  $v1: nth($value, 1);\n  $v2: nth($value, length($value));\n  $value: $v1;\n\n  // scale $v2 to just above $v1\n  @while $v2 > $v1 {\n    $v2: ($v2 / $ratio); // will be off-by-1\n  }\n  @while $v2 < $v1 {\n    $v2: ($v2 * $ratio); // will fix off-by-1\n  }\n\n  // check AFTER scaling $v2 to prevent double-counting corner-case\n  $double-stranded: $v2 > $v1;\n\n  @if $increment > 0 {\n    @for $i from 1 through $increment {\n      @if $double-stranded and ($v1 * $ratio) > $v2 {\n        $value: $v2;\n        $v2: ($v2 * $ratio);\n      } @else {\n        $v1: ($v1 * $ratio);\n        $value: $v1;\n      }\n    }\n  }\n\n  @if $increment < 0 {\n    // adjust $v2 to just below $v1\n    @if $double-stranded {\n      $v2: ($v2 / $ratio);\n    }\n\n    @for $i from $increment through -1 {\n      @if $double-stranded and ($v1 / $ratio) < $v2 {\n        $value: $v2;\n        $v2: ($v2 / $ratio);\n      } @else {\n        $v1: ($v1 / $ratio);\n        $value: $v1;\n      }\n    }\n  }\n\n  @return $value;\n}\n"
  },
  {
    "path": "core/bourbon/library/_overflow-wrap.scss",
    "content": "@charset \"UTF-8\";\n\n/// Outputs the `overflow-wrap` property and its legacy name `word-wrap` to\n/// support browsers that do not yet use `overflow-wrap`.\n///\n/// @argument {string} $wrap [break-word]\n///   Accepted CSS values are `normal`, `break-word`, `inherit`, `initial`,\n///   or `unset`.\n///\n/// @example scss\n///   .wrapper {\n///     @include overflow-wrap;\n///   }\n///\n///   // CSS Output\n///   .wrapper {\n///     word-wrap: break-word;\n///     overflow-wrap: break-word;\n///   }\n\n@mixin overflow-wrap($wrap: break-word) {\n  word-wrap: $wrap;\n  // stylelint-disable-next-line order/properties-alphabetical-order\n  overflow-wrap: $wrap;\n}\n"
  },
  {
    "path": "core/bourbon/library/_padding.scss",
    "content": "@charset \"UTF-8\";\n\n/// Provides a concise method for targeting `padding` on specific sides of a\n/// box. Use a `null` value to “skip” a side.\n///\n/// @argument {list} $values\n///   List of padding values; accepts CSS shorthand.\n///\n/// @example scss\n///   .element-one {\n///     @include padding(null 1rem);\n///   }\n///\n///   // CSS Output\n///   .element-one {\n///     padding-left: 1rem;\n///     padding-right: 1rem;\n///   }\n///\n/// @example scss\n///   .element-two {\n///     @include padding(10vh null 10px 5%);\n///   }\n///\n///   // CSS Output\n///   .element-two {\n///     padding-bottom: 10px;\n///     padding-left: 5%;\n///     padding-top: 10vh;\n///   }\n///\n/// @require {mixin} _directional-property\n\n@mixin padding($values) {\n  @include _directional-property(padding, null, $values);\n}\n"
  },
  {
    "path": "core/bourbon/library/_position.scss",
    "content": "@charset \"UTF-8\";\n\n/// Provides a concise, one-line method for setting an element’s positioning\n/// properties: `position`, `top`, `right`, `bottom` and `left`. Use a `null`\n/// value to “skip” an edge of the box.\n///\n/// @argument {string} $position\n///   A CSS position value.\n///\n/// @argument {list} $box-edge-values\n///   List of lengths; accepts CSS shorthand.\n///\n/// @example scss\n///   .element {\n///     @include position(relative, 0 null null 10em);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     left: 10em;\n///     position: relative;\n///     top: 0;\n///   }\n///\n/// @example scss\n///   .element {\n///     @include position(absolute, 0);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     position: absolute;\n///     top: 0;\n///     right: 0;\n///     bottom: 0;\n///     left: 0;\n///   }\n///\n/// @require {function} _is-length\n///\n/// @require {function} _unpack-shorthand\n\n@mixin position(\n  $position,\n  $box-edge-values\n) {\n  $box-edge-values: _unpack-shorthand($box-edge-values);\n  $offsets: (\n    \"top\": nth($box-edge-values, 1),\n    \"right\": nth($box-edge-values, 2),\n    \"bottom\": nth($box-edge-values, 3),\n    \"left\": nth($box-edge-values, 4),\n  );\n\n  position: $position;\n\n  @each $offset, $value in $offsets {\n    @if _is-length($value) {\n      #{$offset}: $value;\n    }\n  }\n}\n"
  },
  {
    "path": "core/bourbon/library/_prefixer.scss",
    "content": "@charset \"UTF-8\";\n\n/// Generates vendor prefixes.\n///\n/// @argument {string} $property\n///   Property to prefix.\n///\n/// @argument {string} $value\n///   Value to use.\n///\n/// @argument {list} $prefixes\n///   Vendor prefixes to output.\n///\n/// @example scss\n///   .element {\n///     @include prefixer(appearance, none, (\"webkit\", \"moz\"));\n///   }\n///\n///   // CSS Output\n///   .element {\n///     -webkit-appearance: none;\n///     -moz-appearance: none;\n///     appearance: none;\n///   }\n///\n/// @author Hugo Giraudel\n\n@mixin prefixer(\n  $property,\n  $value,\n  $prefixes: ()\n) {\n  @each $prefix in $prefixes {\n    #{\"-\" + $prefix + \"-\" + $property}: $value;\n  }\n  #{$property}: $value;\n}\n"
  },
  {
    "path": "core/bourbon/library/_shade.scss",
    "content": "@charset \"UTF-8\";\n\n/// Mixes a color with black.\n///\n/// @argument {color} $color\n///\n/// @argument {number (percentage)} $percent\n///   The amount of black to be mixed in.\n///\n/// @return {color}\n///\n/// @example scss\n///   .element {\n///     background-color: shade(#ffbb52, 60%);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     background-color: #664a20;\n///   }\n\n@function shade(\n  $color,\n  $percent\n) {\n  @if not _is-color($color) {\n    @error \"`#{$color}` is not a valid color for the `$color` argument in \" +\n      \"the `shade` mixin.\";\n  } @else {\n    @return mix(#000, $color, $percent);\n  }\n}\n"
  },
  {
    "path": "core/bourbon/library/_size.scss",
    "content": "@charset \"UTF-8\";\n\n/// Sets the `width` and `height` of the element in one statement.\n///\n/// @argument {number (with unit) | string} $width\n///\n/// @argument {number (with unit) | string} $height [$width]\n///\n/// @example scss\n///   .first-element {\n///     @include size(2em);\n///   }\n///\n///   // CSS Output\n///   .first-element {\n///     width: 2em;\n///     height: 2em;\n///   }\n///\n/// @example scss\n///   .second-element {\n///     @include size(auto, 10em);\n///   }\n///\n///   // CSS Output\n///   .second-element {\n///     width: auto;\n///     height: 10em;\n///   }\n///\n/// @require {function} _is-size\n\n@mixin size(\n  $width,\n  $height: $width\n) {\n  @if _is-size($height) {\n    height: $height;\n  } @else {\n    @error \"`#{$height}` is not a valid length for the `$height` argument \" +\n      \"in the `size` mixin.\";\n  }\n\n  @if _is-size($width) {\n    width: $width;\n  } @else {\n    @error \"`#{$width}` is not a valid length for the `$width` argument \" +\n      \"in the `size` mixin.\";\n  }\n}\n"
  },
  {
    "path": "core/bourbon/library/_strip-unit.scss",
    "content": "@charset \"UTF-8\";\n\n/// Strips the unit from a number.\n///\n/// @argument {number} $value\n///\n/// @return {number (unitless)}\n///\n/// @example scss\n///   $dimension: strip-unit(10em);\n///\n///   // Output\n///   $dimension: 10;\n\n@function strip-unit($value) {\n  @return ($value / ($value * 0 + 1));\n}\n"
  },
  {
    "path": "core/bourbon/library/_text-inputs.scss",
    "content": "@charset \"UTF-8\";\n\n////\n/// @type list\n///\n/// @require {function} _assign-inputs\n///\n/// @require {variable} $_text-inputs-list\n////\n\n/// A list of all _text-based_ HTML inputs. Please note that you must\n/// interpolate the variable (`#{}`) to use it as a selector.\n///\n/// @example scss\n///   #{$all-text-inputs} {\n///     border: 1px solid #ccc;\n///   }\n///\n///   // CSS Output\n///   [type='color'],\n///   [type='date'],\n///   [type='datetime'],\n///   [type='datetime-local'],\n///   [type='email'],\n///   [type='month'],\n///   [type='number'],\n///   [type='password'],\n///   [type='search'],\n///   [type='tel'],\n///   [type='text'],\n///   [type='time'],\n///   [type='url'],\n///   [type='week'],\n///   input:not([type]),\n///   textarea {\n///     border: 1px solid #ccc;\n///   }\n\n$all-text-inputs: _assign-inputs($_text-inputs-list);\n\n/// A list of all _text-based_ HTML inputs with the `:active` pseudo-class\n/// applied. Please note that you must interpolate the variable (`#{}`) to use\n/// it as a selector.\n///\n/// @example scss\n///   #{$all-text-inputs-active} {\n///     border: 1px solid #aaa;\n///   }\n///\n///   // CSS Output\n///   [type='color']:active,\n///   [type='date']:active,\n///   [type='datetime']:active,\n///   [type='datetime-local']:active,\n///   [type='email']:active,\n///   [type='month']:active,\n///   [type='number']:active,\n///   [type='password']:active,\n///   [type='search']:active,\n///   [type='tel']:active,\n///   [type='text']:active,\n///   [type='time']:active,\n///   [type='url']:active,\n///   [type='week']:active,\n///   input:not([type]):active,\n///   textarea:active {\n///     border: 1px solid #aaa;\n///   }\n\n$all-text-inputs-active: _assign-inputs($_text-inputs-list, active);\n\n/// A list of all _text-based_ HTML inputs with the `:focus` pseudo-class\n/// applied. Please note that you must interpolate the variable (`#{}`) to use\n/// it as a selector.\n///\n/// @example scss\n///   #{$all-text-inputs-focus} {\n///     border: 1px solid #1565c0;\n///   }\n///\n///   // CSS Output\n///   [type='color']:focus,\n///   [type='date']:focus,\n///   [type='datetime']:focus,\n///   [type='datetime-local']:focus,\n///   [type='email']:focus,\n///   [type='month']:focus,\n///   [type='number']:focus,\n///   [type='password']:focus,\n///   [type='search']:focus,\n///   [type='tel']:focus,\n///   [type='text']:focus,\n///   [type='time']:focus,\n///   [type='url']:focus,\n///   [type='week']:focus,\n///   input:not([type]):focus,\n///   textarea:focus {\n///     border: 1px solid #1565c0;\n///   }\n\n$all-text-inputs-focus: _assign-inputs($_text-inputs-list, focus);\n\n/// A list of all _text-based_ HTML inputs with the `:hover` pseudo-class\n/// applied. Please note that you must interpolate the variable (`#{}`) to use\n/// it as a selector.\n///\n/// @example scss\n///   #{$all-text-inputs-hover} {\n///     border: 1px solid #aaa;\n///   }\n///\n///   // CSS Output\n///   [type='color']:hover,\n///   [type='date']:hover,\n///   [type='datetime']:hover,\n///   [type='datetime-local']:hover,\n///   [type='email']:hover,\n///   [type='month']:hover,\n///   [type='number']:hover,\n///   [type='password']:hover,\n///   [type='search']:hover,\n///   [type='tel']:hover,\n///   [type='text']:hover,\n///   [type='time']:hover,\n///   [type='url']:hover,\n///   [type='week']:hover,\n///   input:not([type]):hover,\n///   textarea:hover {\n///     border: 1px solid #aaa;\n///   }\n\n$all-text-inputs-hover: _assign-inputs($_text-inputs-list, hover);\n\n/// A list of all _text-based_ HTML inputs with the `:invalid` pseudo-class\n/// applied. Please note that you must interpolate the variable (`#{}`) to use\n/// it as a selector.\n///\n/// @example scss\n///   #{$all-text-inputs-invalid} {\n///     border: 1px solid #00f;\n///   }\n///\n///   // CSS Output\n///   [type='color']:invalid,\n///   [type='date']:invalid,\n///   [type='datetime']:invalid,\n///   [type='datetime-local']:invalid,\n///   [type='email']:invalid,\n///   [type='month']:invalid,\n///   [type='number']:invalid,\n///   [type='password']:invalid,\n///   [type='search']:invalid,\n///   [type='tel']:invalid,\n///   [type='text']:invalid,\n///   [type='time']:invalid,\n///   [type='url']:invalid,\n///   [type='week']:invalid,\n///   input:not([type]):invalid,\n///   textarea:invalid {\n///     border: 1px solid #00f;\n///   }\n\n$all-text-inputs-invalid: _assign-inputs($_text-inputs-list, invalid);\n"
  },
  {
    "path": "core/bourbon/library/_timing-functions.scss",
    "content": "@charset \"UTF-8\";\n\n////\n/// CSS cubic-bezier timing functions.\n///\n/// @link https://goo.gl/p8u6SK\n///\n/// @type string\n////\n\n$ease-in-quad: cubic-bezier(0.55, 0.085, 0.68, 0.53);\n$ease-in-cubic: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n$ease-in-quart: cubic-bezier(0.895, 0.03, 0.685, 0.22);\n$ease-in-quint: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n$ease-in-sine: cubic-bezier(0.47, 0, 0.745, 0.715);\n$ease-in-expo: cubic-bezier(0.95, 0.05, 0.795, 0.035);\n$ease-in-circ: cubic-bezier(0.6, 0.04, 0.98, 0.335);\n$ease-in-back: cubic-bezier(0.6, -0.28, 0.735, 0.045);\n\n$ease-out-quad: cubic-bezier(0.25, 0.46, 0.45, 0.94);\n$ease-out-cubic: cubic-bezier(0.215, 0.61, 0.355, 1);\n$ease-out-quart: cubic-bezier(0.165, 0.84, 0.44, 1);\n$ease-out-quint: cubic-bezier(0.23, 1, 0.32, 1);\n$ease-out-sine: cubic-bezier(0.39, 0.575, 0.565, 1);\n$ease-out-expo: cubic-bezier(0.19, 1, 0.22, 1);\n$ease-out-circ: cubic-bezier(0.075, 0.82, 0.165, 1);\n$ease-out-back: cubic-bezier(0.175, 0.885, 0.32, 1.275);\n\n$ease-in-out-quad: cubic-bezier(0.455, 0.03, 0.515, 0.955);\n$ease-in-out-cubic: cubic-bezier(0.645, 0.045, 0.355, 1);\n$ease-in-out-quart: cubic-bezier(0.77, 0, 0.175, 1);\n$ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1);\n$ease-in-out-sine: cubic-bezier(0.445, 0.05, 0.55, 0.95);\n$ease-in-out-expo: cubic-bezier(1, 0, 0, 1);\n$ease-in-out-circ: cubic-bezier(0.785, 0.135, 0.15, 0.86);\n$ease-in-out-back: cubic-bezier(0.68, -0.55, 0.265, 1.55);\n"
  },
  {
    "path": "core/bourbon/library/_tint.scss",
    "content": "@charset \"UTF-8\";\n\n/// Mixes a color with white.\n///\n/// @argument {color} $color\n///\n/// @argument {number (percentage)} $percent\n///   The amount of white to be mixed in.\n///\n/// @return {color}\n///\n/// @example scss\n///   .element {\n///     background-color: tint(#6ecaa6, 40%);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     background-color: #a8dfc9;\n///   }\n\n@function tint(\n  $color,\n  $percent\n) {\n  @if not _is-color($color) {\n    @error \"`#{$color}` is not a valid color for the `$color` argument in \" +\n      \"the `tint` mixin.\";\n  } @else {\n    @return mix(#fff, $color, $percent);\n  }\n}\n"
  },
  {
    "path": "core/bourbon/library/_triangle.scss",
    "content": "@charset \"UTF-8\";\n\n/// Generates a triangle pointing in a specified direction.\n///\n/// @argument {string} $direction\n///   The direction the triangle should point. Accepts `up`, `up-right`,\n///   `right`, `down-right`, `down`, `down-left`, `left` or `up-left`.\n///\n/// @argument {number (with unit)} $width\n///   Width of the triangle.\n///\n/// @argument {number (with unit)} $height\n///   Height of the triangle.\n///\n/// @argument {color} $color\n///   Color of the triangle.\n///\n/// @example scss\n///   .element {\n///     &::before {\n///       @include triangle(\"up\", 2rem, 1rem, #b25c9c);\n///       content: \"\";\n///     }\n///   }\n///\n///   // CSS Output\n///   .element::before {\n///     border-style: solid;\n///     height: 0;\n///     width: 0;\n///     border-color: transparent transparent #b25c9c;\n///     border-width: 0 1rem 1rem;\n///     content: \"\";\n///   }\n\n@mixin triangle(\n  $direction,\n  $width,\n  $height,\n  $color\n) {\n  @if not index(\n    \"up\" \"up-right\" \"right\" \"down-right\" \"down\" \"down-left\" \"left\" \"up-left\",\n    $direction\n  ) {\n    @error \"Direction must be `up`, `up-right`, `right`, `down-right`, \" +\n      \"`down`, `down-left`, `left` or `up-left`.\";\n  } @else if not _is-color($color) {\n    @error \"`#{$color}` is not a valid color for the `$color` argument in \" +\n      \"the `triangle` mixin.\";\n  } @else {\n    border-style: solid;\n    height: 0;\n    width: 0;\n\n    @if $direction == \"up\" {\n      border-color: transparent transparent $color;\n      border-width: 0 ($width / 2) $height;\n    } @else if $direction == \"up-right\" {\n      border-color: transparent $color transparent transparent;\n      border-width: 0 $width $width 0;\n    } @else if $direction == \"right\" {\n      border-color: transparent transparent transparent $color;\n      border-width: ($height / 2) 0 ($height / 2) $width;\n    } @else if $direction == \"down-right\" {\n      border-color: transparent transparent $color;\n      border-width: 0 0 $width $width;\n    } @else if $direction == \"down\" {\n      border-color: $color transparent transparent;\n      border-width: $height ($width / 2) 0;\n    } @else if $direction == \"down-left\" {\n      border-color: transparent transparent transparent $color;\n      border-width: $width 0 0 $width;\n    } @else if $direction == \"left\" {\n      border-color: transparent $color transparent transparent;\n      border-width: ($height / 2) $width ($height / 2) 0;\n    } @else if $direction == \"up-left\" {\n      border-color: $color transparent transparent;\n      border-width: $width $width 0 0;\n    }\n  }\n}\n"
  },
  {
    "path": "core/bourbon/library/_value-prefixer.scss",
    "content": "@charset \"UTF-8\";\n\n/// Generates vendor prefixes for values.\n///\n/// @argument {string} $property\n///   Property to use.\n///\n/// @argument {string} $value\n///   Value to prefix.\n///\n/// @argument {list} $prefixes\n///   Vendor prefixes to output.\n///\n/// @example scss\n///   .element {\n///     @include value-prefixer(cursor, grab, (\"webkit\", \"moz\"));\n///   }\n///\n///   // CSS Output\n///   .element {\n///     cursor: -webkit-grab;\n///     cursor: -moz-grab;\n///     cursor: grab;\n///   }\n///\n/// @author Matthew Tobiasz\n\n@mixin value-prefixer(\n  $property,\n  $value,\n  $prefixes: ()\n) {\n  @each $prefix in $prefixes {\n    #{$property}: #{\"-\" + $prefix + \"-\" + $value};\n  }\n  #{$property}: $value;\n}\n"
  },
  {
    "path": "core/bourbon/settings/_settings.scss",
    "content": "@charset \"UTF-8\";\n\n/// Default global Bourbon settings. Values in this map are overwritten by any\n/// values set in the `$bourbon` map.\n///\n/// @type map\n///\n/// @property {color} contrast-switch-dark-color [#000]\n///   Global dark color for the `contrast-switch` function.\n///\n/// @property {color} contrast-switch-light-color [#fff]\n///   Global light color for the `contrast-switch` function.\n///\n/// @property {list} global-font-file-formats [(\"woff2\", \"woff\")]\n///   Global font file formats for the `font-face` mixin.\n///\n/// @property {number (with unit)} modular-scale-base [1em]\n///   Global base value for the `modular-scale` function.\n///\n/// @property {number (unitless)} modular-scale-ratio [$major-third (1.25)]\n///   Global base ratio for the `modular-scale` function.\n///\n/// @property {boolean} rails-asset-pipeline [false]\n///   Set this to `true` when using the Rails Asset Pipeline and Bourbon will\n///   write asset paths using\n///   [sass-rails’ asset helpers](https://github.com/rails/sass-rails#asset-helpers).\n///\n/// @access private\n\n$_bourbon-defaults: (\n  \"contrast-switch-dark-color\": #000,\n  \"contrast-switch-light-color\": #fff,\n  \"global-font-file-formats\": (\"woff2\", \"woff\"),\n  \"modular-scale-base\": 1em,\n  \"modular-scale-ratio\": $major-third,\n  \"rails-asset-pipeline\": false,\n);\n\n/// Global Bourbon settings.\n///\n/// @name Settings\n///\n/// @type map\n///\n/// @property {color} contrast-switch-dark-color [#000]\n///   Global dark color for the `contrast-switch` function.\n///\n/// @property {color} contrast-switch-light-color [#fff]\n///   Global light color for the `contrast-switch` function.\n///\n/// @property {list} global-font-file-formats [(\"woff2\", \"woff\")]\n///   Global font file formats for the `font-face` mixin.\n///\n/// @property {number (with unit)} modular-scale-base [1em]\n///   Global base value for the `modular-scale` function.\n///\n/// @property {number (unitless)} modular-scale-ratio [$major-third (1.25)]\n///   Global base ratio for the `modular-scale` function.\n///\n/// @property {boolean} rails-asset-pipeline [false]\n///   Set this to `true` when using the Rails Asset Pipeline and Bourbon will\n///   write asset paths using\n///   [sass-rails’ asset helpers](https://github.com/rails/sass-rails#asset-helpers).\n///\n/// @example scss\n///   $bourbon: (\n///     \"contrast-switch-dark-color\": #000,\n///     \"contrast-switch-light-color\": #fff,\n///     \"global-font-file-formats\": (\"woff2\", \"woff\"),\n///     \"modular-scale-base\": 1em,\n///     \"modular-scale-ratio\": $major-third,\n///     \"rails-asset-pipeline\": false,\n///   );\n\n$bourbon: () !default;\n"
  },
  {
    "path": "core/bourbon/utilities/_assign-inputs.scss",
    "content": "@charset \"UTF-8\";\n\n/// Append pseudo-classes to a selector(s).\n///\n/// @argument {list | string} $inputs\n///   A selector, or list of selectors, to apply the pseudo-class to.\n///\n/// @argument {pseudo-class} $pseudo [null]\n///   The pseudo-class to be appended.\n///\n/// @return {list}\n///\n/// @access private\n\n@function _assign-inputs(\n  $inputs,\n  $pseudo: null\n) {\n  $list: ();\n\n  @each $input in $inputs {\n    $input: unquote($input);\n    $input: if($pseudo, $input + \":\" + $pseudo, $input);\n    $list: append($list, $input, comma);\n  }\n\n  @return $list;\n}\n"
  },
  {
    "path": "core/bourbon/utilities/_compact-shorthand.scss",
    "content": "@charset \"UTF-8\";\n\n/// Transforms shorthand to its shortest possible form.\n///\n/// @argument {list} $values\n///   List of directional values.\n///\n/// @example scss\n///   $values: _compact-shorthand(10px 20px 10px 20px);\n///\n///   // Output\n///   $values: 10px 20px;\n///\n/// @return {list}\n///\n/// @access private\n\n@function _compact-shorthand($values) {\n  $output: null;\n\n  $a: nth($values, 1);\n  $b: if(length($values) < 2, $a, nth($values, 2));\n  $c: if(length($values) < 3, $a, nth($values, 3));\n  $d: if(length($values) < 2, $a, nth($values, if(length($values) < 4, 2, 4)));\n\n  @if $a == 0 { $a: 0; }\n  @if $b == 0 { $b: 0; }\n  @if $c == 0 { $c: 0; }\n  @if $d == 0 { $d: 0; }\n\n  @if $a == $b and $a == $c and $a == $d {\n    $output: $a;\n  } @else if $a == $c and $b == $d {\n    $output: $a $b;\n  } @else if $b == $d {\n    $output: $a $b $c;\n  } @else {\n    $output: $a $b $c $d;\n  }\n\n  @return $output;\n}\n"
  },
  {
    "path": "core/bourbon/utilities/_contrast-ratio.scss",
    "content": "@charset \"UTF-8\";\n\n/// Programatically determines the contrast ratio between two colors.\n///\n/// Note that the alpha channel is ignored.\n///\n/// @link https://goo.gl/54htLV\n///\n/// @argument {color (hex)} $color-1\n///\n/// @argument {color (hex)} $color-2\n///\n/// @return {number (1-21)}\n///\n/// @example scss\n///   _contrast-ratio(black, white)\n///\n/// @require {function} _lightness\n///\n/// @access private\n\n@function _contrast-ratio($color-1, $color-2) {\n  $-local-lightness-1: _lightness($color-1) + 0.05;\n  $-local-lightness-2: _lightness($color-2) + 0.05;\n\n  @if $-local-lightness-1 > $-local-lightness-2 {\n    @return $-local-lightness-1 / $-local-lightness-2;\n  } @else {\n    @return $-local-lightness-2 / $-local-lightness-1;\n  }\n}\n"
  },
  {
    "path": "core/bourbon/utilities/_directional-property.scss",
    "content": "@charset \"UTF-8\";\n\n/// Builds directional properties by parsing CSS shorthand values. For example,\n/// a value of `10px null` will output top and bottom directional properties,\n/// but the `null` skips left and right from being output.\n///\n/// @argument {string} $property\n///   Base property.\n///\n/// @argument {string} $suffix\n///   Suffix to append. Use `null` to omit.\n///\n/// @argument {list} $values\n///   List of values to set for the property.\n///\n/// @example scss\n///   .element {\n///     @include _directional-property(border, width, null 5px);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     border-right-width: 5px;\n///     border-left-width: 5px;\n///   }\n///\n/// @require {function} _compact-shorthand\n///\n/// @require {function} _contains-falsy\n///\n/// @access private\n\n@mixin _directional-property(\n  $property,\n  $suffix,\n  $values\n) {\n  $top: $property + \"-top\" + if($suffix, \"-#{$suffix}\", \"\");\n  $bottom: $property + \"-bottom\" + if($suffix, \"-#{$suffix}\", \"\");\n  $left: $property + \"-left\" + if($suffix, \"-#{$suffix}\", \"\");\n  $right: $property + \"-right\" + if($suffix, \"-#{$suffix}\", \"\");\n  $all: $property + if($suffix, \"-#{$suffix}\", \"\");\n\n  $values: _compact-shorthand($values);\n\n  @if _contains-falsy($values) {\n    @if nth($values, 1) { #{$top}: nth($values, 1); }\n\n    @if length($values) == 1 {\n      @if nth($values, 1) { #{$right}: nth($values, 1); }\n    } @else {\n      @if nth($values, 2) { #{$right}: nth($values, 2); }\n    }\n\n    @if length($values) == 2 {\n      @if nth($values, 1) { #{$bottom}: nth($values, 1); }\n      @if nth($values, 2) { #{$left}: nth($values, 2); }\n    } @else if length($values) == 3 {\n      @if nth($values, 3) { #{$bottom}: nth($values, 3); }\n      @if nth($values, 2) { #{$left}: nth($values, 2); }\n    } @else if length($values) == 4 {\n      @if nth($values, 3) { #{$bottom}: nth($values, 3); }\n      @if nth($values, 4) { #{$left}: nth($values, 4); }\n    }\n  } @else {\n    #{$all}: $values;\n  }\n}\n"
  },
  {
    "path": "core/bourbon/utilities/_fetch-bourbon-setting.scss",
    "content": "@charset \"UTF-8\";\n\n/// Return a Bourbon setting.\n///\n/// @argument {string} $setting\n///\n/// @return {boolean | color | list | number | string}\n///\n/// @example scss\n///   _fetch-bourbon-setting(rails-asset-pipeline)\n///\n/// @access private\n\n@function _fetch-bourbon-setting($setting) {\n  @return map-get(map-merge($_bourbon-defaults, $bourbon), $setting);\n}\n"
  },
  {
    "path": "core/bourbon/utilities/_font-source-declaration.scss",
    "content": "@charset \"UTF-8\";\n\n/// Builds the `src` list for an `@font-face` declaration.\n///\n/// @link https://goo.gl/Ru1bKP\n///\n/// @argument {string} $font-family\n///\n/// @argument {string} $file-path\n///\n/// @argument {boolean} $asset-pipeline\n///\n/// @argument {list} $file-formats\n///\n/// @return {list}\n///\n/// @require {function} _contains\n///\n/// @access private\n\n@function _font-source-declaration(\n  $font-family,\n  $file-path,\n  $asset-pipeline,\n  $file-formats\n) {\n  $src: ();\n\n  $formats-map: (\n    \"woff2\": \"#{$file-path}.woff2\" format(\"woff2\"),\n    \"woff\": \"#{$file-path}.woff\" format(\"woff\"),\n  );\n\n  @each $format in $file-formats {\n    @if _contains(map-keys($formats-map), $format) {\n      $value: map-get($formats-map, $format);\n      $file-path: nth($value, 1);\n      $font-format: nth($value, 2);\n\n      @if $asset-pipeline == true {\n        $src: append($src, font-url($file-path) $font-format, comma);\n      } @else {\n        $src: append($src, url($file-path) $font-format, comma);\n      }\n    } @else {\n      @error \"`#{$file-formats}` contains an unsupported font file format. \" +\n        \"Must be `woff` and/or `woff2`.\";\n    }\n  }\n\n  @return $src;\n}\n"
  },
  {
    "path": "core/bourbon/utilities/_gamma.scss",
    "content": "@charset \"UTF-8\";\n\n/// Performs gamma correction on a single color channel.\n///\n/// Note that the calculation is approximate if a `pow()` is not available.\n///\n/// @argument {number (0-1)} $channel\n///\n/// @return {number (0-1)}\n///\n/// @access private\n\n@function _gamma($channel) {\n  @if $channel < 0.03928 {\n    @return $channel / 12.92;\n  } @else {\n    $c: ($channel + 0.055) / 1.055;\n    @if function-exists(\"pow\") {\n      @return pow($c, 2.4);\n    } @else {\n      @return 0.56 * $c * $c * $c + 0.44 * $c * $c;\n    }\n  }\n}\n"
  },
  {
    "path": "core/bourbon/utilities/_lightness.scss",
    "content": "@charset \"UTF-8\";\n\n/// Programatically determines the lightness of a color.\n///\n/// @argument {color (hex)} $hex-color\n///\n/// @return {number (0-1)}\n///\n/// @example scss\n///   _lightness($color)\n///\n/// @access private\n\n@function _lightness($hex-color) {\n  $-local-red-raw: red(rgba($hex-color, 1));\n  $-local-green-raw: green(rgba($hex-color, 1));\n  $-local-blue-raw: blue(rgba($hex-color, 1));\n\n  $-local-red: _gamma($-local-red-raw / 255);\n  $-local-green: _gamma($-local-green-raw / 255);\n  $-local-blue: _gamma($-local-blue-raw / 255);\n\n  @return $-local-red * 0.2126 + $-local-green * 0.7152 + $-local-blue * 0.0722;\n}\n"
  },
  {
    "path": "core/bourbon/utilities/_unpack-shorthand.scss",
    "content": "@charset \"UTF-8\";\n\n/// Transforms shorthand that can range from 1-to-4 values to be 4 values.\n///\n/// @argument {list} $shorthand\n///\n/// @example scss\n///   .element {\n///     margin: _unpack-shorthand(1em 2em);\n///   }\n///\n///   // CSS Output\n///   .element {\n///     margin: 1em 2em 1em 2em;\n///   }\n///\n/// @access private\n\n@function _unpack-shorthand($shorthand) {\n  @if length($shorthand) == 1 {\n    @return nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1);\n  } @else if length($shorthand) == 2 {\n    @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 1) nth($shorthand, 2);\n  } @else if length($shorthand) == 3 {\n    @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 3) nth($shorthand, 2);\n  } @else {\n    @return $shorthand;\n  }\n}\n"
  },
  {
    "path": "core/bourbon/validators/_contains-falsy.scss",
    "content": "@charset \"UTF-8\";\n\n/// Checks if a list does not contain any values.\n///\n/// @argument {list} $list\n///   The list to check against.\n///\n/// @return {boolean}\n///\n/// @access private\n\n@function _contains-falsy($list) {\n  @each $item in $list {\n    @if not $item {\n      @return true;\n    }\n  }\n\n  @return false;\n}\n"
  },
  {
    "path": "core/bourbon/validators/_contains.scss",
    "content": "@charset \"UTF-8\";\n\n/// Checks if a list contains a value(s).\n///\n/// @argument {list} $list\n///   The list to check against.\n///\n/// @argument {list} $values\n///   A single value or list of values to check for.\n///\n/// @return {boolean}\n///\n/// @access private\n\n@function _contains(\n  $list,\n  $values...\n) {\n  @each $value in $values {\n    @if type-of(index($list, $value)) != \"number\" {\n      @return false;\n    }\n  }\n\n  @return true;\n}\n"
  },
  {
    "path": "core/bourbon/validators/_is-color.scss",
    "content": "@charset \"UTF-8\";\n\n/// Checks for a valid CSS color.\n///\n/// @argument {string} $color\n///\n/// @return {boolean}\n///\n/// @access private\n\n@function _is-color($color) {\n  @return (type-of($color) == color) or ($color == \"currentColor\");\n}\n"
  },
  {
    "path": "core/bourbon/validators/_is-length.scss",
    "content": "@charset \"UTF-8\";\n\n/// Checks for a valid CSS length.\n///\n/// @argument {string} $value\n///\n/// @return {boolean}\n///\n/// @access private\n\n@function _is-length($value) {\n  @return type-of($value) != \"null\"\n    and (\n      str-slice($value + \"\", 1, 4) == \"calc\"\n      or str-slice($value + \"\", 1, 3) == \"var\"\n      or str-slice($value + \"\", 1, 3) == \"env\"\n      or index(auto inherit initial 0, $value)\n      or (type-of($value) == \"number\" and not(unitless($value)))\n    );\n}\n"
  },
  {
    "path": "core/bourbon/validators/_is-number.scss",
    "content": "@charset \"UTF-8\";\n\n/// Checks for a valid number.\n///\n/// @argument {number} $value\n///\n/// @require {function} _contains\n///\n/// @return {boolean}\n///\n/// @access private\n\n@function _is-number($value) {\n  @return _contains(\"0\" \"1\" \"2\" \"3\" \"4\" \"5\" \"6\" \"7\" \"8\" \"9\" 0 1 2 3 4 5 6 7 8 9, $value);\n}\n"
  },
  {
    "path": "core/bourbon/validators/_is-size.scss",
    "content": "@charset \"UTF-8\";\n\n/// Checks for a valid CSS size.\n///\n/// @argument {string} $value\n///\n/// @return {boolean}\n///\n/// @require {function} _contains\n///\n/// @require {function} _is-length\n///\n/// @access private\n\n@function _is-size($value) {\n  @return _is-length($value)\n    or _contains(\"fill\" \"fit-content\" \"min-content\" \"max-content\", $value);\n}\n"
  },
  {
    "path": "eyeglass-exports.js",
    "content": "var bourbon = require(\"./index\");\n\nmodule.exports = function(eyeglass, sass) {\n  return {\n    sassDir: bourbon.includePaths[0]\n  };\n};\n"
  },
  {
    "path": "features/install.feature",
    "content": "Feature: Install bourbon files\n\n  Scenario: Bourbon generates a new bourbon installation\n    When I run `bundle exec bourbon install`\n    Then the sass directories should have been generated\n    And the following directories should exist:\n      | bourbon     |\n    And the master bourbon partial should have been generated\n    And the output should contain \"Bourbon files installed to bourbon/\"\n\n  Scenario: Generating does not overwrite an existing bourbon directory\n    Given bourbon is already installed\n    When I run `bundle exec bourbon install`\n    Then the output should contain \"Bourbon files already installed, doing nothing.\"\n\n  Scenario: Install Bourbon into a custom path\n    When I run `bundle exec bourbon install --path=custom_path`\n    Then the sass directories with \"custom_path\" prefix should have been generated\n    And the following directories should exist:\n      | custom_path/bourbon     |\n    And the master bourbon partial should have been generated within \"custom_path\" directory\n    And the output should contain \"Bourbon files installed to custom_path/bourbon/\"\n\n  Scenario: Forcing install of bourbon\n    Given bourbon is already installed\n    When I run `bundle exec bourbon install --force`\n    Then the output from \"bundle exec bourbon install --force\" should contain \"Bourbon files installed to bourbon/\"\n    And the output should not contain \"Bourbon files already installed, doing nothing.\"\n"
  },
  {
    "path": "features/step_definitions/bourbon_steps.rb",
    "content": "Given /^bourbon is already installed$/ do\n  install_bourbon\nend\n\nGiven /^I install bourbon to \"([^\"]*)\"$/ do |path|\nend\n\nThen /^the sass directories(?: with \"([^\"]+)\" prefix)? should have been generated$/ do |prefix|\n  sass_directories = [\n    \"bourbon/helpers\",\n    \"bourbon/library\",\n    \"bourbon/settings\",\n    \"bourbon/utilities\",\n    \"bourbon/validators\",\n  ]\n  sass_directories.map!{ |directory| bourbon_path(prefix, directory) }\n  sass_directories.each do |sass_directory|\n    expect(sass_directory).to be_an_existing_directory\n  end\nend\n\nThen /^the master bourbon partial should have been generated(?: within \"([^\"]+)\" directory)?$/ do |prefix|\n  expect(bourbon_path(prefix, \"_bourbon.scss\")).to be_an_existing_file\nend\n\nThen /^bourbon should not have been generated$/ do\n  expect(\"bourbon\").not_to be_an_existing_directory\nend\n\nThen /^the output should contain the current version of Bourbon$/ do\n  expect(last_command_started).to have_output \"Bourbon #{Bourbon::VERSION}\"\nend\n"
  },
  {
    "path": "features/support/bourbon_support.rb",
    "content": "module BourbonSupport\n  def install_bourbon(path = nil)\n    if path\n      run_simple(\"bundle exec bourbon install --path '#{path}'\")\n    else\n      run_simple(\"bundle exec bourbon install\")\n    end\n  end\n\n  def bourbon_path(prefix, path)\n    if prefix\n      File.join(prefix, 'bourbon', path)\n    else\n      File.join('bourbon', path)\n    end\n  end\nend\n\nWorld(BourbonSupport)\n"
  },
  {
    "path": "features/support/env.rb",
    "content": "require \"aruba/cucumber\"\n"
  },
  {
    "path": "features/update.feature",
    "content": "Feature: Update bourbon files\n\n  Scenario: Updating updates an existing bourbon install\n    Given bourbon is already installed\n    When I write to \"bourbon/_bourbon.scss\" with:\n      \"\"\"\n      foobar\n      \"\"\"\n    And I run `bundle exec bourbon update`\n    Then the output should contain \"Bourbon files updated.\"\n    And the file \"bourbon/_bourbon.scss\" should not contain \"foobar\"\n\n  Scenario: Updating with a --path option\n    Given I install bourbon to \"custom_path\"\n    When I write to \"custom_path/bourbon/_bourbon.scss\" with:\n      \"\"\"\n      foobar\n      \"\"\"\n    And I run `bundle exec bourbon update`\n    Then the output should contain \"No existing bourbon installation. Doing nothing.\"\n\n    When I run `bundle exec bourbon update --path custom_path`\n    Then the output should contain \"Bourbon files updated.\"\n    And the file \"custom_path/bourbon/_bourbon.scss\" should not contain \"foobar\"\n\n  Scenario: Updating does not generate a new bourbon install\n    And I run `bundle exec bourbon update`\n    Then bourbon should not have been generated\n    And the output should contain \"No existing bourbon installation. Doing nothing.\"\n"
  },
  {
    "path": "features/version.feature",
    "content": "Feature: Show version\n  Scenario: Viewing version\n    When I successfully run `bundle exec bourbon --version`\n    Then the output should contain the current version of Bourbon\n"
  },
  {
    "path": "index.js",
    "content": "var path = require(\"path\");\n\nmodule.exports = {\n  includePaths: [\n    path.join(__dirname, \"core\")\n  ]\n};\n"
  },
  {
    "path": "lib/bourbon/generator.rb",
    "content": "require \"bourbon/version\"\nrequire \"fileutils\"\nrequire \"thor\"\nrequire \"pathname\"\n\nmodule Bourbon\n  class Generator < Thor\n    map [\"-v\", \"--version\"] => :version\n\n    desc \"install\", \"Install Bourbon into your project\"\n    method_options :path => :string, :force => :boolean\n    def install\n      if bourbon_files_already_exist? && !options[:force]\n        puts \"Bourbon files already installed, doing nothing.\"\n      else\n        install_files\n        puts \"Bourbon files installed to #{install_path}/\"\n      end\n    end\n\n    desc \"update\", \"Update Bourbon\"\n    method_options :path => :string\n    def update\n      if bourbon_files_already_exist?\n        remove_bourbon_directory\n        install_files\n        puts \"Bourbon files updated.\"\n      else\n        puts \"No existing bourbon installation. Doing nothing.\"\n      end\n    end\n\n    desc \"version\", \"Show Bourbon version\"\n    def version\n      say \"Bourbon #{Bourbon::VERSION}\"\n    end\n\n    private\n\n    def bourbon_files_already_exist?\n      install_path.exist?\n    end\n\n    def install_path\n      @install_path ||= if options[:path]\n          Pathname.new(File.join(options[:path], \"bourbon\"))\n        else\n          Pathname.new(\"bourbon\")\n        end\n    end\n\n    def install_files\n      make_install_directory\n      copy_in_scss_files\n    end\n\n    def remove_bourbon_directory\n      FileUtils.rm_rf(install_path)\n    end\n\n    def make_install_directory\n      FileUtils.mkdir_p(install_path)\n    end\n\n    def copy_in_scss_files\n      FileUtils.cp_r(all_stylesheets, install_path)\n    end\n\n    def all_stylesheets\n      Dir[\"#{stylesheets_directory}/*\"]\n    end\n\n    def stylesheets_directory\n      File.join(top_level_directory, \"core\")\n    end\n\n    def top_level_directory\n      File.dirname(File.dirname(File.dirname(__FILE__)))\n    end\n  end\nend\n"
  },
  {
    "path": "lib/bourbon/version.rb",
    "content": "module Bourbon\n  VERSION = \"7.3.0\".freeze\nend\n"
  },
  {
    "path": "lib/bourbon.rb",
    "content": "require \"bourbon/generator\"\n\nmodule Bourbon\n  if defined?(Rails) && defined?(Rails::Engine)\n    class Engine < ::Rails::Engine\n      initializer \"bourbon.paths\", group: :all do |app|\n        app.config.assets.paths << File.expand_path(\"../core\", __dir__)\n      end\n    end\n  else\n    begin\n      require \"sass\"\n      Sass.load_paths << File.expand_path(\"../core\", __dir__)\n    rescue LoadError\n    end\n  end\nend\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"author\": {\n    \"name\": \"thoughtbot\",\n    \"url\": \"http://thoughtbot.com\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/thoughtbot/bourbon/issues\"\n  },\n  \"description\": \"A lightweight Sass tool set.\",\n  \"devDependencies\": {\n    \"@thoughtbot/stylelint-config\": \"1.1.0\",\n    \"sassdoc\": \"^2.5.0\",\n    \"stylelint\": \"10.1.0\"\n  },\n  \"eyeglass\": {\n    \"needs\": \"*\",\n    \"exports\": \"eyeglass-exports.js\"\n  },\n  \"homepage\": \"https://www.bourbon.io/\",\n  \"keywords\": [\n    \"css\",\n    \"eyeglass-module\",\n    \"mixins\",\n    \"sass\",\n    \"scss\"\n  ],\n  \"license\": \"MIT\",\n  \"main\": \"index.js\",\n  \"style\": \"core/_bourbon.scss\",\n  \"name\": \"bourbon\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/thoughtbot/bourbon.git\"\n  },\n  \"scripts\": {\n    \"sassdoc\": \"npx sassdoc core/ --parse --verbose --strict\",\n    \"stylelint\": \"npx stylelint 'core/**/*.scss'\",\n    \"test\": \"bundle exec rake\"\n  },\n  \"version\": \"7.3.0\"\n}\n"
  },
  {
    "path": "spec/bourbon/library/border_color_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"border-color\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/border-color\")\n  end\n\n  context \"called with one color\" do\n    it \"applies same color to all sides\" do\n      rule = \"border-color: #f00\"\n\n      expect(\".border-color-all\").to have_rule(rule)\n    end\n  end\n\n  context \"called with two colors\" do\n    it \"applies to alternating sides\" do\n      rule = \"border-color: #0f0 #00f\"\n\n      expect(\".border-color-alternate\").to have_rule(rule)\n    end\n  end\n\n  context \"called with three colors\" do\n    it \"applies second color to left and right\" do\n      rule = \"border-color: #f00 #0f0 #00f\"\n\n      expect(\".border-color-implied-left\").to have_rule(rule)\n    end\n  end\n\n  context \"called with four colors\" do\n    it \"applies different colors to all sides\" do\n      rule = \"border-color: #00f #0f0 #f00 #ff0\"\n\n      expect(\".border-color-explicit\").to have_rule(rule)\n    end\n  end\n\n  context \"called with null values\" do\n    it \"writes rules for other three\" do\n      ruleset = \"border-top-color: #0f0; \" +\n                \"border-right-color: #ff0; \" +\n                \"border-left-color: #00f;\"\n      bad_rule = \"border-bottom-color: null;\"\n\n      expect(\".border-color-false-third\").to have_ruleset(ruleset)\n      expect(\".border-color-false-third\").to_not have_rule(bad_rule)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/border_radius_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"border-radius\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/border-radius\")\n  end\n\n  context \"called with one argument\" do\n    it \"applies to correct sides\" do\n      top = \"border-top-left-radius: 1em; \" +\n            \"border-top-right-radius: 1em;\"\n      left = \"border-bottom-left-radius: 2em; \" +\n              \"border-top-left-radius: 2em;\"\n      right = \"border-bottom-right-radius: 3em; \" +\n              \"border-top-right-radius: 3em;\"\n      bottom = \"border-bottom-left-radius: 4em; \" +\n                \"border-bottom-right-radius: 4em;\"\n\n      expect(\".border-top-radius\").to have_ruleset(top)\n      expect(\".border-left-radius\").to have_ruleset(left)\n      expect(\".border-right-radius\").to have_ruleset(right)\n      expect(\".border-bottom-radius\").to have_ruleset(bottom)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/border_style_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"border-style\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/border-style\")\n  end\n\n  context \"called with one style\" do\n    it \"applies same style to all sides\" do\n      rule = \"border-style: solid\"\n\n      expect(\".border-style-all\").to have_rule(rule)\n    end\n  end\n\n  context \"called with two styles\" do\n    it \"applies to alternating sides\" do\n      rule = \"border-style: dotted dashed\"\n\n      expect(\".border-style-alternate\").to have_rule(rule)\n    end\n  end\n\n  context \"called with three styles\" do\n    it \"applies second style to left and right\" do\n      rule = \"border-style: dashed double solid\"\n\n      expect(\".border-style-implied-left\").to have_rule(rule)\n    end\n  end\n\n  context \"called with four styles\" do\n    it \"applies different styles to all sides\" do\n      rule = \"border-style: dotted groove ridge none\"\n\n      expect(\".border-style-explicit\").to have_rule(rule)\n    end\n  end\n\n  context \"called with null values\" do\n    it \"writes rules for other three\" do\n      ruleset = \"border-top-style: inset; \" +\n                \"border-right-style: none; \" +\n                \"border-left-style: double;\"\n      bad_rule = \"border-bottom-style: null;\"\n\n      expect(\".border-style-false-third\").to have_ruleset(ruleset)\n      expect(\".border-style-false-third\").to_not have_rule(bad_rule)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/border_width_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"border-width\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/border-width\")\n  end\n\n  context \"called with one color\" do\n    it \"applies same width to all sides\" do\n      rule = \"border-width: 1px\"\n\n      expect(\".border-width-all\").to have_rule(rule)\n    end\n  end\n\n  context \"called with two widths\" do\n    it \"applies to alternating sides\" do\n      rule = \"border-width: 2px 3px\"\n\n      expect(\".border-width-alternate\").to have_rule(rule)\n    end\n  end\n\n  context \"called with three widths\" do\n    it \"applies second width to left and right\" do\n      rule = \"border-width: 4px 5px 6px\"\n\n      expect(\".border-width-implied-left\").to have_rule(rule)\n    end\n  end\n\n  context \"called with four widths\" do\n    it \"applies different widths to all sides\" do\n      rule = \"border-width: 7px 8px 9px 10px\"\n\n      expect(\".border-width-explicit\").to have_rule(rule)\n    end\n  end\n\n  context \"called with null values\" do\n    it \"writes rules for other three\" do\n      ruleset = \"border-top-width: 11px; \" +\n                \"border-right-width: 12px; \" +\n                \"border-left-width: 13px;\"\n      bad_rule = \"border-bottom-width: null;\"\n\n      expect(\".border-width-false-third\").to have_ruleset(ruleset)\n      expect(\".border-width-false-third\").to_not have_rule(bad_rule)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/buttons_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"buttons\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/buttons\")\n\n    @buttons_list = %w(\n      button\n      [type='button']\n      [type='reset']\n      [type='submit']\n    )\n  end\n\n  context \"expands plain buttons\" do\n    it \"finds selectors\" do\n      list = @buttons_list.join(\", \")\n      ruleset = \"content: #{list};\"\n\n      expect(\".all-buttons\").to have_ruleset(ruleset)\n    end\n  end\n\n  context \"expands active buttons\" do\n    it \"finds selectors\" do\n      list = @buttons_list.map { |input| \"#{input}:active\" }\n      list = list.join(\", \")\n      ruleset = \"content: #{list};\"\n\n      expect(\".all-buttons-active\").to have_ruleset(ruleset)\n    end\n  end\n\n  context \"expands focus buttons\" do\n    it \"finds selectors\" do\n      list = @buttons_list.map { |input| \"#{input}:focus\" }\n      list = list.join(\", \")\n      ruleset = \"content: #{list};\"\n\n      expect(\".all-buttons-focus\").to have_ruleset(ruleset)\n    end\n  end\n\n  context \"expands hover buttons\" do\n    it \"finds selectors\" do\n      list = @buttons_list.map { |input| \"#{input}:hover\" }\n      list = list.join(\", \")\n      ruleset = \"content: #{list};\"\n\n      expect(\".all-buttons-hover\").to have_ruleset(ruleset)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/clearfix_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"clearfix\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/clearfix\")\n  end\n\n  context \"called on element\" do\n    it \"adds clearfix\" do\n      input = \".clearfix::after\"\n      ruleset = \"clear: both; \" +\n                'content: \"\"; ' +\n                \"display: block;\"\n\n      expect(input).to have_ruleset(ruleset)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/contrast_switch_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"contrast-switch\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/contrast-switch\")\n  end\n\n  context \"called with a light base color\" do\n    it \"outputs the dark color\" do\n      rule = \"color: #000;\"\n\n      expect(\".contrast-switch-light-base\").to have_ruleset(rule)\n    end\n  end\n\n  context \"called with a dark base color\" do\n    it \"outputs the light color\" do\n      rule = \"color: #eee;\"\n\n      expect(\".contrast-switch-dark-base\").to have_ruleset(rule)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/ellipsis_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"ellipsis\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/ellipsis\")\n  end\n\n  context \"called on element\" do\n    it \"adds ellipsis\" do\n      ruleset = \"display: inline-block; \" +\n                \"max-width: 100%; \" +\n                \"overflow: hidden; \" +\n                \"text-overflow: ellipsis; \" +\n                \"white-space: nowrap; \" +\n                \"word-wrap: normal;\"\n\n      expect(\".ellipsis\").to have_ruleset(ruleset)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/font_face_spec_1.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"font-face\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/font-face-1\")\n  end\n\n  context \"called with defaults\" do\n    it \"outputs defaults\" do\n      ruleset = 'font-family: \"source-sans-pro\"; ' +\n                'src: url(\"/fonts/source-sans-pro/source-sans-pro-regular.woff2\") format(\"woff2\"), url(\"/fonts/source-sans-pro/source-sans-pro-regular.woff\") format(\"woff\");'\n\n      expect(\"@font-face\").to have_ruleset(ruleset)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/font_face_spec_2.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"font-face\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/font-face-5\")\n  end\n\n  context \"called with additional CSS rules\" do\n    it \"outputs defaults with additional content\" do\n      ruleset = 'font-family: \"calibre\"; ' +\n                'src: url(\"fonts/calibre.woff2\") format(\"woff2\"), ' +\n                'url(\"fonts/calibre.woff\") format(\"woff\"); ' +\n                \"font-style: normal;\" +\n                \"font-weight: 600;\" +\n                \"unicode-range: U+26;\"\n\n      expect(\"@font-face\").to have_ruleset(ruleset)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/font_face_spec_3.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"font-face\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/font-face-3\")\n  end\n\n  context \"called with defaults\" do\n    it \"outputs defaults\" do\n      ruleset = 'font-family: \"pitch\";' +\n                'src: font-url(\"/fonts/pitch.woff2\") format(\"woff2\");'\n\n      expect(\"@font-face\").to have_ruleset(ruleset)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/font_stacks_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"font-stacks\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/font-stacks\")\n  end\n\n  context \"stacks used in variable\" do\n    it \"output stacks\" do\n      helvetica = '\"Helvetica Neue\", \"Helvetica\", \"Arial\", sans-serif'\n      lucida_grande = '\"Lucida Grande\", \"Lucida Sans Unicode\", ' +\n                      '\"Geneva\", \"Verdana\", sans-serif'\n      verdana = '\"Verdana\", \"Geneva\", sans-serif'\n      garamond = '\"Garamond\", \"Baskerville\", \"Baskerville Old Face\", ' +\n                 '\"Hoefler Text\", \"Times New Roman\", serif'\n      georgia = '\"Georgia\", \"Times\", \"Times New Roman\", serif'\n      hoefler_text = '\"Hoefler Text\", \"Baskerville Old Face\", ' +\n                     '\"Garamond\", \"Times New Roman\", serif'\n      consolas = '\"Consolas\", \"monaco\", monospace'\n      courier_new = '\"Courier New\", \"Courier\", \"Lucida Sans Typewriter\", ' +\n                    '\"Lucida Typewriter\", monospace'\n      monaco = '\"Monaco\", \"Consolas\", \"Lucida Console\", monospace'\n\n      system = 'system-ui, -apple-system, BlinkMacSystemFont, \"Avenir Next\", ' +\n               '\"Avenir\", \"Segoe UI\", \"Lucida Grande\", \"Helvetica Neue\", ' +\n               '\"Helvetica\", \"Fira Sans\", \"Roboto\", \"Noto\", \"Droid Sans\", ' +\n               '\"Cantarell\", \"Oxygen\", \"Ubuntu\", \"Franklin Gothic Medium\", ' +\n               '\"Century Gothic\", \"Liberation Sans\", sans-serif'\n\n      expect(\".helvetica\").to have_value(helvetica)\n      expect(\".lucida-grande\").to have_value(lucida_grande)\n      expect(\".verdana\").to have_value(verdana)\n      expect(\".garamond\").to have_value(garamond)\n      expect(\".georgia\").to have_value(georgia)\n      expect(\".hoefler-text\").to have_value(hoefler_text)\n      expect(\".consolas\").to have_value(consolas)\n      expect(\".courier-new\").to have_value(courier_new)\n      expect(\".monaco\").to have_value(monaco)\n      expect(\".system\").to have_value(system)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/hide_text_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"hide-text\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/hide-text\")\n  end\n\n  context \"called on element\" do\n    it \"adds hide-text\" do\n      ruleset = \"overflow: hidden; \" +\n                \"text-indent: 101%; \" +\n                \"white-space: nowrap;\"\n\n      expect(\".hide-text\").to have_ruleset(ruleset)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/hide_visually_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"hide-visually\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/hide-visually\")\n  end\n\n  context \"called on element\" do\n    it \"adds properties to hide the element\" do\n      ruleset = \"border: 0; \" +\n                \"clip: rect(1px, 1px, 1px, 1px); \" +\n                \"clip-path: inset(100%); \" +\n                \"height: 1px; \" +\n                \"overflow: hidden; \" +\n                \"padding: 0; \" +\n                \"position: absolute; \" +\n                \"white-space: nowrap; \" +\n                \"width: 1px;\"\n\n      expect(\".hide-visually\").to have_ruleset(ruleset)\n    end\n  end\n\n  context \"called with unhide argument\" do\n    it \"adds properties to reverse the hiding of the element\" do\n      ruleset = \"clip: auto; \" +\n                \"clip-path: none; \" +\n                \"height: auto; \" +\n                \"overflow: visible; \" +\n                \"position: static; \" +\n                \"white-space: inherit; \" +\n                \"width: auto;\"\n\n      expect(\".hide-visually--unhide\").to have_ruleset(ruleset)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/margin_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"margin\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/margin\")\n  end\n\n  context \"called with one size\" do\n    it \"applies same width to all sides\" do\n      rule = \"margin: 1px\"\n\n      expect(\".margin-all\").to have_rule(rule)\n    end\n  end\n\n  context \"called with two sizes\" do\n    it \"applies to alternating sides\" do\n      rule = \"margin: 2px 3px\"\n\n      expect(\".margin-alternate\").to have_rule(rule)\n    end\n  end\n\n  context \"called with three sizes\" do\n    it \"applies second width to left and right\" do\n      rule = \"margin: 4px 5px 6px\"\n\n      expect(\".margin-implied-left\").to have_rule(rule)\n    end\n  end\n\n  context \"called with four sizes\" do\n    it \"applies different widths to all sides\" do\n      rule = \"margin: 7px 8px 9px 10px\"\n\n      expect(\".margin-explicit\").to have_rule(rule)\n    end\n  end\n\n  context \"called with null values\" do\n    it \"writes rules for other three\" do\n      ruleset = \"margin-top: 11px; \" +\n                \"margin-right: 12px; \" +\n                \"margin-left: 13px;\"\n      bad_rule = \"margin-bottom: null;\"\n\n      expect(\".margin-false-third\").to have_ruleset(ruleset)\n      expect(\".margin-false-third\").to_not have_rule(bad_rule)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/modular_scale_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"modular-scale\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/modular-scale\")\n  end\n\n  context \"called with arguments (1, $value: 2em)\" do\n    it \"outputs double the first value from the default scale\" do\n      expect(\".one-base-two\").to have_rule(\"font-size: 2.5em\")\n    end\n  end\n\n  context \"called with arguments (1, $value: 3em)\" do\n    it \"outputs triple the first value from the default scale\" do\n      expect(\".one-base-three\").to have_rule(\"font-size: 3.75em\")\n    end\n  end\n\n  context \"called with arguments (1, $value: 4em 6em)\" do\n    it \"outputs quadruple the first value from the default scale\" do\n      expect(\".one-double-value\").to have_rule(\"font-size: 1.024em\")\n    end\n  end\n\n  context \"called with arguments (1, $ratio: $golden-ratio)\" do\n    it \"output the first value from the golden ratio scale\" do\n      expect(\".one-golden-ratio\").to have_rule(\"font-size: 1.618em\")\n    end\n  end\n\n  context \"called with argument (2)\" do\n    it \"outputs the second value from the default scale\" do\n      expect(\".two-base-one\").to have_rule(\"font-size: 1.5625em\")\n    end\n  end\n\n  context \"called with arguments (2, $value: 4em 6em)\" do\n    it \"outputs sextuple the second value from the default scale\" do\n      expect(\".two-double-value\").to have_rule(\"font-size: 3.125em\")\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/overflow_wrap_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"overflow-wrap\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/overflow-wrap\")\n  end\n\n  context \"called on element\" do\n    it \"adds overflow-wrap and word-wrap\" do\n      input = \".overflow-wrap\"\n      ruleset = \"word-wrap: break-word; \" +\n                \"overflow-wrap: break-word;\"\n\n      expect(input).to have_ruleset(ruleset)\n    end\n  end\n\n  context \"called on element with normal\" do\n    it \"sets values as normal\" do\n      input = \".overflow-wrap-normal\"\n      ruleset = \"word-wrap: normal; \" +\n                \"overflow-wrap: normal;\"\n\n      expect(input).to have_ruleset(ruleset)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/padding_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"padding\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/padding\")\n  end\n\n  context \"called with one size\" do\n    it \"applies same width to all sides\" do\n      rule = \"padding: 1px\"\n\n      expect(\".padding-all\").to have_rule(rule)\n    end\n  end\n\n  context \"called with two sizes\" do\n    it \"applies to alternating sides\" do\n      rule = \"padding: 2px 3px\"\n\n      expect(\".padding-alternate\").to have_rule(rule)\n    end\n  end\n\n  context \"called with three sizes\" do\n    it \"applies second width to left and right\" do\n      rule = \"padding: 4px 5px 6px\"\n\n      expect(\".padding-implied-left\").to have_rule(rule)\n    end\n  end\n\n  context \"called with four sizes\" do\n    it \"applies different widths to all sides\" do\n      rule = \"padding: 7px 8px 9px 10px\"\n\n      expect(\".padding-explicit\").to have_rule(rule)\n    end\n  end\n\n  context \"called with null values\" do\n    it \"writes rules for other three\" do\n      ruleset = \"padding-top: 11px; \" +\n                \"padding-right: 12px; \" +\n                \"padding-left: 13px;\"\n      bad_rule = \"padding-bottom: null;\"\n\n      expect(\".padding-false-third\").to have_ruleset(ruleset)\n      expect(\".padding-false-third\").to_not have_rule(bad_rule)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/position_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"position\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/position\")\n  end\n\n  context \"called with one size\" do\n    it \"applies same width to all sides\" do\n      ruleset = \"position: fixed; \" +\n                \"top: 1em; \" +\n                \"right: 1em; \" +\n                \"bottom: 1em; \" +\n                \"left: 1em;\"\n\n      expect(\".position-all\").to have_ruleset(ruleset)\n    end\n  end\n\n  context \"called with two sizes\" do\n    it \"applies to alternating sides\" do\n      ruleset = \"position: absolute; \" +\n                \"top: 2px; \" +\n                \"right: 3px; \" +\n                \"bottom: 2px; \" +\n                \"left: 3px;\"\n\n      expect(\".position-alternate\").to have_ruleset(ruleset)\n    end\n  end\n\n  context \"called with three sizes\" do\n    it \"applies second width to left and right\" do\n      ruleset = \"position: relative; \" +\n                \"top: 4px; \" +\n                \"right: 5px; \" +\n                \"bottom: 6px; \" +\n                \"left: 5px;\"\n\n      expect(\".position-implied-left\").to have_ruleset(ruleset)\n    end\n  end\n\n  context \"called with four sizes\" do\n    it \"applies different widths to all sides\" do\n      ruleset = \"position: fixed; \" +\n                \"top: 7px; \" +\n                \"right: 8px; \" +\n                \"bottom: 9px; \" +\n                \"left: 10px;\"\n\n      expect(\".position-explicit\").to have_ruleset(ruleset)\n    end\n  end\n\n  context \"called with null values\" do\n    it \"writes rules for others\" do\n      ruleset = \"position: static; \" +\n                \"top: 11px; \" +\n                \"left: 13px;\"\n      bad_rule = \"position-bottom: null; position-right: null;\"\n\n      expect(\".position-false-third\").to have_ruleset(ruleset)\n      expect(\".position-false-third\").to_not have_rule(bad_rule)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/prefixer_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"prefixer\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/prefixer\")\n  end\n\n  context \"called with no prefixes\" do\n    it \"outputs the spec\" do\n      rule = \"appearance: none;\"\n\n      expect(\".prefix\").to have_ruleset(rule)\n    end\n  end\n\n  context \"called with one prefix\" do\n    it \"applies the prefix to the property\" do\n      rule = \"-webkit-appearance: none; \" +\n             \"appearance: none;\"\n\n      expect(\".prefix--webkit\").to have_ruleset(rule)\n    end\n  end\n\n  context \"called with multiple prefixes\" do\n    it \"applies the prefixes to the property\" do\n      rule = \"-moz-appearance: none; \" +\n             \"-ms-appearance: none; \" +\n             \"appearance: none;\"\n\n      expect(\".prefix--moz-ms\").to have_ruleset(rule)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/shade_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"shade\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/shade\")\n  end\n\n  context \"called on white\" do\n    it \"shades white\" do\n      expect(\".shade-white\").to have_rule(\"color: #404040\")\n    end\n  end\n\n  context \"called on black\" do\n    it \"still returns black\" do\n      expect(\".shade-black\").to have_rule(\"color: black\")\n    end\n  end\n\n  context \"called on red\" do\n    it \"shades red\" do\n      expect(\".shade-red\").to have_rule(\"color: #bf0000\")\n    end\n  end\n\n  context \"called on gray\" do\n    it \"shades gray\" do\n      expect(\".shade-gray\").to have_rule(\"color: #171717\")\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/size_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"size\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/size\")\n  end\n\n  context \"called with one size\" do\n    it \"applies same width to both height and width\" do\n      rule = \"height: 10px; width: 10px;\"\n\n      expect(\".size-implicit\").to have_ruleset(rule)\n    end\n  end\n\n  context \"called with two sizes\" do\n    it \"applies to height and width\" do\n      rule = \"height: 2em; width: 1em;\"\n\n      expect(\".size-both\").to have_ruleset(rule)\n    end\n  end\n\n  context \"called with auto\" do\n    it \"applies to auto to height\" do\n      rule = \"height: auto; width: 100px;\"\n\n      expect(\".size-auto\").to have_ruleset(rule)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/strip_unit_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"strip-unit\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/strip-unit\")\n  end\n\n  context \"called with px\" do\n    it \"strips units\" do\n      expect(\".px\").to have_rule(\"width: 10\")\n    end\n  end\n\n  context \"called with em\" do\n    it \"strips units\" do\n      expect(\".em\").to have_rule(\"width: 2\")\n    end\n  end\n\n  context \"called with rem\" do\n    it \"strips units\" do\n      expect(\".rem\").to have_rule(\"width: 1.5\")\n    end\n  end\n\n  context \"called with percent\" do\n    it \"strips units\" do\n      expect(\".percent\").to have_rule(\"width: 20\")\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/text_inputs_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"text-inputs\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/text-inputs\")\n\n    @inputs_list = %w(\n      [type='color']\n      [type='date']\n      [type='datetime']\n      [type='datetime-local']\n      [type='email']\n      [type='month']\n      [type='number']\n      [type='password']\n      [type='search']\n      [type='tel']\n      [type='text']\n      [type='time']\n      [type='url']\n      [type='week']\n      input:not([type])\n      textarea\n    )\n  end\n\n  context \"expands plain text inputs\" do\n    it \"finds selectors\" do\n      list = @inputs_list.join(\", \")\n      ruleset = \"content: #{list};\"\n\n      expect(\".all-text-inputs\").to have_ruleset(ruleset)\n    end\n  end\n\n  context \"expands active text inputs\" do\n    it \"finds selectors\" do\n      list = @inputs_list.map { |input| \"#{input}:active\" }\n      list = list.join(\", \")\n      ruleset = \"content: #{list};\"\n\n      expect(\".all-text-inputs-active\").to have_ruleset(ruleset)\n    end\n  end\n\n  context \"expands focus text inputs\" do\n    it \"finds selectors\" do\n      list = @inputs_list.map { |input| \"#{input}:focus\" }\n      list = list.join(\", \")\n      ruleset = \"content: #{list};\"\n\n      expect(\".all-text-inputs-focus\").to have_ruleset(ruleset)\n    end\n  end\n\n  context \"expands hover text inputs\" do\n    it \"finds selectors\" do\n      list = @inputs_list.map { |input| \"#{input}:hover\" }\n      list = list.join(\", \")\n      ruleset = \"content: #{list};\"\n\n      expect(\".all-text-inputs-hover\").to have_ruleset(ruleset)\n    end\n  end\n\n  context \"expands invalid text inputs\" do\n    it \"finds selectors\" do\n      list = @inputs_list.map { |input| \"#{input}:invalid\" }\n      list = list.join(\", \")\n      ruleset = \"content: #{list};\"\n\n      expect(\".all-text-inputs-invalid\").to have_ruleset(ruleset)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/tint_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"tint\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/tint\")\n  end\n\n  context \"called on white\" do\n    it \"still returns white\" do\n      expect(\".tint-white\").to have_rule(\"color: white\")\n    end\n  end\n\n  context \"called on black\" do\n    it \"tints black\" do\n      expect(\".tint-black\").to have_rule(\"color: gray\")\n    end\n  end\n\n  context \"called on red\" do\n    it \"tints red\" do\n      expect(\".tint-red\").to have_rule(\"color: #ff4040\")\n    end\n  end\n\n  context \"called on gray\" do\n    it \"tints gray\" do\n      expect(\".tint-gray\").to have_rule(\"color: #c6c6c6\")\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/library/triangle_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"triangle\" do\n  before(:all) do\n    ParserSupport.parse_file(\"library/triangle\")\n  end\n\n  context \"called with defaults\" do\n    it \"outputs the properties\" do\n      ruleset = \"border-style: solid; \" +\n                \"height: 0; \" +\n                \"width: 0; \" +\n                \"border-color: transparent transparent #b25c9c; \" +\n                \"border-width: 0 1rem 1rem;\"\n\n      expect(\".triangle--up\").to have_ruleset(ruleset)\n    end\n  end\n\n  context \"called with arguments\" do\n    it \"outputs the properties\" do\n      ruleset = \"border-style: solid; \" +\n                \"height: 0; \" +\n                \"width: 0; \" +\n                \"border-color: transparent transparent transparent #aaa; \" +\n                \"border-width: 6px 0 6px 5px;\"\n\n      expect(\".triangle--right\").to have_ruleset(ruleset)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/utilities/assign_inputs_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"assign-inputs\" do\n  before(:all) do\n    ParserSupport.parse_file(\"utilities/assign-inputs\")\n    @text_inputs_list = [\n      \"[type='password']\",\n      \"[type='text']\",\n      \"textarea\"\n    ]\n  end\n\n  context \"expands plain text inputs\" do\n    it \"finds selectors\" do\n      @text_inputs_list.each do |input|\n        expect(input).to have_rule(\"color: #f00\")\n      end\n    end\n  end\n\n  context \"expands text inputs with pseudo classes\" do\n    it \"finds selectors\" do\n      list = @text_inputs_list.dup\n      list.map! { |input| input + \":active\" }\n      list.each do |input|\n        expect(input).to have_rule(\"color: #0f0\")\n      end\n    end\n  end\n\n  context \"expands text inputs when first in list\" do\n    it \"finds selectors\" do\n      list = @text_inputs_list.dup\n      list.push \"select\"\n      list.each do |input|\n        expect(input).to have_rule(\"color: #00f\")\n      end\n    end\n  end\n\n  context \"expands text inputs when middle of list\" do\n    it \"finds selectors\" do\n      list = @text_inputs_list.dup\n      list.unshift \"[type=\\\"file\\\"]\"\n      list.each do |input|\n        expect(input).to have_rule(\"color: #f0f\")\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/utilities/compact_shorthand_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"compact-shorthand\" do\n  before(:all) do\n    ParserSupport.parse_file(\"utilities/compact-shorthand\")\n  end\n\n  context \"compact-shorthand\" do\n    it \"returns four values unaltered\" do\n      expect(\".four-values-a\").to have_rule(\"padding: 10px 20px 30px 40px\")\n    end\n\n    it \"returns four values when the left and right values are not equal\" do\n      expect(\".four-values-b\").to have_rule(\"padding: 5px 10px 5px 20px\")\n    end\n\n    it \"compacts four values to two values when the top/bottom and \" +\n       \"left/right values are equal\" do\n      expect(\".two-values\").to have_rule(\"padding: 50px 100px\")\n    end\n\n    it \"compacts four values to one value when they all match\" do\n      expect(\".one-value\").to have_rule(\"padding: 10px\")\n    end\n\n    it \"skips null values\" do\n      expect(\".null-value\").to have_rule(\"padding: 10px 20px\")\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/utilities/contrast_ratio_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"contrast-ratio\" do\n  before(:all) do\n    ParserSupport.parse_file(\"utilities/contrast-ratio\")\n  end\n\n  context \"calculates between white and black\" do\n    it \"outputs the contrast ratio\" do\n      rule = \"content: 21;\"\n\n      expect(\".contrast-ratio-black\").to have_ruleset(rule)\n    end\n  end\n\n  context \"calculates between white and blue\" do\n    it \"outputs the contrast ratio\" do\n      rule = \"content: 8.59247;\"\n\n      expect(\".contrast-ratio-blue\").to have_ruleset(rule)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/utilities/directional_property_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"directional-property\" do\n  before(:all) do\n    ParserSupport.parse_file(\"utilities/directional-property\")\n  end\n\n  context \"directional-property\" do\n    it \"returns property and values with four distinct lengths\" do\n      expect(\".border-all\").to have_rule(\"border-width: 2px 5px 8px 12px\")\n    end\n\n    it \"returns property and value with one length\" do\n      expect(\".border-top\").to have_rule(\"border-top: 10px\")\n    end\n\n    it \"returns property and value with vertical and horizontal values\" do\n      expect(\".border-color\").to have_rule(\"border-color: #fff #000\")\n    end\n\n    it \"returns properties for top and bottom margin\" do\n      ruleset = \"margin-top: 20px; \" +\n                \"margin-bottom: 10px;\"\n\n      expect(\".margin-null\").to have_ruleset(ruleset)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/utilities/fetch_bourbon_setting_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"fetch-bourbon-setting\" do\n  before(:all) do\n    ParserSupport.parse_file(\"utilities/fetch-bourbon-setting\")\n  end\n\n  context \"fetches the modular-scale-base setting\" do\n    it \"and returns the default value\" do\n      expect(\".test-1\").to have_rule(\"content: 1em\")\n    end\n  end\n\n  context \"fetches the rails-asset-pipeline setting\" do\n    it \"and returns the user-overridden value\" do\n      expect(\".test-2\").to have_rule(\"content: true\")\n    end\n  end\n\n  context \"called from the font-face mixin\" do\n    it \"outputs user-overridden font file formats\" do\n      ruleset = 'font-family: \"source-sans-pro\"; ' +\n                'src: font-url(\"source-sans-pro-regular.woff2\") ' +\n                     'format(\"woff2\"), ' +\n                     'font-url(\"source-sans-pro-regular.woff\") ' +\n                     'format(\"woff\");'\n\n      expect(\"@font-face\").to have_ruleset(ruleset)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/utilities/font_source_declaration_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"font-source-declaration\" do\n  before(:all) do\n    ParserSupport.parse_file(\"utilities/font-source-declaration\")\n  end\n\n  context \"called with pipeline\" do\n    it \"returns pipeline path\" do\n      rule = 'src: font-url(\"b.woff2\") format(\"woff2\"), ' +\n             'font-url(\"b.woff\") format(\"woff\")'\n      expect(\".has-pipeline\").to have_rule(rule)\n    end\n  end\n\n  context \"called with no pipeline\" do\n    it \"does not return pipeline path\" do\n      rule = 'src: url(\"b.woff2\") format(\"woff2\"), ' +\n             'url(\"b.woff\") format(\"woff\")'\n      expect(\".no-pipeline\").to have_rule(rule)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/utilities/gamma_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"gamma\" do\n  before(:all) do\n    ParserSupport.parse_file(\"utilities/gamma\")\n  end\n\n  context \"called on a color channel\" do\n    it \"outputs a gamma value between 0 and 1\" do\n      rule = \"content: 0.12168;\"\n\n      expect(\".gamma\").to have_ruleset(rule)\n    end\n  end\n\n  context \"called on a full color channel\" do\n    it \"outputs a gamma value between 0 and 1\" do\n      rule = \"content: 1;\"\n\n      expect(\".gamma-full\").to have_ruleset(rule)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/utilities/lightness_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"lightness\" do\n  before(:all) do\n    ParserSupport.parse_file(\"utilities/lightness\")\n  end\n\n  context \"called on black\" do\n    it \"outputs a number between 0 and 1 to indicate lightness\" do\n      rule = \"content: 0;\"\n\n      expect(\".lightness-black\").to have_ruleset(rule)\n    end\n  end\n\n  context \"called on white\" do\n    it \"outputs a number between 0 and 1 to indicate lightness\" do\n      rule = \"content: 1;\"\n\n      expect(\".lightness-white\").to have_ruleset(rule)\n    end\n  end\n\n  context \"called on gray\" do\n    it \"outputs a number between 0 and 1 to indicate lightness\" do\n      rule = \"content: 0.20503;\"\n\n      expect(\".lightness-gray\").to have_ruleset(rule)\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/utilities/unpack_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"unpack\" do\n  before(:all) do\n    ParserSupport.parse_file(\"utilities/unpack\")\n  end\n\n  context \"single\" do\n    it \"unpacks four identical measurements\" do\n      expect(\".single\").to have_rule(\"padding: 10px 10px 10px 10px\")\n    end\n  end\n\n  context \"double\" do\n    it \"unpacks identical measurements for top and bottom,\n      and different identical measurements for left and right\" do\n      expect(\".double\").to have_rule(\"padding: 1em 2em 1em 2em\")\n    end\n  end\n\n  context \"triple\" do\n    it \"unpacks identical measurements for left and right\" do\n      expect(\".triple\").to have_rule(\"padding: 10px 20px 0 20px\")\n    end\n  end\n\n  context \"quadruple\" do\n    it \"unpacks four distict measurements\" do\n      expect(\".quadruple\").to have_rule(\"padding: 0 calc(1em + 10px) 20px 50px\")\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/validators/contains_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"contains\" do\n  before(:all) do\n    ParserSupport.parse_file(\"validators/contains\")\n  end\n\n  context \"called on array with single item\" do\n    it \"contains item\" do\n      expect(\".single\").to have_rule(\"color: #fff\")\n    end\n\n    it \"doesn't contain missing item\" do\n      expect(\".single-missing\").to have_rule(\"color: #000\")\n    end\n  end\n\n  context \"called with array with multiple items\" do\n    it \"contains item\" do\n      expect(\".multiple\").to have_rule(\"color: #fff\")\n    end\n\n    it \"doesn't contain missing item\" do\n      expect(\".multiple-missing\").to have_rule(\"color: #000\")\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/validators/is_length_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"is-length\" do\n  before(:all) do\n    ParserSupport.parse_file(\"validators/is-length\")\n  end\n\n  context \"checks if unitless integer can be represented as a length\" do\n    it \"returns false\" do\n      expect(\".integer\").not_to have_rule(\"color: #fff\")\n    end\n  end\n\n  context \"checks if px can be represented as a length\" do\n    it \"returns true\" do\n      expect(\".pixels\").to have_rule(\"color: #fff\")\n    end\n  end\n\n  context \"checks if em can be represented as a length\" do\n    it \"returns true\" do\n      expect(\".ems\").to have_rule(\"color: #fff\")\n    end\n  end\n\n  context \"checks if percent can be represented as a length\" do\n    it \"returns true\" do\n      expect(\".percent\").to have_rule(\"color: #fff\")\n    end\n  end\n\n  context \"parses calculated values\" do\n    it \"returns true\" do\n      expect(\".calc\").to have_rule(\"color: #fff\")\n    end\n  end\n\n  context \"parses custom properties\" do\n    it \"returns true\" do\n      expect(\".var\").to have_rule(\"color: #fff\")\n    end\n  end\n\n  context \"parses environment variables\" do\n    it \"returns true\" do\n      expect(\".env\").to have_rule(\"color: #fff\")\n    end\n  end\n\n  context \"checks if strings can be represented as a length\" do\n    it \"returns false\" do\n      expect(\".string\").not_to have_rule(\"color: #fff\")\n    end\n  end\n\n  context \"checks if null can be represented as a length\" do\n    it \"returns false\" do\n      expect(\".null\").not_to have_rule(\"color: #fff\")\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/validators/is_number_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"is-number\" do\n  before(:all) do\n    ParserSupport.parse_file(\"validators/is-number\")\n  end\n\n  context \"called with integer\" do\n    it \"is a number\" do\n      expect(\".integer\").to have_rule(\"line-height: 1\")\n    end\n  end\n\n  context \"called with px\" do\n    it \"is a number\" do\n      expect(\".px\").to have_rule(\"line-height: 2px\")\n    end\n  end\n\n  context \"called with em\" do\n    it \"is a number\" do\n      expect(\".em\").to have_rule(\"line-height: 3em\")\n    end\n  end\n\n  context \"called with rem\" do\n    it \"is a number\" do\n      expect(\".rem\").to have_rule(\"line-height: 4rem\")\n    end\n  end\n\n  context \"called with percent\" do\n    it \"is a number\" do\n      expect(\".percent\").to have_rule(\"line-height: 5%\")\n    end\n  end\n\n  context \"called with string\" do\n    it \"is not a number\" do\n      expect(\".string\").to_not have_rule(\"line-height: \\\"stringy\\\"\")\n    end\n  end\nend\n"
  },
  {
    "path": "spec/bourbon/validators/is_size_spec.rb",
    "content": "require \"spec_helper\"\n\ndescribe \"is-size\" do\n  before(:all) do\n    ParserSupport.parse_file(\"validators/is-size\")\n  end\n\n  context \"called with integer\" do\n    it \"is not a size\" do\n      expect(\".integer\").to_not have_rule(\"margin-top: 1\")\n    end\n  end\n\n  context \"called with px\" do\n    it \"is a size\" do\n      expect(\".px\").to have_rule(\"margin-top: 2px\")\n    end\n  end\n\n  context \"called with em\" do\n    it \"is a size\" do\n      expect(\".em\").to have_rule(\"margin-top: 3em\")\n    end\n  end\n\n  context \"called with rem\" do\n    it \"is a size\" do\n      expect(\".rem\").to have_rule(\"margin-top: 4rem\")\n    end\n  end\n\n  context \"called with percent\" do\n    it \"is a size\" do\n      expect(\".percent\").to have_rule(\"margin-top: 5%\")\n    end\n  end\n\n  context \"called with string\" do\n    it \"is not a size\" do\n      expect(\".string\").to_not have_rule(\"margin-top: \\\"stringy\\\"\")\n    end\n  end\nend\n"
  },
  {
    "path": "spec/fixtures/_setup.scss",
    "content": "@import \"core/bourbon\";\n"
  },
  {
    "path": "spec/fixtures/library/border-color.scss",
    "content": "@import \"setup\";\n\n$red: #f00;\n$blue: #0f0;\n$green: #00f;\n$purple: #ff0;\n\n.border-color-all {\n  @include border-color($red);\n}\n\n.border-color-alternate {\n  @include border-color($blue $green);\n}\n\n.border-color-implied-left {\n  @include border-color($red $blue $green);\n}\n\n.border-color-explicit {\n  @include border-color($green $blue $red $purple);\n}\n\n.border-color-false-third {\n  @include border-color($blue $purple null $green);\n}\n"
  },
  {
    "path": "spec/fixtures/library/border-radius.scss",
    "content": "@import \"setup\";\n\n.border-top-radius {\n  @include border-top-radius(1em);\n}\n\n.border-left-radius {\n  @include border-left-radius(2em);\n}\n\n.border-right-radius {\n  @include border-right-radius(3em);\n}\n\n.border-bottom-radius {\n  @include border-bottom-radius(4em);\n}\n"
  },
  {
    "path": "spec/fixtures/library/border-style.scss",
    "content": "@import \"setup\";\n\n.border-style-all {\n  @include border-style(solid);\n}\n\n.border-style-alternate {\n  @include border-style(dotted dashed);\n}\n\n.border-style-implied-left {\n  @include border-style(dashed double solid);\n}\n\n.border-style-explicit {\n  @include border-style(dotted groove ridge none);\n}\n\n.border-style-false-third {\n  @include border-style(inset none null double);\n}\n"
  },
  {
    "path": "spec/fixtures/library/border-width.scss",
    "content": "@import \"setup\";\n\n.border-width-all {\n  @include border-width(1px);\n}\n\n.border-width-alternate {\n  @include border-width(2px 3px);\n}\n\n.border-width-implied-left {\n  @include border-width(4px 5px 6px);\n}\n\n.border-width-explicit {\n  @include border-width(7px 8px 9px 10px);\n}\n\n.border-width-false-third {\n  @include border-width(11px 12px null 13px);\n}\n"
  },
  {
    "path": "spec/fixtures/library/buttons.scss",
    "content": "@import \"setup\";\n\n.all-buttons {\n  content: $all-buttons;\n}\n\n.all-buttons-active {\n  content: $all-buttons-active;\n}\n\n.all-buttons-focus {\n  content: $all-buttons-focus;\n}\n\n.all-buttons-hover {\n  content: $all-buttons-hover;\n}\n"
  },
  {
    "path": "spec/fixtures/library/clearfix.scss",
    "content": "@import \"setup\";\n\n.clearfix {\n  @include clearfix;\n}\n"
  },
  {
    "path": "spec/fixtures/library/contrast-switch.scss",
    "content": "@import \"setup\";\n\n.contrast-switch-light-base {\n  color: contrast-switch(#bae6e6);\n}\n\n.contrast-switch-dark-base {\n  color: contrast-switch(#2d72d9, #222, #eee);\n}\n"
  },
  {
    "path": "spec/fixtures/library/ellipsis.scss",
    "content": "@import \"setup\";\n\n.ellipsis {\n  @include ellipsis;\n}\n"
  },
  {
    "path": "spec/fixtures/library/font-face-1.scss",
    "content": "@import \"setup\";\n\n@include font-face(\n  \"source-sans-pro\",\n  \"/fonts/source-sans-pro/source-sans-pro-regular\"\n);\n"
  },
  {
    "path": "spec/fixtures/library/font-face-2.scss",
    "content": "@import \"setup\";\n\n@include font-face(\n  \"calibre\",\n  \"fonts/calibre\"\n) {\n  font-style: normal;\n  font-weight: 600;\n  unicode-range: U+26;\n}\n"
  },
  {
    "path": "spec/fixtures/library/font-face-3.scss",
    "content": "@import \"setup\";\n\n@include font-face(\n  \"pitch\",\n  \"/fonts/pitch\",\n  \"woff2\",\n  $asset-pipeline: true\n);\n"
  },
  {
    "path": "spec/fixtures/library/font-stacks.scss",
    "content": "@import \"setup\";\n\n.helvetica {\n  content: $font-stack-helvetica;\n}\n\n.lucida-grande {\n  content: $font-stack-lucida-grande;\n}\n\n.verdana {\n  content: $font-stack-verdana;\n}\n\n.garamond {\n  content: $font-stack-garamond;\n}\n\n.georgia {\n  content: $font-stack-georgia;\n}\n\n.hoefler-text {\n  content: $font-stack-hoefler-text;\n}\n\n.consolas {\n  content: $font-stack-consolas;\n}\n\n.courier-new {\n  content: $font-stack-courier-new;\n}\n\n.monaco {\n  content: $font-stack-monaco;\n}\n\n.system {\n  content: $font-stack-system;\n}\n"
  },
  {
    "path": "spec/fixtures/library/hide-text.scss",
    "content": "@import \"setup\";\n\n.hide-text {\n  @include hide-text;\n}\n"
  },
  {
    "path": "spec/fixtures/library/hide-visually.scss",
    "content": "@import \"setup\";\n\n.hide-visually {\n  @include hide-visually;\n}\n\n.hide-visually--unhide {\n  @include hide-visually(\"unhide\");\n}\n"
  },
  {
    "path": "spec/fixtures/library/margin.scss",
    "content": "@import \"setup\";\n\n.margin-all {\n  @include margin(1px);\n}\n\n.margin-alternate {\n  @include margin(2px 3px);\n}\n\n.margin-implied-left {\n  @include margin(4px 5px 6px);\n}\n\n.margin-explicit {\n  @include margin(7px 8px 9px 10px);\n}\n\n.margin-false-third {\n  @include margin(11px 12px null 13px);\n}\n"
  },
  {
    "path": "spec/fixtures/library/modular-scale.scss",
    "content": "@import \"setup\";\n\n.one {\n  &-base-two {\n    font-size: modular-scale(1, $value: 2em);\n  }\n\n  &-base-three {\n    font-size: modular-scale(1, $value: 3em);\n  }\n\n  &-double-value {\n    font-size: modular-scale(1, $value: 1em 2em);\n  }\n\n  &-golden-ratio {\n    font-size: modular-scale(1, $ratio: $golden);\n  }\n}\n\n.two {\n  &-base-one {\n    font-size: modular-scale(2, $value: 1em);\n  }\n\n  &-double-value {\n    font-size: modular-scale(2, $value: 2em);\n  }\n}\n"
  },
  {
    "path": "spec/fixtures/library/overflow-wrap.scss",
    "content": "@import \"setup\";\n\n.overflow-wrap {\n  @include overflow-wrap;\n}\n\n.overflow-wrap-normal {\n  @include overflow-wrap(normal);\n}\n"
  },
  {
    "path": "spec/fixtures/library/padding.scss",
    "content": "@import \"setup\";\n\n.padding-all {\n  @include padding(1px);\n}\n\n.padding-alternate {\n  @include padding(2px 3px);\n}\n\n.padding-implied-left {\n  @include padding(4px 5px 6px);\n}\n\n.padding-explicit {\n  @include padding(7px 8px 9px 10px);\n}\n\n.padding-false-third {\n  @include padding(11px 12px null 13px);\n}\n"
  },
  {
    "path": "spec/fixtures/library/position.scss",
    "content": "@import \"setup\";\n\n.position-all {\n  @include position(fixed, 1em);\n}\n\n.position-alternate {\n  @include position(absolute, 2px 3px);\n}\n\n.position-implied-left {\n  @include position(relative, 4px 5px 6px);\n}\n\n.position-explicit {\n  @include position(fixed, 7px 8px 9px 10px);\n}\n\n.position-false-third {\n  @include position(static, 11px null null 13px);\n}\n"
  },
  {
    "path": "spec/fixtures/library/prefixer.scss",
    "content": "@import \"setup\";\n\n.prefix {\n  @include prefixer(appearance, none);\n}\n\n.prefix--webkit {\n  @include prefixer(appearance, none, (\"webkit\"));\n}\n\n.prefix--moz-ms {\n  @include prefixer(appearance, none, (\"moz\", \"ms\"));\n}\n"
  },
  {
    "path": "spec/fixtures/library/shade.scss",
    "content": "@import \"setup\";\n\n.shade-white {\n  color: shade(#fff, 75%);\n}\n\n.shade-black {\n  color: shade(#000, 50%);\n}\n\n.shade-red {\n  color: shade(#f00, 25%);\n}\n\n.shade-gray {\n  color: shade(#222, 33%);\n}\n"
  },
  {
    "path": "spec/fixtures/library/size.scss",
    "content": "@import \"setup\";\n\n.size-implicit {\n  @include size(10px);\n}\n\n.size-both {\n  @include size(1em, 2em);\n}\n\n.size-auto {\n  @include size(100px, auto);\n}\n"
  },
  {
    "path": "spec/fixtures/library/strip-unit.scss",
    "content": "@import \"setup\";\n\n.px {\n  width: strip-unit(10px);\n}\n\n.em {\n  width: strip-unit(2em);\n}\n\n.rem {\n  width: strip-unit(1.5rem);\n}\n\n.percent {\n  width: strip-unit(20%);\n}\n"
  },
  {
    "path": "spec/fixtures/library/text-inputs.scss",
    "content": "@import \"setup\";\n\n.all-text-inputs {\n  content: $all-text-inputs;\n}\n\n.all-text-inputs-active {\n  content: $all-text-inputs-active;\n}\n\n.all-text-inputs-focus {\n  content: $all-text-inputs-focus;\n}\n\n.all-text-inputs-hover {\n  content: $all-text-inputs-hover;\n}\n\n.all-text-inputs-invalid {\n  content: $all-text-inputs-invalid;\n}\n"
  },
  {
    "path": "spec/fixtures/library/tint.scss",
    "content": "@import \"setup\";\n\n.tint-white {\n  color: tint(#fff, 75%);\n}\n\n.tint-black {\n  color: tint(#000, 50%);\n}\n\n.tint-red {\n  color: tint(#f00, 25%);\n}\n\n.tint-gray {\n  color: tint(#aaa, 33%);\n}\n"
  },
  {
    "path": "spec/fixtures/library/triangle.scss",
    "content": "@import \"setup\";\n\n.triangle--up {\n  @include triangle(\"up\", 2rem, 1rem, #b25c9c);\n}\n\n.triangle--right {\n  @include triangle(\"right\", 5px, 12px, #aaa);\n}\n"
  },
  {
    "path": "spec/fixtures/utilities/assign-inputs.scss",
    "content": "@import \"setup\";\n\n#{_assign-inputs($_text-inputs-list)} {\n  color: #f00;\n}\n\n#{_assign-inputs($_text-inputs-list, active)} {\n  color: #0f0;\n}\n\n#{_assign-inputs($_text-inputs-list)},\nselect {\n  color: #00f;\n}\n\n[type=\"file\"],\n#{_assign-inputs($_text-inputs-list)} {\n  color: #f0f;\n}\n"
  },
  {
    "path": "spec/fixtures/utilities/compact-shorthand.scss",
    "content": "@import \"setup\";\n\n.four-values-a {\n  padding: _compact-shorthand(10px 20px 30px 40px);\n}\n\n.four-values-b {\n  padding: _compact-shorthand(5px 10px 5px 20px);\n}\n\n.two-values {\n  padding: _compact-shorthand(50px 100px 50px 100px);\n}\n\n.one-value {\n  padding: _compact-shorthand(10px 10px 10px 10px);\n}\n\n.null-value {\n  padding: _compact-shorthand(10px null 20px);\n}\n"
  },
  {
    "path": "spec/fixtures/utilities/contrast-ratio.scss",
    "content": "@import \"setup\";\n\n.contrast-ratio-black {\n  content: _contrast-ratio(#fff, #000);\n}\n\n.contrast-ratio-blue {\n  content: _contrast-ratio(#fff, #00f);\n}\n"
  },
  {
    "path": "spec/fixtures/utilities/directional-property.scss",
    "content": "@import \"setup\";\n\n.border-all {\n  @include _directional-property(border, width, 2px 5px 8px 12px);\n}\n\n.border-top {\n  @include _directional-property(border, top, 10px);\n}\n\n.border-color {\n  @include _directional-property(border, color, #fff #000);\n}\n\n.margin-null {\n  @include _directional-property(margin, null, 20px null 10px);\n}\n"
  },
  {
    "path": "spec/fixtures/utilities/fetch-bourbon-setting.scss",
    "content": "@import \"setup\";\n\n$bourbon: (\n  \"global-font-file-formats\": (\"woff2\", \"woff\"),\n  \"rails-asset-pipeline\": true,\n);\n\n.test-1 {\n  content: _fetch-bourbon-setting(\"modular-scale-base\");\n}\n\n.test-2 {\n  content: _fetch-bourbon-setting(\"rails-asset-pipeline\");\n}\n\n@include font-face(\"source-sans-pro\", \"source-sans-pro-regular\");\n"
  },
  {
    "path": "spec/fixtures/utilities/font-source-declaration.scss",
    "content": "@import \"setup\";\n\n$file-formats: (\"woff2\", \"woff\");\n\n.has-pipeline {\n  src: _font-source-declaration(\"a\", \"b\", true, $file-formats);\n}\n\n.no-pipeline {\n  src: _font-source-declaration(\"a\", \"b\", false, $file-formats);\n}\n"
  },
  {
    "path": "spec/fixtures/utilities/gamma.scss",
    "content": "@import \"setup\";\n\n.gamma {\n  content: _gamma(100 / 255);\n}\n\n.gamma-full {\n  content: _gamma(255 / 255);\n}\n"
  },
  {
    "path": "spec/fixtures/utilities/lightness.scss",
    "content": "@import \"setup\";\n\n.lightness-black {\n  content: _lightness(#000);\n}\n\n.lightness-white {\n  content: _lightness(#fff);\n}\n\n.lightness-gray {\n  content: _lightness(mix(#000, #fff, 50%));\n}\n"
  },
  {
    "path": "spec/fixtures/utilities/unpack.scss",
    "content": "@import \"setup\";\n\n.single {\n  padding: _unpack-shorthand(10px);\n}\n\n.double {\n  padding: _unpack-shorthand(1em 2em);\n}\n\n.triple {\n  padding: _unpack-shorthand(10px 20px 0);\n}\n\n.quadruple {\n  padding: _unpack-shorthand(0 calc(1em + 10px) 20px 50px);\n}\n"
  },
  {
    "path": "spec/fixtures/validators/contains.scss",
    "content": "@import \"setup\";\n\n$single: \"apple\";\n$multiple: \"pineapple\", \"banana\", \"cumquat\";\n\n@mixin color-contains($list, $values) {\n  @if _contains($list, $values) {\n    color: #fff;\n  } @else {\n    color: #000;\n  }\n}\n\n.single {\n  @include color-contains($single, \"apple\");\n}\n\n.single-missing {\n  @include color-contains($single, \"pear\");\n}\n\n.multiple {\n  @include color-contains($multiple, \"banana\");\n}\n\n.multiple-missing {\n  @include color-contains($multiple, \"strawberry\");\n}\n"
  },
  {
    "path": "spec/fixtures/validators/is-length.scss",
    "content": "@import \"setup\";\n\n@mixin color-length($value) {\n  @if _is-length($value) {\n    color: #fff;\n  }\n}\n\n.integer {\n  @include color-length(1);\n}\n\n.pixels {\n  @include color-length(10px);\n}\n\n.ems {\n  @include color-length(10em);\n}\n\n.percent {\n  @include color-length(10%);\n}\n\n.calc {\n  @include color-length(calc(2em - 5px));\n}\n\n.env {\n  @include color-length(env(safe-area-inset-top, 0));\n}\n\n.var {\n  @include color-length(var(--a-custom-property));\n}\n\n.string {\n  @include color-length(\"stringy\");\n}\n\n.null {\n  @include color-length(null);\n}\n"
  },
  {
    "path": "spec/fixtures/validators/is-number.scss",
    "content": "@import \"setup\";\n\n@mixin line-height($number) {\n  @if _is-number($number) {\n    line-height: $number;\n  }\n}\n\n.integer {\n  @include line-height(1);\n}\n\n.px {\n  @include line-height(2px);\n}\n\n.em {\n  @include line-height(3em);\n}\n\n.rem {\n  @include line-height(4rem);\n}\n\n.percent {\n  @include line-height(5%);\n}\n\n.string {\n  @include line-height(\"stringy\");\n}\n"
  },
  {
    "path": "spec/fixtures/validators/is-size.scss",
    "content": "@import \"setup\";\n\n@mixin size-margin($size) {\n  @if _is-size($size) {\n    margin-top: $size;\n  }\n}\n\n.integer {\n  @include size-margin(1);\n}\n\n.px {\n  @include size-margin(2px);\n}\n\n.em {\n  @include size-margin(3em);\n}\n\n.rem {\n  @include size-margin(4rem);\n}\n\n.percent {\n  @include size-margin(5%);\n}\n\n.string {\n  @include size-margin(\"stringy\");\n}\n"
  },
  {
    "path": "spec/spec_helper.rb",
    "content": "$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), \"..\", \"lib\"))\n$LOAD_PATH.unshift(File.dirname(__FILE__))\nrequire \"rspec\"\nrequire \"bourbon\"\nrequire \"aruba/api\"\nrequire \"css_parser\"\nDir[\"#{File.dirname(__FILE__)}/support/**/*.rb\"].each { |f| require f }\n\nRSpec.configure do |config|\n  config.include SassSupport\n  config.include CssParser\n  config.include ParserSupport\n  config.include Aruba::Api\n\n  config.before(:all) do\n    generate_css\n  end\n\n  config.after(:all) do\n    clean_up\n  end\nend\n"
  },
  {
    "path": "spec/support/matchers/have_rule.rb",
    "content": "RSpec::Matchers.define :have_rule do |expected|\n  match do |selector|\n    @rules = rules_from_selector(selector)\n    @rules.include? expected\n  end\n\n  failure_message do |selector|\n    if @rules.empty?\n      %{no CSS for selector #{selector} were found}\n    else\n      rules = @rules.join(\"; \")\n      %{Expected selector #{selector} to have CSS rule \"#{expected}\".\n        Had \"#{rules}\".}\n    end\n  end\n\n  def rules_from_selector(selector)\n    rulesets = ParserSupport.parser.find_by_selector(selector)\n    if rulesets.empty?\n      []\n    else\n      rules(rulesets)\n    end\n  end\n\n  def rules(rulesets)\n    rules = []\n    rulesets.map do |ruleset|\n      ruleset.split(\";\").each do |rule|\n        rules << rule.strip\n      end\n    end\n    rules\n  end\nend\n"
  },
  {
    "path": "spec/support/matchers/have_ruleset.rb",
    "content": "RSpec::Matchers.define :have_ruleset do |expected|\n  match do |selector|\n    @ruleset = rules_from_selector(selector)\n    @ruleset.join(\"; \") == expected\n  end\n\n  failure_message do |selector|\n    if @ruleset.empty?\n      %{no CSS for selector #{selector} were found}\n    else\n      ruleset = @ruleset.join(\"; \")\n      %{Expected selector #{selector} to have CSS rule \"#{expected}\".\n        Had \"#{ruleset}\".}\n    end\n  end\n\n  def rules_from_selector(selector)\n    ParserSupport.parser.find_by_selector(selector)\n  end\nend\n"
  },
  {
    "path": "spec/support/matchers/have_value.rb",
    "content": "RSpec::Matchers.define :have_value do |expected|\n  match do |variable|\n    selector_class = variable.sub(\"$\", \".\")\n    @value_attribute = ParserSupport.parser.find_by_selector(selector_class)[0]\n\n    unless @value_attribute.nil?\n      actual_value = @value_attribute.split(\":\")[1].strip.sub(\";\", \"\")\n      actual_value == expected\n    end\n  end\n\n  failure_message do |variable_name|\n    value_attribute = @value_attribute.to_s\n    %{Expected variable #{variable_name} to have value \"#{expected}\".\n      Had \"#{value_attribute}\".}\n  end\nend\n"
  },
  {
    "path": "spec/support/parser_support.rb",
    "content": "module ParserSupport\n  def self.parser\n    @parser ||= CssParser::Parser.new\n  end\n\n  def self.parse_file(identifier)\n    parser.load_file!(\"tmp/#{identifier}.css\")\n  end\n\n  def self.show_contents(identifier)\n    css_file_contents = File.open(\"tmp/#{identifier}.css\").read\n    css_file_contents.each_line do |line|\n      puts line\n    end\n  end\nend\n"
  },
  {
    "path": "spec/support/sass_support.rb",
    "content": "module SassSupport\n  def generate_css\n    FileUtils.mkdir(\"tmp\")\n    `sass -I . spec/fixtures:tmp --update --precision=5 --sourcemap=none`\n  end\n\n  def clean_up\n    FileUtils.rm_rf(\"tmp\")\n  end\nend\n"
  }
]