├── .circleci └── config.yml ├── .github ├── dependabot.yml └── workflows │ ├── dynamic-readme.yml │ └── dynamic-security.yml ├── .gitignore ├── .hound.yml ├── .node-version ├── .npmignore ├── .stylelintrc.json ├── .tool-versions ├── CHANGELOG.md ├── CODEOWNERS ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── RELEASING.md ├── SECURITY.md ├── bin └── setup ├── package-lock.json ├── package.json └── src ├── app-frame ├── README.md ├── index.scss └── lib │ └── app-frame.scss ├── avatar ├── README.md ├── index.scss └── lib │ └── avatar.scss ├── badge ├── README.md ├── index.scss └── lib │ └── badge.scss ├── button ├── README.md ├── index.scss └── lib │ └── button.scss ├── elements ├── index.scss └── lib │ ├── layout.scss │ ├── media.scss │ └── typography.scss ├── forms ├── README.md ├── index.scss └── lib │ ├── form.scss │ ├── input-button-unit.scss │ └── reset.scss ├── icon ├── README.md ├── index.scss └── lib │ └── icon.scss ├── index.scss ├── logo ├── emblem-inverted.svg ├── emblem.svg ├── horizontal-inverted.svg ├── horizontal.svg ├── veritcal.svg ├── vertical-inverted.svg ├── wordmark-inverted.svg └── wordmark.svg ├── media ├── README.md ├── index.scss └── lib │ └── media.scss ├── settings ├── README.md ├── index.scss ├── lib │ ├── breakpoints.scss │ ├── color-palette.scss │ ├── color.scss │ ├── controls.scss │ ├── focus.scss │ ├── layout.scss │ └── typography.scss └── tools │ ├── generate-breakpoint-classes.scss │ └── strip-unit.scss ├── skip-link ├── README.md ├── index.scss └── lib │ └── skip-link.scss ├── stack ├── README.md ├── index.scss └── lib │ ├── block-stack.scss │ └── inline-stack.scss └── utilities ├── README.md ├── index.scss └── lib ├── font-style.scss ├── font-weight.scss ├── inline-size.scss ├── line-height.scss ├── margin.scss ├── padding.scss └── text-align.scss /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | jobs: 4 | build: 5 | docker: 6 | - image: cimg/node:18.17.1 7 | 8 | steps: 9 | - checkout 10 | 11 | - restore_cache: 12 | keys: 13 | - v1-npm-deps-{{ checksum "package-lock.json" }} 14 | - v1-npm-deps- 15 | 16 | - run: 17 | name: Install npm dependencies 18 | command: npm ci 19 | 20 | - save_cache: 21 | key: v1-npm-deps-{{ checksum "package-lock.json" }} 22 | paths: 23 | - ~/usr/local/lib/node_modules 24 | 25 | - run: 26 | name: Compile Sass 27 | command: npm run compile-sass 28 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: 2 3 | 4 | updates: 5 | - package-ecosystem: npm 6 | directory: "/" 7 | schedule: 8 | interval: weekly 9 | time: "02:00" 10 | timezone: "Etc/UTC" 11 | open-pull-requests-limit: 10 12 | -------------------------------------------------------------------------------- /.github/workflows/dynamic-readme.yml: -------------------------------------------------------------------------------- 1 | name: update-templates 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | 9 | jobs: 10 | update-templates: 11 | permissions: 12 | contents: write 13 | pull-requests: write 14 | pages: write 15 | uses: thoughtbot/templates/.github/workflows/dynamic-readme.yaml@main 16 | secrets: 17 | token: ${{ secrets.GITHUB_TOKEN }} 18 | -------------------------------------------------------------------------------- /.github/workflows/dynamic-security.yml: -------------------------------------------------------------------------------- 1 | name: update-security 2 | 3 | on: 4 | push: 5 | paths: 6 | - SECURITY.md 7 | branches: 8 | - main 9 | workflow_dispatch: 10 | 11 | jobs: 12 | update-security: 13 | permissions: 14 | contents: write 15 | pull-requests: write 16 | pages: write 17 | uses: thoughtbot/templates/.github/workflows/dynamic-security.yaml@main 18 | secrets: 19 | token: ${{ secrets.GITHUB_TOKEN }} 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_store 2 | *.log 3 | dist 4 | node_modules 5 | -------------------------------------------------------------------------------- /.hound.yml: -------------------------------------------------------------------------------- 1 | scss: 2 | enabled: false 3 | stylelint: 4 | config_file: .stylelintrc.json 5 | enabled: true 6 | -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | 18.17.1 2 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | .hound.yml 3 | .stylelintrc.json 4 | bin/ 5 | CONTRIBUTING.md 6 | RELEASING.md 7 | -------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@thoughtbot/stylelint-config", 3 | "plugins": [ 4 | "stylelint-use-logical-spec" 5 | ], 6 | "rules": { 7 | "liberty/use-logical-spec": "always", 8 | "custom-property-pattern": [ 9 | "tbds-[a-z]+", { 10 | "message": "All CSS custom properties should be prefixed with `tbds-`" 11 | } 12 | ], 13 | "scss/at-function-pattern": [ 14 | "tbds-[a-z]+", { 15 | "message": "All Sass functions should be prefixed with `tbds-`" 16 | } 17 | ], 18 | "scss/at-mixin-pattern": [ 19 | "tbds-[a-z]+", { 20 | "message": "All Sass mixins should be prefixed with `tbds-`" 21 | } 22 | ], 23 | "scss/dollar-variable-pattern": [ 24 | "tbds-[a-z]+", { 25 | "ignore": "local", 26 | "message": "All Sass variables should be prefixed with `tbds-`" 27 | } 28 | ], 29 | "scss/dollar-variable-default": [ 30 | true, { 31 | "ignore": "local" 32 | } 33 | ], 34 | "selector-class-pattern": [ 35 | "tbds-[a-z]+", { 36 | "message": "All CSS classes should be prefixed with `tbds-`" 37 | } 38 | ] 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /.tool-versions: -------------------------------------------------------------------------------- 1 | nodejs 18.17.1 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. This 4 | project adheres to [Semantic Versioning](http://semver.org). 5 | 6 | ## [Unreleased (`main`)][unreleased] 7 | 8 | Nothing at the moment. 9 | 10 | [unreleased]: https://github.com/thoughtbot/design-system/compare/v0.7.2...HEAD 11 | 12 | ## [0.7.2] - 2021-10-21 13 | 14 | ### Changed 15 | 16 | - Add thoughtbot logos 17 | - Update documentation to include instructions for aliasing the package and 18 | using assets in Rails asset pipeline 19 | - Add .tool-versions for asdf users 20 | 21 | [0.7.2]: https://github.com/thoughtbot/design-system/compare/v0.7.1...v0.7.2 22 | 23 | ## [0.7.1] - 2021-09-29 24 | 25 | ### Changed 26 | 27 | - Update documentation to include links to the Figma library 28 | - Upgrade the project dependencies 29 | - Update project default branch to 'main' 30 | 31 | [0.7.1]: https://github.com/thoughtbot/design-system/compare/v0.7.0...v0.7.1 32 | 33 | ## [0.7.0] - 2020-03-05 34 | 35 | ### Added 36 | 37 | - A compiled CSS version of tbds is now packaged with each release. You can use 38 | the [unpkg CDN][unpkg] to load the CSS using a URL like 39 | `https://unpkg.com/@thoughtbot/design-system@0.7.0/dist/tbds.css`. 40 | 41 | [0.7.0]: https://github.com/thoughtbot/design-system/compare/v0.6.0...v0.7.0 42 | [unpkg]: https://unpkg.com/ 43 | 44 | ## [0.6.0] - 2020-03-03 45 | 46 | ### Added 47 | 48 | - Added more brand color variables, to match our 49 | [Brand Guidelines][brand-guidelines]: 50 | - `$tbds-brand-gray-medium` 51 | - `$tbds-brand-gray-light` 52 | - `$tbds-brand-gray-ultra-light` 53 | - `$tbds-brand-purple` 54 | - `$tbds-brand-yellow` 55 | - `$tbds-brand-yellow-light` 56 | - Added `display: none !important;` to the `[hidden]` attribute selector 57 | to ensure that elements using the HTML `hidden` attribute are 58 | actually hidden. 59 | 60 | ### Changed 61 | 62 | - Link underlines are now removed on state change (hover & focus). 63 | - `$tbds-brand-gray` is now `$tbds-brand-gray-dark`. 64 | - The value of `$tbds-brand-blue` is now `#2e52e4`. 65 | 66 | [0.6.0]: https://github.com/thoughtbot/design-system/compare/v0.5.0...v0.6.0 67 | [brand-guidelines]: https://thoughtbot.com/playbook/our-company/brand/colors 68 | 69 | ## [0.5.0] - 2019-09-19 70 | 71 | ### Added 72 | 73 | - Added a Badge component 74 | - Added a Skip link component 75 | - Added support for media in inverted color mode 76 | 77 | [0.5.0]: https://github.com/thoughtbot/design-system/compare/v0.4.0...v0.5.0 78 | 79 | ## [0.4.0] - 2019-09-09 80 | 81 | ### Added 82 | 83 | - Added `$tbds-control-block-size` to set controls (text inputs and buttons) to 84 | the same block size. 85 | - Margin utilities now include `auto` (e.g. `tbds-margin-inline-auto`). 86 | 87 | ### Changed 88 | 89 | - When using `tbds-form` elements (e.g. `tbds-form__text-input`), you now must 90 | ensure that the parent `
` has the `tbds-form` class. 91 | - The `--border-radius` custom property in the `tbds-avatar` component was 92 | renamed to `--tbds-avatar-border-radius`. 93 | - The `--size` custom property in the `tbds-avatar` component was 94 | renamed to `--tbds-avatar-size`. 95 | - The `--size` custom property in the `tbds-icon` component was 96 | renamed to `--tbds-icon-size`. 97 | - The `--gap` custom property in the `tbds-block-stack` component was 98 | renamed to `--tbds-block-stack-gap`. 99 | - The `--gap` custom property in the `tbds-inline-stack` component was 100 | renamed to `--tbds-inline-stack-gap`. 101 | 102 | [0.4.0]: https://github.com/thoughtbot/design-system/compare/v0.3.0...v0.4.0 103 | 104 | ## [0.3.0] - 2019-06-19 105 | 106 | ### Added 107 | 108 | - Added the `tbds-line-height-0` utility class. 109 | - Added breakpoint variants for the `margin`, `padding`, and `text-align` 110 | utility classes, e.g. `tbds-margin-right-4@medium` 111 | and `tbds-text-align-right@large`. 112 | - Added `inline-size` (`width`) utility classes (e.g. `tbds-inline-size-25%`) 113 | for the following lengths: 114 | 115 | - `20%` 116 | - `25%` 117 | - `33.3333%` 118 | - `40%` 119 | - `50%` 120 | - `60%` 121 | - `66.6666%` 122 | - `75%` 123 | - `80%` 124 | - `100%` 125 | 126 | Breakpoint-based variants are also available 127 | (e.g. `tbds-inline-size-25%@medium`). 128 | 129 | - Added utility classes for margin and padding block & inline shorthands: 130 | 131 | - `tbds-margin-block-*` 132 | - `tbds-margin-inline-*` 133 | - `tbds-padding-block-*` 134 | - `tbds-padding-inline-*` 135 | 136 | ### Changed 137 | 138 | - `tbds-app-frame__body--vertical-middle` was renamed to 139 | `tbds-app-frame__body--center-items` 140 | - Layout properties and values now use logical dimensions instead of physical 141 | dimensions, for example `width` is now `inline-size` and `height` is now 142 | `block-size`. The following classes were updated to match the new syntax: 143 | 144 | - `tbds-text-align-left` is now `tbds-text-align-start` 145 | - `tbds-text-align-right` is now `tbds-text-align-end` 146 | - `tbds-margin-top-*` is now `tbds-margin-block-start-*` 147 | - `tbds-margin-right-*` is now `tbds-margin-inline-end-*` 148 | - `tbds-margin-bottom-*` is now `tbds-margin-block-end-*` 149 | - `tbds-margin-left-*` is now `tbds-margin-inline-start-*` 150 | - `tbds-padding-top-*` is now `tbds-padding-block-start-*` 151 | - `tbds-padding-right-*` is now `tbds-padding-inline-end-*` 152 | - `tbds-padding-bottom-*` is now `tbds-padding-block-end-*` 153 | - `tbds-padding-left-*` is now `tbds-padding-inline-start-*` 154 | - `tbds-button__icon--text-to-left` is now `tbds-button__icon--end` 155 | - `tbds-button__icon--text-to-right` is now `tbds-button__icon--start` 156 | - `tbds-media--vertical-center` is now `tbds-media--block-center` 157 | 158 | ### Fixed 159 | 160 | - Fixed button icon alignment. 161 | 162 | [0.3.0]: https://github.com/thoughtbot/design-system/compare/v0.2.0...v0.3.0 163 | 164 | ## [0.2.0] - 2019-05-10 165 | 166 | ### Added 167 | 168 | - Global variables for styling focus outlines. 169 | - `tbds-inline-stack` component. 170 | - The block stack component now has a modifier to add a border between each 171 | item: `tbds-block-stack--bordered`. 172 | - Added `tbds-icon` component for simple icons 173 | - Added `breakpoints` to settings module which provides a few basic media 174 | queries 175 | 176 | ### Changed 177 | 178 | - `$tbds-blue` is now `$tbds-brand-blue`, and its value changed from `#1568c1` 179 | to `#0b758c`. 180 | - `tbds-stack` is now `tbds-block-stack` 181 | 182 | ### Removed 183 | 184 | - `tbds-form__row` has been removed. Use the Stack component instead to achieve 185 | the same layout. 186 | 187 | [0.2.0]: https://github.com/thoughtbot/design-system/compare/v0.1.0...v0.2.0 188 | 189 | ## [0.1.0] - 2019-04-19 190 | 191 | ### Changed 192 | 193 | - Deprecated individual component packages (e.g. `@thoughtbot/tbds-button`) 194 | in favor of one primary package (`@thoughtbot/design-system`). 195 | 196 | [0.1.0]: https://github.com/thoughtbot/design-system/releases/tag/v0.1.0 197 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Lines starting with '#' are comments. 2 | 3 | # Each line is a file pattern followed by one or more owners. 4 | 5 | # More details are here: https://help.github.com/articles/about-codeowners/ 6 | 7 | # The '\*' pattern is global owners. 8 | 9 | # Order is important. The last matching pattern has the most precedence. 10 | 11 | # The folders are ordered as follows: 12 | 13 | # In each subsection folders are ordered first by depth, then alphabetically. 14 | 15 | # This should make it easy to add new rules without breaking existing ones. 16 | 17 | # Global rule: 18 | * @mo-amama 19 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of conduct 2 | 3 | By participating in this project, you agree to abide by the 4 | [thoughtbot code of conduct][1]. 5 | 6 | [1]: https://thoughtbot.com/open-source-code-of-conduct 7 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | ## Contributing code 4 | 5 | 1. Fork and clone the repository. 6 | 7 | 1. Install the dependencies: 8 | 9 | ``` 10 | bin/setup 11 | ``` 12 | 13 | 1. Create a new branch from `main` 14 | 15 | ``` 16 | git checkout -b my-branch-name 17 | ``` 18 | 19 | 1. Make your changes, following our [code-style] (see below). 20 | 21 | 1. Commit your changes, with a [good commit message][commit]. 22 | 23 | 1. Push your branch to GitHub and create a pull request. 24 | 25 | Others will give constructive feedback. This is a time for discussion and 26 | improvements, and making the necessary changes will be required before we can 27 | merge the contribution. 28 | 29 | [code-style]: #code-style 30 | [commit]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html 31 | 32 | ## Code style 33 | 34 | ### CSS/Sass 35 | 36 | We use [stylelint][stylelint] to lint our CSS and Sass. It's configuration can 37 | be found in `.stylelintrc.json`. You can run stylelint from the command line via 38 | `npm run stylelint`, or [integrate it with your editor][editor-integration]. 39 | 40 | [stylelint]: https://stylelint.io/ 41 | [editor-integration]: https://stylelint.io/user-guide/complementary-tools/#editor-plugins 42 | 43 | ## Documenting a component 44 | 45 | Document each component in a `README.md` in each component's directory. 46 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020 thoughtbot, inc. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # thoughtbot design system (tbds) 2 | 3 | A design system for thoughtbot websites. 4 | 5 | ## Purpose 6 | 7 | The purpose of the thoughtbot design system is to… 8 | 9 | - Learn about design systems so that we establish our skillset in the space 10 | and provide services to our clients. 11 | - Support our internal and external websites and set a minimum standard of 12 | design, accessibility, maintainability, and quality. 13 | 14 | ## Applications using tbds 15 | 16 | - [Hub][hub] 17 | - [thoughtbot.com][thoughtbot.com] 18 | - [thoughtbot search][thoughtbot-search] 19 | - [tbot][tbot] 20 | - [Vellum][vellum] 21 | - [design.thoughtbot.com][design.thoughtbot.com] 22 | 23 | [hub]: https://hub.thoughtbot.com/ 24 | [thoughtbot.com]: https://thoughtbot.com/ 25 | [thoughtbot-search]: https://search.thoughtbot.com/ 26 | [tbot]: https://tbot.io/ 27 | [vellum]: https://vellum.thoughtbot.com/ 28 | [design.thoughtbot.com]: https://design.thoughtbot.com/ 29 | 30 | ## Installation for Ruby on Rails 31 | 32 | tbds is available through npm and requires Rails 5.1+. Yarn is used to support 33 | Heroku deployment. 34 | 35 | 1. Make sure you have the [Yarn][yarn] package manager installed: 36 | https://yarnpkg.com/en/docs/install 37 | 38 | 1. Install the design system package and save it as a dependency: 39 | 40 | ``` 41 | yarn add @thoughtbot/design-system 42 | ``` 43 | 44 | 1. Import the system in your Sass manifest: 45 | 46 | ``` 47 | @import "@thoughtbot/design-system/src/index"; 48 | ``` 49 | 50 | [yarn]: https://yarnpkg.com/en/ 51 | 52 | Alternatively, you can assign an alias to the package for more terse usage: 53 | 54 | 1. Install the design system package with an alias 55 | 56 | ``` 57 | yarn add tbds@npm:@thoughtbot/design-system 58 | ``` 59 | 60 | 1. Import the system using the alias 61 | 62 | ``` 63 | @import "tbds/src/index"; 64 | ``` 65 | 66 | To import assets using the Rails asset pipeline: 67 | 68 | 1. Add `node_modules` to the asset path. 69 | 70 | ```ruby 71 | # assets.rb 72 | Rails.application.config.assets.paths << Rails.root.join('node_modules') 73 | ``` 74 | 75 | 1. Use the assets in `*.rb` and `*.erb`. 76 | 77 | ```erb 78 | image_tag "@thoughtbot/design-system/src/logo/horizontal.svg", title: "thoughtbot" 79 | ``` 80 | 81 | ### Deploy Ruby on Rails app with tbds to Heroku 82 | 83 | 1. Add `webpacker` to your `Gemfile` and install: 84 | 85 | ``` 86 | gem "webpacker", require: false 87 | ``` 88 | 89 | ``` 90 | bundle install 91 | ``` 92 | 93 | 1. Add the [Node.js Buildpack][nodejs-buildpack] to your Heroku app. 94 | 95 | Note: You'll need to order the buildpacks to have Node.js first, followed 96 | by Ruby. 97 | 98 | [nodejs-buildpack]: https://elements.heroku.com/buildpacks/heroku/heroku-buildpack-nodejs 99 | 100 | ## Compiled CSS 101 | 102 | Each version of tbds (starting with v0.7.0) is available as a minified CSS file 103 | through the [unpkg CDN][unpkg]. While this method is not recommended for 104 | production usage, it can be useful for adding tbds as an external stylesheet to 105 | CodePen’s or static sites to quickly prototype ideas. 106 | 107 | ``` 108 | https://unpkg.com/@thoughtbot/design-system@0.7.1/dist/tbds.css 109 | ``` 110 | 111 | [unpkg]: https://unpkg.com/ 112 | 113 | ## Browser support 114 | 115 | tbds supports: 116 | 117 | - Latest versions of Chrome, Firefox, and Safari 118 | - Edge 15+ 119 | 120 | ## Contributing 121 | 122 | To learn about contributing to the project, please have a look at the [contributing] guide. 123 | 124 | [contributing]: /CONTRIBUTING.md 125 | 126 | ## License 127 | 128 | thoughtbot/design-system is Copyright (c) 2020 thoughtbot, inc. 129 | It is free software, and may be redistributed 130 | under the terms specified in the [LICENSE] file. 131 | 132 | [LICENSE]: /LICENSE.md 133 | 134 | 135 | ## About thoughtbot 136 | 137 | ![thoughtbot](https://thoughtbot.com/thoughtbot-logo-for-readmes.svg) 138 | 139 | This repo is maintained and funded by thoughtbot, inc. 140 | The names and logos for thoughtbot are trademarks of thoughtbot, inc. 141 | 142 | We love open source software! 143 | See [our other projects][community]. 144 | We are [available for hire][hire]. 145 | 146 | [community]: https://thoughtbot.com/community?utm_source=github 147 | [hire]: https://thoughtbot.com/hire-us?utm_source=github 148 | 149 | 150 | 151 | -------------------------------------------------------------------------------- /RELEASING.md: -------------------------------------------------------------------------------- 1 | # Releasing 2 | 3 | This documents how to release a new version of tbds. It’s for 4 | thoughtbot employees. 5 | 6 | 1. Make sure you’re on the `main` branch with a clean working directory. 7 | 8 | 1. Update the [changelog][changelog], following the guidelines from 9 | [keep a changelog][keep-a-changelog] 10 | 11 | 1. Run `npm version [major | minor | patch] --force` 12 | 13 | This script will… 14 | 15 | - Add the changes to `CHANGELOG.md` to the Git index 16 | - Bump the version in `package.json` and `package-lock.json` 17 | - Create a version Git commit and tag 18 | 19 | 1. Run `npm publish` 20 | 21 | This script will push to GitHub and publish the new version to 22 | the npm registry 23 | 24 | 1. Draft a [new GitHub release][github-release], copying the release’s 25 | changelog entry into the release notes 26 | 27 | [changelog]: /CHANGELOG.md 28 | [keep-a-changelog]: http://keepachangelog.com 29 | [github-release]: https://github.com/thoughtbot/design-system/releases/new 30 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | # Security Policy 3 | 4 | ## Supported Versions 5 | 6 | Only the the latest version of this project is supported at a given time. If 7 | you find a security issue with an older version, please try updating to the 8 | latest version first. 9 | 10 | If for some reason you can't update to the latest version, please let us know 11 | your reasons so that we can have a better understanding of your situation. 12 | 13 | ## Reporting a Vulnerability 14 | 15 | For security inquiries or vulnerability reports, visit 16 | . 17 | 18 | If you have any suggestions to improve this policy, visit . 19 | 20 | 21 | -------------------------------------------------------------------------------- /bin/setup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # Exit if any subcommand fails 4 | set -e 5 | 6 | if [ -z "$CI" ]; then 7 | if command -v asdf > /dev/null; then 8 | asdf plugin add nodejs || true 9 | asdf plugin update --all || true 10 | asdf install 11 | fi 12 | 13 | npm install 14 | fi 15 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@thoughtbot/design-system", 3 | "version": "0.7.3", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@thoughtbot/design-system", 9 | "version": "0.7.3", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@sass-collective/strip-unit": "^3.1.2" 13 | }, 14 | "devDependencies": { 15 | "@thoughtbot/stylelint-config": "^4.0.0", 16 | 17 | "stylelint-use-logical-spec": "^5.0.1" 18 | } 19 | }, 20 | "node_modules/@babel/code-frame": { 21 | "version": "7.23.5", 22 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", 23 | "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", 24 | "dev": true, 25 | "dependencies": { 26 | "@babel/highlight": "^7.23.4", 27 | "chalk": "^2.4.2" 28 | }, 29 | "engines": { 30 | "node": ">=6.9.0" 31 | } 32 | }, 33 | "node_modules/@babel/helper-validator-identifier": { 34 | "version": "7.22.20", 35 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", 36 | "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", 37 | "dev": true, 38 | "engines": { 39 | "node": ">=6.9.0" 40 | } 41 | }, 42 | "node_modules/@babel/highlight": { 43 | "version": "7.23.4", 44 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", 45 | "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", 46 | "dev": true, 47 | "dependencies": { 48 | "@babel/helper-validator-identifier": "^7.22.20", 49 | "chalk": "^2.4.2", 50 | "js-tokens": "^4.0.0" 51 | }, 52 | "engines": { 53 | "node": ">=6.9.0" 54 | } 55 | }, 56 | "node_modules/@csstools/css-parser-algorithms": { 57 | "version": "3.0.1", 58 | "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", 59 | "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", 60 | "dev": true, 61 | "funding": [ 62 | { 63 | "type": "github", 64 | "url": "https://github.com/sponsors/csstools" 65 | }, 66 | { 67 | "type": "opencollective", 68 | "url": "https://opencollective.com/csstools" 69 | } 70 | ], 71 | "engines": { 72 | "node": ">=18" 73 | }, 74 | "peerDependencies": { 75 | "@csstools/css-tokenizer": "^3.0.1" 76 | } 77 | }, 78 | "node_modules/@csstools/css-tokenizer": { 79 | "version": "3.0.1", 80 | "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", 81 | "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", 82 | "dev": true, 83 | "funding": [ 84 | { 85 | "type": "github", 86 | "url": "https://github.com/sponsors/csstools" 87 | }, 88 | { 89 | "type": "opencollective", 90 | "url": "https://opencollective.com/csstools" 91 | } 92 | ], 93 | "engines": { 94 | "node": ">=18" 95 | } 96 | }, 97 | "node_modules/@csstools/media-query-list-parser": { 98 | "version": "3.0.1", 99 | "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", 100 | "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", 101 | "dev": true, 102 | "funding": [ 103 | { 104 | "type": "github", 105 | "url": "https://github.com/sponsors/csstools" 106 | }, 107 | { 108 | "type": "opencollective", 109 | "url": "https://opencollective.com/csstools" 110 | } 111 | ], 112 | "engines": { 113 | "node": ">=18" 114 | }, 115 | "peerDependencies": { 116 | "@csstools/css-parser-algorithms": "^3.0.1", 117 | "@csstools/css-tokenizer": "^3.0.1" 118 | } 119 | }, 120 | "node_modules/@csstools/selector-specificity": { 121 | "version": "4.0.0", 122 | "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", 123 | "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", 124 | "dev": true, 125 | "funding": [ 126 | { 127 | "type": "github", 128 | "url": "https://github.com/sponsors/csstools" 129 | }, 130 | { 131 | "type": "opencollective", 132 | "url": "https://opencollective.com/csstools" 133 | } 134 | ], 135 | "engines": { 136 | "node": ">=18" 137 | }, 138 | "peerDependencies": { 139 | "postcss-selector-parser": "^6.1.0" 140 | } 141 | }, 142 | "node_modules/@dual-bundle/import-meta-resolve": { 143 | "version": "4.1.0", 144 | "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", 145 | "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", 146 | "dev": true, 147 | "funding": { 148 | "type": "github", 149 | "url": "https://github.com/sponsors/wooorm" 150 | } 151 | }, 152 | "node_modules/@nodelib/fs.scandir": { 153 | "version": "2.1.5", 154 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 155 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 156 | "dev": true, 157 | "dependencies": { 158 | "@nodelib/fs.stat": "2.0.5", 159 | "run-parallel": "^1.1.9" 160 | }, 161 | "engines": { 162 | "node": ">= 8" 163 | } 164 | }, 165 | "node_modules/@nodelib/fs.stat": { 166 | "version": "2.0.5", 167 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 168 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 169 | "dev": true, 170 | "engines": { 171 | "node": ">= 8" 172 | } 173 | }, 174 | "node_modules/@nodelib/fs.walk": { 175 | "version": "1.2.8", 176 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 177 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 178 | "dev": true, 179 | "dependencies": { 180 | "@nodelib/fs.scandir": "2.1.5", 181 | "fastq": "^1.6.0" 182 | }, 183 | "engines": { 184 | "node": ">= 8" 185 | } 186 | }, 187 | "node_modules/@parcel/watcher": { 188 | "version": "2.4.1", 189 | "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", 190 | "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", 191 | "dependencies": { 192 | "detect-libc": "^1.0.3", 193 | "is-glob": "^4.0.3", 194 | "micromatch": "^4.0.5", 195 | "node-addon-api": "^7.0.0" 196 | }, 197 | "engines": { 198 | "node": ">= 10.0.0" 199 | }, 200 | "funding": { 201 | "type": "opencollective", 202 | "url": "https://opencollective.com/parcel" 203 | }, 204 | "optionalDependencies": { 205 | "@parcel/watcher-android-arm64": "2.4.1", 206 | "@parcel/watcher-darwin-arm64": "2.4.1", 207 | "@parcel/watcher-darwin-x64": "2.4.1", 208 | "@parcel/watcher-freebsd-x64": "2.4.1", 209 | "@parcel/watcher-linux-arm-glibc": "2.4.1", 210 | "@parcel/watcher-linux-arm64-glibc": "2.4.1", 211 | "@parcel/watcher-linux-arm64-musl": "2.4.1", 212 | "@parcel/watcher-linux-x64-glibc": "2.4.1", 213 | "@parcel/watcher-linux-x64-musl": "2.4.1", 214 | "@parcel/watcher-win32-arm64": "2.4.1", 215 | "@parcel/watcher-win32-ia32": "2.4.1", 216 | "@parcel/watcher-win32-x64": "2.4.1" 217 | } 218 | }, 219 | "node_modules/@parcel/watcher-android-arm64": { 220 | "version": "2.4.1", 221 | "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", 222 | "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", 223 | "cpu": [ 224 | "arm64" 225 | ], 226 | "optional": true, 227 | "os": [ 228 | "android" 229 | ], 230 | "engines": { 231 | "node": ">= 10.0.0" 232 | }, 233 | "funding": { 234 | "type": "opencollective", 235 | "url": "https://opencollective.com/parcel" 236 | } 237 | }, 238 | "node_modules/@parcel/watcher-darwin-arm64": { 239 | "version": "2.4.1", 240 | "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", 241 | "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", 242 | "cpu": [ 243 | "arm64" 244 | ], 245 | "optional": true, 246 | "os": [ 247 | "darwin" 248 | ], 249 | "engines": { 250 | "node": ">= 10.0.0" 251 | }, 252 | "funding": { 253 | "type": "opencollective", 254 | "url": "https://opencollective.com/parcel" 255 | } 256 | }, 257 | "node_modules/@parcel/watcher-darwin-x64": { 258 | "version": "2.4.1", 259 | "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", 260 | "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", 261 | "cpu": [ 262 | "x64" 263 | ], 264 | "optional": true, 265 | "os": [ 266 | "darwin" 267 | ], 268 | "engines": { 269 | "node": ">= 10.0.0" 270 | }, 271 | "funding": { 272 | "type": "opencollective", 273 | "url": "https://opencollective.com/parcel" 274 | } 275 | }, 276 | "node_modules/@parcel/watcher-freebsd-x64": { 277 | "version": "2.4.1", 278 | "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", 279 | "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", 280 | "cpu": [ 281 | "x64" 282 | ], 283 | "optional": true, 284 | "os": [ 285 | "freebsd" 286 | ], 287 | "engines": { 288 | "node": ">= 10.0.0" 289 | }, 290 | "funding": { 291 | "type": "opencollective", 292 | "url": "https://opencollective.com/parcel" 293 | } 294 | }, 295 | "node_modules/@parcel/watcher-linux-arm-glibc": { 296 | "version": "2.4.1", 297 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", 298 | "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", 299 | "cpu": [ 300 | "arm" 301 | ], 302 | "optional": true, 303 | "os": [ 304 | "linux" 305 | ], 306 | "engines": { 307 | "node": ">= 10.0.0" 308 | }, 309 | "funding": { 310 | "type": "opencollective", 311 | "url": "https://opencollective.com/parcel" 312 | } 313 | }, 314 | "node_modules/@parcel/watcher-linux-arm64-glibc": { 315 | "version": "2.4.1", 316 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", 317 | "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", 318 | "cpu": [ 319 | "arm64" 320 | ], 321 | "optional": true, 322 | "os": [ 323 | "linux" 324 | ], 325 | "engines": { 326 | "node": ">= 10.0.0" 327 | }, 328 | "funding": { 329 | "type": "opencollective", 330 | "url": "https://opencollective.com/parcel" 331 | } 332 | }, 333 | "node_modules/@parcel/watcher-linux-arm64-musl": { 334 | "version": "2.4.1", 335 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", 336 | "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", 337 | "cpu": [ 338 | "arm64" 339 | ], 340 | "optional": true, 341 | "os": [ 342 | "linux" 343 | ], 344 | "engines": { 345 | "node": ">= 10.0.0" 346 | }, 347 | "funding": { 348 | "type": "opencollective", 349 | "url": "https://opencollective.com/parcel" 350 | } 351 | }, 352 | "node_modules/@parcel/watcher-linux-x64-glibc": { 353 | "version": "2.4.1", 354 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", 355 | "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", 356 | "cpu": [ 357 | "x64" 358 | ], 359 | "optional": true, 360 | "os": [ 361 | "linux" 362 | ], 363 | "engines": { 364 | "node": ">= 10.0.0" 365 | }, 366 | "funding": { 367 | "type": "opencollective", 368 | "url": "https://opencollective.com/parcel" 369 | } 370 | }, 371 | "node_modules/@parcel/watcher-linux-x64-musl": { 372 | "version": "2.4.1", 373 | "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", 374 | "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", 375 | "cpu": [ 376 | "x64" 377 | ], 378 | "optional": true, 379 | "os": [ 380 | "linux" 381 | ], 382 | "engines": { 383 | "node": ">= 10.0.0" 384 | }, 385 | "funding": { 386 | "type": "opencollective", 387 | "url": "https://opencollective.com/parcel" 388 | } 389 | }, 390 | "node_modules/@parcel/watcher-win32-arm64": { 391 | "version": "2.4.1", 392 | "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", 393 | "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", 394 | "cpu": [ 395 | "arm64" 396 | ], 397 | "optional": true, 398 | "os": [ 399 | "win32" 400 | ], 401 | "engines": { 402 | "node": ">= 10.0.0" 403 | }, 404 | "funding": { 405 | "type": "opencollective", 406 | "url": "https://opencollective.com/parcel" 407 | } 408 | }, 409 | "node_modules/@parcel/watcher-win32-ia32": { 410 | "version": "2.4.1", 411 | "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", 412 | "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", 413 | "cpu": [ 414 | "ia32" 415 | ], 416 | "optional": true, 417 | "os": [ 418 | "win32" 419 | ], 420 | "engines": { 421 | "node": ">= 10.0.0" 422 | }, 423 | "funding": { 424 | "type": "opencollective", 425 | "url": "https://opencollective.com/parcel" 426 | } 427 | }, 428 | "node_modules/@parcel/watcher-win32-x64": { 429 | "version": "2.4.1", 430 | "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", 431 | "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", 432 | "cpu": [ 433 | "x64" 434 | ], 435 | "optional": true, 436 | "os": [ 437 | "win32" 438 | ], 439 | "engines": { 440 | "node": ">= 10.0.0" 441 | }, 442 | "funding": { 443 | "type": "opencollective", 444 | "url": "https://opencollective.com/parcel" 445 | } 446 | }, 447 | "node_modules/@sass-collective/strip-unit": { 448 | "version": "3.1.2", 449 | "resolved": "https://registry.npmjs.org/@sass-collective/strip-unit/-/strip-unit-3.1.2.tgz", 450 | "integrity": "sha512-Y1XfUzcJO0NXhmCN5rr/wPS82GovI1t0qio+JRXHRwkYh3meugGPa216+x8C6JWn5xE7X2IRTs3hIu4blYCn6A==", 451 | "dependencies": { 452 | "sass": "^1.45.2" 453 | }, 454 | "engines": { 455 | "node": ">=12.0.0", 456 | "npm": ">=7.0.0" 457 | } 458 | }, 459 | "node_modules/@thoughtbot/stylelint-config": { 460 | "version": "4.0.0", 461 | "resolved": "https://registry.npmjs.org/@thoughtbot/stylelint-config/-/stylelint-config-4.0.0.tgz", 462 | "integrity": "sha512-qNGA8XTE5k+ojLI+IDsSMh8q7XwXzpfUUs6cWr52XLOLJAK8A6ZwUVg0/SD89YPXy3EDg9uhBF61eYk39ba0Pg==", 463 | "dev": true, 464 | "dependencies": { 465 | "stylelint-config-recommended": "^14.0.0", 466 | "stylelint-config-standard-scss": "^13.0.0", 467 | "stylelint-declaration-block-no-ignored-properties": "^2.8.0", 468 | "stylelint-order": "^6.0.4" 469 | }, 470 | "peerDependencies": { 471 | "stylelint": "^16.2.0" 472 | } 473 | }, 474 | "node_modules/ajv": { 475 | "version": "8.13.0", 476 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", 477 | "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", 478 | "dev": true, 479 | "dependencies": { 480 | "fast-deep-equal": "^3.1.3", 481 | "json-schema-traverse": "^1.0.0", 482 | "require-from-string": "^2.0.2", 483 | "uri-js": "^4.4.1" 484 | }, 485 | "funding": { 486 | "type": "github", 487 | "url": "https://github.com/sponsors/epoberezkin" 488 | } 489 | }, 490 | "node_modules/ansi-regex": { 491 | "version": "5.0.1", 492 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 493 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 494 | "dev": true, 495 | "engines": { 496 | "node": ">=8" 497 | } 498 | }, 499 | "node_modules/ansi-styles": { 500 | "version": "3.2.1", 501 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 502 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 503 | "dev": true, 504 | "dependencies": { 505 | "color-convert": "^1.9.0" 506 | }, 507 | "engines": { 508 | "node": ">=4" 509 | } 510 | }, 511 | "node_modules/argparse": { 512 | "version": "2.0.1", 513 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 514 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 515 | "dev": true 516 | }, 517 | "node_modules/array-union": { 518 | "version": "2.1.0", 519 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 520 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 521 | "dev": true, 522 | "engines": { 523 | "node": ">=8" 524 | } 525 | }, 526 | "node_modules/astral-regex": { 527 | "version": "2.0.0", 528 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 529 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 530 | "dev": true, 531 | "engines": { 532 | "node": ">=8" 533 | } 534 | }, 535 | "node_modules/balanced-match": { 536 | "version": "2.0.0", 537 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", 538 | "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", 539 | "dev": true 540 | }, 541 | "node_modules/braces": { 542 | "version": "3.0.3", 543 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 544 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 545 | "dependencies": { 546 | "fill-range": "^7.1.1" 547 | }, 548 | "engines": { 549 | "node": ">=8" 550 | } 551 | }, 552 | "node_modules/callsites": { 553 | "version": "3.1.0", 554 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 555 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 556 | "dev": true, 557 | "engines": { 558 | "node": ">=6" 559 | } 560 | }, 561 | "node_modules/chalk": { 562 | "version": "2.4.2", 563 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 564 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 565 | "dev": true, 566 | "dependencies": { 567 | "ansi-styles": "^3.2.1", 568 | "escape-string-regexp": "^1.0.5", 569 | "supports-color": "^5.3.0" 570 | }, 571 | "engines": { 572 | "node": ">=4" 573 | } 574 | }, 575 | "node_modules/chokidar": { 576 | "version": "4.0.1", 577 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", 578 | "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", 579 | "dependencies": { 580 | "readdirp": "^4.0.1" 581 | }, 582 | "engines": { 583 | "node": ">= 14.16.0" 584 | }, 585 | "funding": { 586 | "url": "https://paulmillr.com/funding/" 587 | } 588 | }, 589 | "node_modules/color-convert": { 590 | "version": "1.9.3", 591 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 592 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 593 | "dev": true, 594 | "dependencies": { 595 | "color-name": "1.1.3" 596 | } 597 | }, 598 | "node_modules/color-name": { 599 | "version": "1.1.3", 600 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 601 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 602 | "dev": true 603 | }, 604 | "node_modules/colord": { 605 | "version": "2.9.3", 606 | "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", 607 | "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", 608 | "dev": true 609 | }, 610 | "node_modules/cosmiconfig": { 611 | "version": "9.0.0", 612 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", 613 | "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", 614 | "dev": true, 615 | "dependencies": { 616 | "env-paths": "^2.2.1", 617 | "import-fresh": "^3.3.0", 618 | "js-yaml": "^4.1.0", 619 | "parse-json": "^5.2.0" 620 | }, 621 | "engines": { 622 | "node": ">=14" 623 | }, 624 | "funding": { 625 | "url": "https://github.com/sponsors/d-fischer" 626 | }, 627 | "peerDependencies": { 628 | "typescript": ">=4.9.5" 629 | }, 630 | "peerDependenciesMeta": { 631 | "typescript": { 632 | "optional": true 633 | } 634 | } 635 | }, 636 | "node_modules/css-functions-list": { 637 | "version": "3.2.3", 638 | "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", 639 | "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", 640 | "dev": true, 641 | "engines": { 642 | "node": ">=12 || >=16" 643 | } 644 | }, 645 | "node_modules/css-tree": { 646 | "version": "3.0.0", 647 | "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.0.0.tgz", 648 | "integrity": "sha512-o88DVQ6GzsABn1+6+zo2ct801dBO5OASVyxbbvA2W20ue2puSh/VOuqUj90eUeMSX/xqGqBmOKiRQN7tJOuBXw==", 649 | "dev": true, 650 | "dependencies": { 651 | "mdn-data": "2.10.0", 652 | "source-map-js": "^1.0.1" 653 | }, 654 | "engines": { 655 | "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" 656 | } 657 | }, 658 | "node_modules/cssesc": { 659 | "version": "3.0.0", 660 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 661 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 662 | "dev": true, 663 | "bin": { 664 | "cssesc": "bin/cssesc" 665 | }, 666 | "engines": { 667 | "node": ">=4" 668 | } 669 | }, 670 | "node_modules/debug": { 671 | "version": "4.3.7", 672 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 673 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 674 | "dev": true, 675 | "dependencies": { 676 | "ms": "^2.1.3" 677 | }, 678 | "engines": { 679 | "node": ">=6.0" 680 | }, 681 | "peerDependenciesMeta": { 682 | "supports-color": { 683 | "optional": true 684 | } 685 | } 686 | }, 687 | "node_modules/detect-libc": { 688 | "version": "1.0.3", 689 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 690 | "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", 691 | "bin": { 692 | "detect-libc": "bin/detect-libc.js" 693 | }, 694 | "engines": { 695 | "node": ">=0.10" 696 | } 697 | }, 698 | "node_modules/dir-glob": { 699 | "version": "3.0.1", 700 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 701 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 702 | "dev": true, 703 | "dependencies": { 704 | "path-type": "^4.0.0" 705 | }, 706 | "engines": { 707 | "node": ">=8" 708 | } 709 | }, 710 | "node_modules/emoji-regex": { 711 | "version": "8.0.0", 712 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 713 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 714 | "dev": true 715 | }, 716 | "node_modules/env-paths": { 717 | "version": "2.2.1", 718 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 719 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 720 | "dev": true, 721 | "engines": { 722 | "node": ">=6" 723 | } 724 | }, 725 | "node_modules/error-ex": { 726 | "version": "1.3.2", 727 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 728 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 729 | "dev": true, 730 | "dependencies": { 731 | "is-arrayish": "^0.2.1" 732 | } 733 | }, 734 | "node_modules/escape-string-regexp": { 735 | "version": "1.0.5", 736 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 737 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 738 | "dev": true, 739 | "engines": { 740 | "node": ">=0.8.0" 741 | } 742 | }, 743 | "node_modules/fast-deep-equal": { 744 | "version": "3.1.3", 745 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 746 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 747 | "dev": true 748 | }, 749 | "node_modules/fast-glob": { 750 | "version": "3.3.2", 751 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 752 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 753 | "dev": true, 754 | "dependencies": { 755 | "@nodelib/fs.stat": "^2.0.2", 756 | "@nodelib/fs.walk": "^1.2.3", 757 | "glob-parent": "^5.1.2", 758 | "merge2": "^1.3.0", 759 | "micromatch": "^4.0.4" 760 | }, 761 | "engines": { 762 | "node": ">=8.6.0" 763 | } 764 | }, 765 | "node_modules/fastest-levenshtein": { 766 | "version": "1.0.16", 767 | "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", 768 | "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", 769 | "dev": true, 770 | "engines": { 771 | "node": ">= 4.9.1" 772 | } 773 | }, 774 | "node_modules/fastq": { 775 | "version": "1.15.0", 776 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 777 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 778 | "dev": true, 779 | "dependencies": { 780 | "reusify": "^1.0.4" 781 | } 782 | }, 783 | "node_modules/file-entry-cache": { 784 | "version": "9.1.0", 785 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", 786 | "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", 787 | "dev": true, 788 | "dependencies": { 789 | "flat-cache": "^5.0.0" 790 | }, 791 | "engines": { 792 | "node": ">=18" 793 | } 794 | }, 795 | "node_modules/fill-range": { 796 | "version": "7.1.1", 797 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 798 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 799 | "dependencies": { 800 | "to-regex-range": "^5.0.1" 801 | }, 802 | "engines": { 803 | "node": ">=8" 804 | } 805 | }, 806 | "node_modules/flat-cache": { 807 | "version": "5.0.0", 808 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", 809 | "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", 810 | "dev": true, 811 | "dependencies": { 812 | "flatted": "^3.3.1", 813 | "keyv": "^4.5.4" 814 | }, 815 | "engines": { 816 | "node": ">=18" 817 | } 818 | }, 819 | "node_modules/flatted": { 820 | "version": "3.3.1", 821 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", 822 | "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", 823 | "dev": true 824 | }, 825 | "node_modules/glob-parent": { 826 | "version": "5.1.2", 827 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 828 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 829 | "dev": true, 830 | "dependencies": { 831 | "is-glob": "^4.0.1" 832 | }, 833 | "engines": { 834 | "node": ">= 6" 835 | } 836 | }, 837 | "node_modules/global-modules": { 838 | "version": "2.0.0", 839 | "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", 840 | "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", 841 | "dev": true, 842 | "dependencies": { 843 | "global-prefix": "^3.0.0" 844 | }, 845 | "engines": { 846 | "node": ">=6" 847 | } 848 | }, 849 | "node_modules/global-prefix": { 850 | "version": "3.0.0", 851 | "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", 852 | "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", 853 | "dev": true, 854 | "dependencies": { 855 | "ini": "^1.3.5", 856 | "kind-of": "^6.0.2", 857 | "which": "^1.3.1" 858 | }, 859 | "engines": { 860 | "node": ">=6" 861 | } 862 | }, 863 | "node_modules/globby": { 864 | "version": "11.1.0", 865 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 866 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 867 | "dev": true, 868 | "dependencies": { 869 | "array-union": "^2.1.0", 870 | "dir-glob": "^3.0.1", 871 | "fast-glob": "^3.2.9", 872 | "ignore": "^5.2.0", 873 | "merge2": "^1.4.1", 874 | "slash": "^3.0.0" 875 | }, 876 | "engines": { 877 | "node": ">=10" 878 | }, 879 | "funding": { 880 | "url": "https://github.com/sponsors/sindresorhus" 881 | } 882 | }, 883 | "node_modules/globjoin": { 884 | "version": "0.1.4", 885 | "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", 886 | "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", 887 | "dev": true 888 | }, 889 | "node_modules/has-flag": { 890 | "version": "3.0.0", 891 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 892 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 893 | "dev": true, 894 | "engines": { 895 | "node": ">=4" 896 | } 897 | }, 898 | "node_modules/html-tags": { 899 | "version": "3.3.1", 900 | "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", 901 | "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", 902 | "dev": true, 903 | "engines": { 904 | "node": ">=8" 905 | }, 906 | "funding": { 907 | "url": "https://github.com/sponsors/sindresorhus" 908 | } 909 | }, 910 | "node_modules/ignore": { 911 | "version": "5.3.2", 912 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 913 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 914 | "dev": true, 915 | "engines": { 916 | "node": ">= 4" 917 | } 918 | }, 919 | "node_modules/immutable": { 920 | "version": "4.3.3", 921 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.3.tgz", 922 | "integrity": "sha512-808ZFYMsIRAjLAu5xkKo0TsbY9LBy9H5MazTKIEHerNkg0ymgilGfBPMR/3G7d/ihGmuK2Hw8S1izY2d3kd3wA==" 923 | }, 924 | "node_modules/import-fresh": { 925 | "version": "3.3.0", 926 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 927 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 928 | "dev": true, 929 | "dependencies": { 930 | "parent-module": "^1.0.0", 931 | "resolve-from": "^4.0.0" 932 | }, 933 | "engines": { 934 | "node": ">=6" 935 | }, 936 | "funding": { 937 | "url": "https://github.com/sponsors/sindresorhus" 938 | } 939 | }, 940 | "node_modules/import-fresh/node_modules/resolve-from": { 941 | "version": "4.0.0", 942 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 943 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 944 | "dev": true, 945 | "engines": { 946 | "node": ">=4" 947 | } 948 | }, 949 | "node_modules/imurmurhash": { 950 | "version": "0.1.4", 951 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 952 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 953 | "dev": true, 954 | "engines": { 955 | "node": ">=0.8.19" 956 | } 957 | }, 958 | "node_modules/ini": { 959 | "version": "1.3.8", 960 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 961 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", 962 | "dev": true 963 | }, 964 | "node_modules/is-arrayish": { 965 | "version": "0.2.1", 966 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 967 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 968 | "dev": true 969 | }, 970 | "node_modules/is-extglob": { 971 | "version": "2.1.1", 972 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 973 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 974 | "engines": { 975 | "node": ">=0.10.0" 976 | } 977 | }, 978 | "node_modules/is-fullwidth-code-point": { 979 | "version": "3.0.0", 980 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 981 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 982 | "dev": true, 983 | "engines": { 984 | "node": ">=8" 985 | } 986 | }, 987 | "node_modules/is-glob": { 988 | "version": "4.0.3", 989 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 990 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 991 | "dependencies": { 992 | "is-extglob": "^2.1.1" 993 | }, 994 | "engines": { 995 | "node": ">=0.10.0" 996 | } 997 | }, 998 | "node_modules/is-number": { 999 | "version": "7.0.0", 1000 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1001 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1002 | "engines": { 1003 | "node": ">=0.12.0" 1004 | } 1005 | }, 1006 | "node_modules/is-plain-object": { 1007 | "version": "5.0.0", 1008 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", 1009 | "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", 1010 | "dev": true, 1011 | "engines": { 1012 | "node": ">=0.10.0" 1013 | } 1014 | }, 1015 | "node_modules/isexe": { 1016 | "version": "2.0.0", 1017 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1018 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1019 | "dev": true 1020 | }, 1021 | "node_modules/js-tokens": { 1022 | "version": "4.0.0", 1023 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1024 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1025 | "dev": true 1026 | }, 1027 | "node_modules/js-yaml": { 1028 | "version": "4.1.0", 1029 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1030 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1031 | "dev": true, 1032 | "dependencies": { 1033 | "argparse": "^2.0.1" 1034 | }, 1035 | "bin": { 1036 | "js-yaml": "bin/js-yaml.js" 1037 | } 1038 | }, 1039 | "node_modules/json-buffer": { 1040 | "version": "3.0.1", 1041 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1042 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1043 | "dev": true 1044 | }, 1045 | "node_modules/json-parse-even-better-errors": { 1046 | "version": "2.3.1", 1047 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 1048 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 1049 | "dev": true 1050 | }, 1051 | "node_modules/json-schema-traverse": { 1052 | "version": "1.0.0", 1053 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 1054 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 1055 | "dev": true 1056 | }, 1057 | "node_modules/keyv": { 1058 | "version": "4.5.4", 1059 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 1060 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 1061 | "dev": true, 1062 | "dependencies": { 1063 | "json-buffer": "3.0.1" 1064 | } 1065 | }, 1066 | "node_modules/kind-of": { 1067 | "version": "6.0.3", 1068 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 1069 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", 1070 | "dev": true, 1071 | "engines": { 1072 | "node": ">=0.10.0" 1073 | } 1074 | }, 1075 | "node_modules/known-css-properties": { 1076 | "version": "0.29.0", 1077 | "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", 1078 | "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", 1079 | "dev": true 1080 | }, 1081 | "node_modules/lines-and-columns": { 1082 | "version": "1.2.4", 1083 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1084 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 1085 | "dev": true 1086 | }, 1087 | "node_modules/lodash.truncate": { 1088 | "version": "4.4.2", 1089 | "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", 1090 | "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", 1091 | "dev": true 1092 | }, 1093 | "node_modules/mathml-tag-names": { 1094 | "version": "2.1.3", 1095 | "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", 1096 | "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", 1097 | "dev": true, 1098 | "funding": { 1099 | "type": "github", 1100 | "url": "https://github.com/sponsors/wooorm" 1101 | } 1102 | }, 1103 | "node_modules/mdn-data": { 1104 | "version": "2.10.0", 1105 | "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.10.0.tgz", 1106 | "integrity": "sha512-qq7C3EtK3yJXMwz1zAab65pjl+UhohqMOctTgcqjLOWABqmwj+me02LSsCuEUxnst9X1lCBpoE0WArGKgdGDzw==", 1107 | "dev": true 1108 | }, 1109 | "node_modules/meow": { 1110 | "version": "13.2.0", 1111 | "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", 1112 | "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", 1113 | "dev": true, 1114 | "engines": { 1115 | "node": ">=18" 1116 | }, 1117 | "funding": { 1118 | "url": "https://github.com/sponsors/sindresorhus" 1119 | } 1120 | }, 1121 | "node_modules/merge2": { 1122 | "version": "1.4.1", 1123 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1124 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1125 | "dev": true, 1126 | "engines": { 1127 | "node": ">= 8" 1128 | } 1129 | }, 1130 | "node_modules/micromatch": { 1131 | "version": "4.0.8", 1132 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 1133 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1134 | "dependencies": { 1135 | "braces": "^3.0.3", 1136 | "picomatch": "^2.3.1" 1137 | }, 1138 | "engines": { 1139 | "node": ">=8.6" 1140 | } 1141 | }, 1142 | "node_modules/ms": { 1143 | "version": "2.1.3", 1144 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1145 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1146 | "dev": true 1147 | }, 1148 | "node_modules/nanoid": { 1149 | "version": "3.3.7", 1150 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 1151 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 1152 | "dev": true, 1153 | "funding": [ 1154 | { 1155 | "type": "github", 1156 | "url": "https://github.com/sponsors/ai" 1157 | } 1158 | ], 1159 | "bin": { 1160 | "nanoid": "bin/nanoid.cjs" 1161 | }, 1162 | "engines": { 1163 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1164 | } 1165 | }, 1166 | "node_modules/node-addon-api": { 1167 | "version": "7.1.1", 1168 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", 1169 | "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" 1170 | }, 1171 | "node_modules/normalize-path": { 1172 | "version": "3.0.0", 1173 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1174 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1175 | "dev": true, 1176 | "engines": { 1177 | "node": ">=0.10.0" 1178 | } 1179 | }, 1180 | "node_modules/parent-module": { 1181 | "version": "1.0.1", 1182 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1183 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1184 | "dev": true, 1185 | "dependencies": { 1186 | "callsites": "^3.0.0" 1187 | }, 1188 | "engines": { 1189 | "node": ">=6" 1190 | } 1191 | }, 1192 | "node_modules/parse-json": { 1193 | "version": "5.2.0", 1194 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 1195 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 1196 | "dev": true, 1197 | "dependencies": { 1198 | "@babel/code-frame": "^7.0.0", 1199 | "error-ex": "^1.3.1", 1200 | "json-parse-even-better-errors": "^2.3.0", 1201 | "lines-and-columns": "^1.1.6" 1202 | }, 1203 | "engines": { 1204 | "node": ">=8" 1205 | }, 1206 | "funding": { 1207 | "url": "https://github.com/sponsors/sindresorhus" 1208 | } 1209 | }, 1210 | "node_modules/path-type": { 1211 | "version": "4.0.0", 1212 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1213 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1214 | "dev": true, 1215 | "engines": { 1216 | "node": ">=8" 1217 | } 1218 | }, 1219 | "node_modules/picocolors": { 1220 | "version": "1.1.0", 1221 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", 1222 | "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", 1223 | "dev": true 1224 | }, 1225 | "node_modules/picomatch": { 1226 | "version": "2.3.1", 1227 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1228 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1229 | "engines": { 1230 | "node": ">=8.6" 1231 | }, 1232 | "funding": { 1233 | "url": "https://github.com/sponsors/jonschlinkert" 1234 | } 1235 | }, 1236 | "node_modules/postcss": { 1237 | "version": "8.4.47", 1238 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", 1239 | "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", 1240 | "dev": true, 1241 | "funding": [ 1242 | { 1243 | "type": "opencollective", 1244 | "url": "https://opencollective.com/postcss/" 1245 | }, 1246 | { 1247 | "type": "tidelift", 1248 | "url": "https://tidelift.com/funding/github/npm/postcss" 1249 | }, 1250 | { 1251 | "type": "github", 1252 | "url": "https://github.com/sponsors/ai" 1253 | } 1254 | ], 1255 | "dependencies": { 1256 | "nanoid": "^3.3.7", 1257 | "picocolors": "^1.1.0", 1258 | "source-map-js": "^1.2.1" 1259 | }, 1260 | "engines": { 1261 | "node": "^10 || ^12 || >=14" 1262 | } 1263 | }, 1264 | "node_modules/postcss-media-query-parser": { 1265 | "version": "0.2.3", 1266 | "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", 1267 | "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", 1268 | "dev": true 1269 | }, 1270 | "node_modules/postcss-resolve-nested-selector": { 1271 | "version": "0.1.6", 1272 | "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", 1273 | "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", 1274 | "dev": true 1275 | }, 1276 | "node_modules/postcss-safe-parser": { 1277 | "version": "7.0.1", 1278 | "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", 1279 | "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", 1280 | "dev": true, 1281 | "funding": [ 1282 | { 1283 | "type": "opencollective", 1284 | "url": "https://opencollective.com/postcss/" 1285 | }, 1286 | { 1287 | "type": "tidelift", 1288 | "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" 1289 | }, 1290 | { 1291 | "type": "github", 1292 | "url": "https://github.com/sponsors/ai" 1293 | } 1294 | ], 1295 | "engines": { 1296 | "node": ">=18.0" 1297 | }, 1298 | "peerDependencies": { 1299 | "postcss": "^8.4.31" 1300 | } 1301 | }, 1302 | "node_modules/postcss-scss": { 1303 | "version": "4.0.9", 1304 | "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", 1305 | "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", 1306 | "dev": true, 1307 | "funding": [ 1308 | { 1309 | "type": "opencollective", 1310 | "url": "https://opencollective.com/postcss/" 1311 | }, 1312 | { 1313 | "type": "tidelift", 1314 | "url": "https://tidelift.com/funding/github/npm/postcss-scss" 1315 | }, 1316 | { 1317 | "type": "github", 1318 | "url": "https://github.com/sponsors/ai" 1319 | } 1320 | ], 1321 | "engines": { 1322 | "node": ">=12.0" 1323 | }, 1324 | "peerDependencies": { 1325 | "postcss": "^8.4.29" 1326 | } 1327 | }, 1328 | "node_modules/postcss-selector-parser": { 1329 | "version": "6.1.2", 1330 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", 1331 | "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", 1332 | "dev": true, 1333 | "dependencies": { 1334 | "cssesc": "^3.0.0", 1335 | "util-deprecate": "^1.0.2" 1336 | }, 1337 | "engines": { 1338 | "node": ">=4" 1339 | } 1340 | }, 1341 | "node_modules/postcss-sorting": { 1342 | "version": "8.0.2", 1343 | "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz", 1344 | "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==", 1345 | "dev": true, 1346 | "peerDependencies": { 1347 | "postcss": "^8.4.20" 1348 | } 1349 | }, 1350 | "node_modules/postcss-value-parser": { 1351 | "version": "4.2.0", 1352 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 1353 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 1354 | "dev": true 1355 | }, 1356 | "node_modules/punycode": { 1357 | "version": "2.3.1", 1358 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1359 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1360 | "dev": true, 1361 | "engines": { 1362 | "node": ">=6" 1363 | } 1364 | }, 1365 | "node_modules/queue-microtask": { 1366 | "version": "1.2.3", 1367 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1368 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1369 | "dev": true, 1370 | "funding": [ 1371 | { 1372 | "type": "github", 1373 | "url": "https://github.com/sponsors/feross" 1374 | }, 1375 | { 1376 | "type": "patreon", 1377 | "url": "https://www.patreon.com/feross" 1378 | }, 1379 | { 1380 | "type": "consulting", 1381 | "url": "https://feross.org/support" 1382 | } 1383 | ] 1384 | }, 1385 | "node_modules/readdirp": { 1386 | "version": "4.0.1", 1387 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.1.tgz", 1388 | "integrity": "sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==", 1389 | "engines": { 1390 | "node": ">= 14.16.0" 1391 | }, 1392 | "funding": { 1393 | "type": "individual", 1394 | "url": "https://paulmillr.com/funding/" 1395 | } 1396 | }, 1397 | "node_modules/require-from-string": { 1398 | "version": "2.0.2", 1399 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 1400 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 1401 | "dev": true, 1402 | "engines": { 1403 | "node": ">=0.10.0" 1404 | } 1405 | }, 1406 | "node_modules/resolve-from": { 1407 | "version": "5.0.0", 1408 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 1409 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 1410 | "dev": true, 1411 | "engines": { 1412 | "node": ">=8" 1413 | } 1414 | }, 1415 | "node_modules/reusify": { 1416 | "version": "1.0.4", 1417 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1418 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1419 | "dev": true, 1420 | "engines": { 1421 | "iojs": ">=1.0.0", 1422 | "node": ">=0.10.0" 1423 | } 1424 | }, 1425 | "node_modules/run-parallel": { 1426 | "version": "1.2.0", 1427 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1428 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1429 | "dev": true, 1430 | "funding": [ 1431 | { 1432 | "type": "github", 1433 | "url": "https://github.com/sponsors/feross" 1434 | }, 1435 | { 1436 | "type": "patreon", 1437 | "url": "https://www.patreon.com/feross" 1438 | }, 1439 | { 1440 | "type": "consulting", 1441 | "url": "https://feross.org/support" 1442 | } 1443 | ], 1444 | "dependencies": { 1445 | "queue-microtask": "^1.2.2" 1446 | } 1447 | }, 1448 | "node_modules/sass": { 1449 | "version": "1.79.5", 1450 | "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.5.tgz", 1451 | "integrity": "sha512-W1h5kp6bdhqFh2tk3DsI771MoEJjvrSY/2ihJRJS4pjIyfJCw0nTsxqhnrUzaLMOJjFchj8rOvraI/YUVjtx5g==", 1452 | "dependencies": { 1453 | "@parcel/watcher": "^2.4.1", 1454 | "chokidar": "^4.0.0", 1455 | "immutable": "^4.0.0", 1456 | "source-map-js": ">=0.6.2 <2.0.0" 1457 | }, 1458 | "bin": { 1459 | "sass": "sass.js" 1460 | }, 1461 | "engines": { 1462 | "node": ">=14.0.0" 1463 | } 1464 | }, 1465 | "node_modules/signal-exit": { 1466 | "version": "4.1.0", 1467 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1468 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1469 | "dev": true, 1470 | "engines": { 1471 | "node": ">=14" 1472 | }, 1473 | "funding": { 1474 | "url": "https://github.com/sponsors/isaacs" 1475 | } 1476 | }, 1477 | "node_modules/slash": { 1478 | "version": "3.0.0", 1479 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1480 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 1481 | "dev": true, 1482 | "engines": { 1483 | "node": ">=8" 1484 | } 1485 | }, 1486 | "node_modules/slice-ansi": { 1487 | "version": "4.0.0", 1488 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", 1489 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", 1490 | "dev": true, 1491 | "dependencies": { 1492 | "ansi-styles": "^4.0.0", 1493 | "astral-regex": "^2.0.0", 1494 | "is-fullwidth-code-point": "^3.0.0" 1495 | }, 1496 | "engines": { 1497 | "node": ">=10" 1498 | }, 1499 | "funding": { 1500 | "url": "https://github.com/chalk/slice-ansi?sponsor=1" 1501 | } 1502 | }, 1503 | "node_modules/slice-ansi/node_modules/ansi-styles": { 1504 | "version": "4.3.0", 1505 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1506 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1507 | "dev": true, 1508 | "dependencies": { 1509 | "color-convert": "^2.0.1" 1510 | }, 1511 | "engines": { 1512 | "node": ">=8" 1513 | }, 1514 | "funding": { 1515 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1516 | } 1517 | }, 1518 | "node_modules/slice-ansi/node_modules/color-convert": { 1519 | "version": "2.0.1", 1520 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1521 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1522 | "dev": true, 1523 | "dependencies": { 1524 | "color-name": "~1.1.4" 1525 | }, 1526 | "engines": { 1527 | "node": ">=7.0.0" 1528 | } 1529 | }, 1530 | "node_modules/slice-ansi/node_modules/color-name": { 1531 | "version": "1.1.4", 1532 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1533 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1534 | "dev": true 1535 | }, 1536 | "node_modules/source-map-js": { 1537 | "version": "1.2.1", 1538 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 1539 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 1540 | "engines": { 1541 | "node": ">=0.10.0" 1542 | } 1543 | }, 1544 | "node_modules/string-width": { 1545 | "version": "4.2.3", 1546 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1547 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1548 | "dev": true, 1549 | "dependencies": { 1550 | "emoji-regex": "^8.0.0", 1551 | "is-fullwidth-code-point": "^3.0.0", 1552 | "strip-ansi": "^6.0.1" 1553 | }, 1554 | "engines": { 1555 | "node": ">=8" 1556 | } 1557 | }, 1558 | "node_modules/strip-ansi": { 1559 | "version": "6.0.1", 1560 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1561 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1562 | "dev": true, 1563 | "dependencies": { 1564 | "ansi-regex": "^5.0.1" 1565 | }, 1566 | "engines": { 1567 | "node": ">=8" 1568 | } 1569 | }, 1570 | "node_modules/stylelint": { 1571 | "version": "16.10.0", 1572 | "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.10.0.tgz", 1573 | "integrity": "sha512-z/8X2rZ52dt2c0stVwI9QL2AFJhLhbPkyfpDFcizs200V/g7v+UYY6SNcB9hKOLcDDX/yGLDsY/pX08sLkz9xQ==", 1574 | "dev": true, 1575 | "funding": [ 1576 | { 1577 | "type": "opencollective", 1578 | "url": "https://opencollective.com/stylelint" 1579 | }, 1580 | { 1581 | "type": "github", 1582 | "url": "https://github.com/sponsors/stylelint" 1583 | } 1584 | ], 1585 | "dependencies": { 1586 | "@csstools/css-parser-algorithms": "^3.0.1", 1587 | "@csstools/css-tokenizer": "^3.0.1", 1588 | "@csstools/media-query-list-parser": "^3.0.1", 1589 | "@csstools/selector-specificity": "^4.0.0", 1590 | "@dual-bundle/import-meta-resolve": "^4.1.0", 1591 | "balanced-match": "^2.0.0", 1592 | "colord": "^2.9.3", 1593 | "cosmiconfig": "^9.0.0", 1594 | "css-functions-list": "^3.2.3", 1595 | "css-tree": "^3.0.0", 1596 | "debug": "^4.3.7", 1597 | "fast-glob": "^3.3.2", 1598 | "fastest-levenshtein": "^1.0.16", 1599 | "file-entry-cache": "^9.1.0", 1600 | "global-modules": "^2.0.0", 1601 | "globby": "^11.1.0", 1602 | "globjoin": "^0.1.4", 1603 | "html-tags": "^3.3.1", 1604 | "ignore": "^6.0.2", 1605 | "imurmurhash": "^0.1.4", 1606 | "is-plain-object": "^5.0.0", 1607 | "known-css-properties": "^0.34.0", 1608 | "mathml-tag-names": "^2.1.3", 1609 | "meow": "^13.2.0", 1610 | "micromatch": "^4.0.8", 1611 | "normalize-path": "^3.0.0", 1612 | "picocolors": "^1.0.1", 1613 | "postcss": "^8.4.47", 1614 | "postcss-resolve-nested-selector": "^0.1.6", 1615 | "postcss-safe-parser": "^7.0.1", 1616 | "postcss-selector-parser": "^6.1.2", 1617 | "postcss-value-parser": "^4.2.0", 1618 | "resolve-from": "^5.0.0", 1619 | "string-width": "^4.2.3", 1620 | "supports-hyperlinks": "^3.1.0", 1621 | "svg-tags": "^1.0.0", 1622 | "table": "^6.8.2", 1623 | "write-file-atomic": "^5.0.1" 1624 | }, 1625 | "bin": { 1626 | "stylelint": "bin/stylelint.mjs" 1627 | }, 1628 | "engines": { 1629 | "node": ">=18.12.0" 1630 | } 1631 | }, 1632 | "node_modules/stylelint-config-recommended": { 1633 | "version": "14.0.0", 1634 | "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz", 1635 | "integrity": "sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==", 1636 | "dev": true, 1637 | "engines": { 1638 | "node": ">=18.12.0" 1639 | }, 1640 | "peerDependencies": { 1641 | "stylelint": "^16.0.0" 1642 | } 1643 | }, 1644 | "node_modules/stylelint-config-recommended-scss": { 1645 | "version": "14.0.0", 1646 | "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.0.0.tgz", 1647 | "integrity": "sha512-HDvpoOAQ1RpF+sPbDOT2Q2/YrBDEJDnUymmVmZ7mMCeNiFSdhRdyGEimBkz06wsN+HaFwUh249gDR+I9JR7Onw==", 1648 | "dev": true, 1649 | "dependencies": { 1650 | "postcss-scss": "^4.0.9", 1651 | "stylelint-config-recommended": "^14.0.0", 1652 | "stylelint-scss": "^6.0.0" 1653 | }, 1654 | "engines": { 1655 | "node": ">=18.12.0" 1656 | }, 1657 | "peerDependencies": { 1658 | "postcss": "^8.3.3", 1659 | "stylelint": "^16.0.2" 1660 | }, 1661 | "peerDependenciesMeta": { 1662 | "postcss": { 1663 | "optional": true 1664 | } 1665 | } 1666 | }, 1667 | "node_modules/stylelint-config-standard": { 1668 | "version": "36.0.0", 1669 | "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-36.0.0.tgz", 1670 | "integrity": "sha512-3Kjyq4d62bYFp/Aq8PMKDwlgUyPU4nacXsjDLWJdNPRUgpuxALu1KnlAHIj36cdtxViVhXexZij65yM0uNIHug==", 1671 | "dev": true, 1672 | "dependencies": { 1673 | "stylelint-config-recommended": "^14.0.0" 1674 | }, 1675 | "engines": { 1676 | "node": ">=18.12.0" 1677 | }, 1678 | "peerDependencies": { 1679 | "stylelint": "^16.1.0" 1680 | } 1681 | }, 1682 | "node_modules/stylelint-config-standard-scss": { 1683 | "version": "13.0.0", 1684 | "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-13.0.0.tgz", 1685 | "integrity": "sha512-WaLvkP689qSYUpJQPCo30TFJSSc3VzvvoWnrgp+7PpVby5o8fRUY1cZcP0sePZfjrFl9T8caGhcKg0GO34VDiQ==", 1686 | "dev": true, 1687 | "dependencies": { 1688 | "stylelint-config-recommended-scss": "^14.0.0", 1689 | "stylelint-config-standard": "^36.0.0" 1690 | }, 1691 | "engines": { 1692 | "node": ">=18.12.0" 1693 | }, 1694 | "peerDependencies": { 1695 | "postcss": "^8.3.3", 1696 | "stylelint": "^16.1.0" 1697 | }, 1698 | "peerDependenciesMeta": { 1699 | "postcss": { 1700 | "optional": true 1701 | } 1702 | } 1703 | }, 1704 | "node_modules/stylelint-declaration-block-no-ignored-properties": { 1705 | "version": "2.8.0", 1706 | "resolved": "https://registry.npmjs.org/stylelint-declaration-block-no-ignored-properties/-/stylelint-declaration-block-no-ignored-properties-2.8.0.tgz", 1707 | "integrity": "sha512-Ws8Cav7Y+SPN0JsV407LrnNXWOrqGjxShf+37GBtnU/C58Syve9c0+I/xpLcFOosST3ternykn3Lp77f3ITnFw==", 1708 | "dev": true, 1709 | "engines": { 1710 | "node": ">=6" 1711 | }, 1712 | "peerDependencies": { 1713 | "stylelint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" 1714 | } 1715 | }, 1716 | "node_modules/stylelint-order": { 1717 | "version": "6.0.4", 1718 | "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.4.tgz", 1719 | "integrity": "sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==", 1720 | "dev": true, 1721 | "dependencies": { 1722 | "postcss": "^8.4.32", 1723 | "postcss-sorting": "^8.0.2" 1724 | }, 1725 | "peerDependencies": { 1726 | "stylelint": "^14.0.0 || ^15.0.0 || ^16.0.1" 1727 | } 1728 | }, 1729 | "node_modules/stylelint-scss": { 1730 | "version": "6.1.0", 1731 | "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.1.0.tgz", 1732 | "integrity": "sha512-kCfK8TQzthGwb4vaZniZgxRsVbCM4ZckmT1b/H5m4FU3I8Dz0id9llKsy1NMp3XXqC8+OPD4rVKtUbSxXlJb5g==", 1733 | "dev": true, 1734 | "dependencies": { 1735 | "known-css-properties": "^0.29.0", 1736 | "postcss-media-query-parser": "^0.2.3", 1737 | "postcss-resolve-nested-selector": "^0.1.1", 1738 | "postcss-selector-parser": "^6.0.15", 1739 | "postcss-value-parser": "^4.2.0" 1740 | }, 1741 | "engines": { 1742 | "node": ">=18.12.0" 1743 | }, 1744 | "peerDependencies": { 1745 | "stylelint": "^16.0.2" 1746 | } 1747 | }, 1748 | "node_modules/stylelint-use-logical-spec": { 1749 | "version": "5.0.1", 1750 | "resolved": "https://registry.npmjs.org/stylelint-use-logical-spec/-/stylelint-use-logical-spec-5.0.1.tgz", 1751 | "integrity": "sha512-UfLB4LW6iG4r3cXxjxkiHQrFyhWFqt8FpNNngD+TyvgMWSokk5TYwTvBHS3atUvZhOogllTOe/PUrGE+4z84AA==", 1752 | "dev": true, 1753 | "engines": { 1754 | "node": ">=8.0.0" 1755 | }, 1756 | "peerDependencies": { 1757 | "stylelint": ">=11 < 17" 1758 | } 1759 | }, 1760 | "node_modules/stylelint/node_modules/ignore": { 1761 | "version": "6.0.2", 1762 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", 1763 | "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", 1764 | "dev": true, 1765 | "engines": { 1766 | "node": ">= 4" 1767 | } 1768 | }, 1769 | "node_modules/stylelint/node_modules/known-css-properties": { 1770 | "version": "0.34.0", 1771 | "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", 1772 | "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", 1773 | "dev": true 1774 | }, 1775 | "node_modules/supports-color": { 1776 | "version": "5.5.0", 1777 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1778 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1779 | "dev": true, 1780 | "dependencies": { 1781 | "has-flag": "^3.0.0" 1782 | }, 1783 | "engines": { 1784 | "node": ">=4" 1785 | } 1786 | }, 1787 | "node_modules/supports-hyperlinks": { 1788 | "version": "3.1.0", 1789 | "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", 1790 | "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", 1791 | "dev": true, 1792 | "dependencies": { 1793 | "has-flag": "^4.0.0", 1794 | "supports-color": "^7.0.0" 1795 | }, 1796 | "engines": { 1797 | "node": ">=14.18" 1798 | }, 1799 | "funding": { 1800 | "url": "https://github.com/sponsors/sindresorhus" 1801 | } 1802 | }, 1803 | "node_modules/supports-hyperlinks/node_modules/has-flag": { 1804 | "version": "4.0.0", 1805 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1806 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1807 | "dev": true, 1808 | "engines": { 1809 | "node": ">=8" 1810 | } 1811 | }, 1812 | "node_modules/supports-hyperlinks/node_modules/supports-color": { 1813 | "version": "7.2.0", 1814 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1815 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1816 | "dev": true, 1817 | "dependencies": { 1818 | "has-flag": "^4.0.0" 1819 | }, 1820 | "engines": { 1821 | "node": ">=8" 1822 | } 1823 | }, 1824 | "node_modules/svg-tags": { 1825 | "version": "1.0.0", 1826 | "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", 1827 | "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", 1828 | "dev": true 1829 | }, 1830 | "node_modules/table": { 1831 | "version": "6.8.2", 1832 | "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", 1833 | "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", 1834 | "dev": true, 1835 | "dependencies": { 1836 | "ajv": "^8.0.1", 1837 | "lodash.truncate": "^4.4.2", 1838 | "slice-ansi": "^4.0.0", 1839 | "string-width": "^4.2.3", 1840 | "strip-ansi": "^6.0.1" 1841 | }, 1842 | "engines": { 1843 | "node": ">=10.0.0" 1844 | } 1845 | }, 1846 | "node_modules/to-regex-range": { 1847 | "version": "5.0.1", 1848 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1849 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1850 | "dependencies": { 1851 | "is-number": "^7.0.0" 1852 | }, 1853 | "engines": { 1854 | "node": ">=8.0" 1855 | } 1856 | }, 1857 | "node_modules/uri-js": { 1858 | "version": "4.4.1", 1859 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1860 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1861 | "dev": true, 1862 | "dependencies": { 1863 | "punycode": "^2.1.0" 1864 | } 1865 | }, 1866 | "node_modules/util-deprecate": { 1867 | "version": "1.0.2", 1868 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1869 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 1870 | "dev": true 1871 | }, 1872 | "node_modules/which": { 1873 | "version": "1.3.1", 1874 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1875 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1876 | "dev": true, 1877 | "dependencies": { 1878 | "isexe": "^2.0.0" 1879 | }, 1880 | "bin": { 1881 | "which": "bin/which" 1882 | } 1883 | }, 1884 | "node_modules/write-file-atomic": { 1885 | "version": "5.0.1", 1886 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", 1887 | "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", 1888 | "dev": true, 1889 | "dependencies": { 1890 | "imurmurhash": "^0.1.4", 1891 | "signal-exit": "^4.0.1" 1892 | }, 1893 | "engines": { 1894 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0" 1895 | } 1896 | } 1897 | } 1898 | } 1899 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "thoughtbot, inc.", 3 | "devDependencies": { 4 | "@thoughtbot/stylelint-config": "^4.0.0", 5 | 6 | "stylelint-use-logical-spec": "^5.0.1" 7 | }, 8 | "license": "MIT", 9 | "name": "@thoughtbot/design-system", 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/thoughtbot/design-system.git" 13 | }, 14 | "scripts": { 15 | "compile-sass": "npx sass --style=compressed --load-path=node_modules src/index.scss dist/tbds.css", 16 | "prepack": "npm run compile-sass", 17 | "prepublishOnly": "git push && git push --tags", 18 | "stylelint": "npx stylelint 'src/**/*.scss'", 19 | "version": "git add CHANGELOG.md" 20 | }, 21 | "version": "0.7.3", 22 | "dependencies": { 23 | "@sass-collective/strip-unit": "^3.1.2" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/app-frame/README.md: -------------------------------------------------------------------------------- 1 | # App Frame 2 | 3 | A handy way to have a header, footer, and flexible body that fills in-between. 4 | 5 | [View prototype on CodePen][codepen]. 6 | 7 | [codepen]: https://codepen.io/thoughtbot/pen/YzzREyL 8 | 9 | ## Usage 10 | 11 | ### Default 12 | 13 | ```html 14 |
15 |
16 | Header 17 |
18 | 19 |
20 | Flexible body 21 |
22 | 23 | 26 |
27 | ``` 28 | -------------------------------------------------------------------------------- /src/app-frame/index.scss: -------------------------------------------------------------------------------- 1 | @import "./lib/app-frame"; 2 | -------------------------------------------------------------------------------- /src/app-frame/lib/app-frame.scss: -------------------------------------------------------------------------------- 1 | .tbds-app-frame { 2 | align-items: stretch; 3 | display: flex; 4 | flex-direction: column; 5 | inline-size: 100%; 6 | min-block-size: 100vh; 7 | } 8 | 9 | .tbds-app-frame__header { 10 | flex-grow: 0; 11 | } 12 | 13 | .tbds-app-frame__body { 14 | flex-grow: 1; 15 | } 16 | 17 | .tbds-app-frame__body--center-items { 18 | align-items: center; 19 | display: flex; 20 | flex-direction: column; 21 | justify-content: center; 22 | } 23 | 24 | .tbds-app-frame__footer { 25 | flex-grow: 0; 26 | } 27 | -------------------------------------------------------------------------------- /src/avatar/README.md: -------------------------------------------------------------------------------- 1 | # Avatar 2 | 3 | [View prototype on CodePen][codepen]. 4 | 5 | [codepen]: https://codepen.io/thoughtbot/pen/Lvmamx 6 | 7 | ## Usage 8 | 9 | ### Default 10 | 11 | ```html 12 | Bill Murray 17 | ``` 18 | 19 | ### Small size 20 | 21 | ```html 22 | Bill Murray 27 | ``` 28 | 29 | ### Large size 30 | 31 | ```html 32 | Bill Murray 37 | ``` 38 | 39 | ### Circular 40 | 41 | ```html 42 | Bill Murray 47 | ``` 48 | -------------------------------------------------------------------------------- /src/avatar/index.scss: -------------------------------------------------------------------------------- 1 | @import "../settings/index"; 2 | 3 | @import "./lib/avatar"; 4 | -------------------------------------------------------------------------------- /src/avatar/lib/avatar.scss: -------------------------------------------------------------------------------- 1 | .tbds-avatar { 2 | --tbds-avatar-border-radius: 3px; 3 | --tbds-avatar-size: 3rem; 4 | 5 | block-size: var(--tbds-avatar-size); 6 | border-radius: var(--tbds-avatar-border-radius); 7 | display: inline-block; 8 | inline-size: var(--tbds-avatar-size); 9 | object-fit: cover; 10 | } 11 | 12 | .tbds-avatar--circle { 13 | --tbds-avatar-border-radius: 100%; 14 | } 15 | 16 | .tbds-avatar--small { 17 | --tbds-avatar-size: 2rem; 18 | } 19 | 20 | .tbds-avatar--large { 21 | --tbds-avatar-size: 4rem; 22 | } 23 | -------------------------------------------------------------------------------- /src/badge/README.md: -------------------------------------------------------------------------------- 1 | # Badge 2 | 3 | Badges contain small amounts of information that help provide additional 4 | context for a larger piece of content. Context could be describing the 5 | content's state, status, or other pertinent meta-information. 6 | 7 | An example of a badge could be a count for updates, or a status of "new". 8 | Badges are not to be confused with tags or input labels. Tags and input labels 9 | could contain badges, however. 10 | 11 | [View prototype on CodePen][codepen]. 12 | 13 | [codepen]: https://codepen.io/thoughtbot/pen/ZEzROvy 14 | 15 | ## Usage 16 | 17 | ### Default 18 | 19 | ```html 20 | Badge Label 21 | ``` 22 | 23 | ```html 24 | Link Badge 25 | ``` 26 | 27 | ```html 28 | 29 | ``` 30 | 31 | ```html 32 | Badge with text-level formatting 33 | ``` -------------------------------------------------------------------------------- /src/badge/index.scss: -------------------------------------------------------------------------------- 1 | @import "../settings/index"; 2 | 3 | @import "./lib/badge"; 4 | -------------------------------------------------------------------------------- /src/badge/lib/badge.scss: -------------------------------------------------------------------------------- 1 | $_tbds-badge-font-size: 0.8em !default; 2 | $_tbds-badge-background-color: #f5f5f5 !default; 3 | $_tbds-badge-color: $tbds-brand-gray-dark !default; 4 | 5 | .tbds-badge { 6 | background-color: $_tbds-badge-background-color; 7 | border: 0; 8 | border-radius: $_tbds-badge-font-size; 9 | color: $_tbds-badge-color; 10 | display: inline-block; 11 | font-size: $_tbds-badge-font-size; 12 | font-weight: normal; 13 | line-height: 1; 14 | padding: 0.25em 0.75em; 15 | vertical-align: baseline; 16 | white-space: nowrap; 17 | } 18 | -------------------------------------------------------------------------------- /src/button/README.md: -------------------------------------------------------------------------------- 1 | # Button 2 | 3 | [View prototype on CodePen][codepen]. 4 | 5 | [codepen]: https://codepen.io/thoughtbot/pen/VNdVrK 6 | 7 | ## Usage 8 | 9 | ### Default 10 | 11 | ```html 12 | 15 | ``` 16 | 17 | ### Disabled button state 18 | 19 | ```html 20 | 23 | ``` 24 | 25 | ### Button with icon at the start 26 | 27 | ```html 28 | 33 | ``` 34 | 35 | ### Button with icon at the end 36 | 37 | ```html 38 | 43 | ``` 44 | -------------------------------------------------------------------------------- /src/button/index.scss: -------------------------------------------------------------------------------- 1 | @import "../settings/index"; 2 | 3 | @import "./lib/button"; 4 | -------------------------------------------------------------------------------- /src/button/lib/button.scss: -------------------------------------------------------------------------------- 1 | $_tbds-button-background-color: $tbds-brand-red !default; 2 | $_tbds-button-background-color-hover: darken($_tbds-button-background-color, 10%) !default; 3 | $_tbds-button-border: 0 !default; 4 | $_tbds-button-border-radius: 5px !default; 5 | $_tbds-button-font-family: $tbds-font-sans-serif !default; 6 | $_tbds-button-font-size: 16px !default; 7 | $_tbds-button-font-weight: $tbds-font-weight-bold !default; 8 | $_tbds-button-text-color: #fff !default; 9 | $_tbds-button-text-color-hover: #fff !default; 10 | 11 | .tbds-button { 12 | --tbds-button-block-size: #{$tbds-control-block-size}; 13 | --tbds-button-padding-inline: 1.5rem; 14 | 15 | align-items: center; 16 | appearance: none; 17 | background-color: $_tbds-button-background-color; 18 | block-size: var(--tbds-button-block-size); 19 | border: $_tbds-button-border; 20 | border-radius: $_tbds-button-border-radius; 21 | color: $_tbds-button-text-color; 22 | cursor: pointer; 23 | display: inline-flex; 24 | font-family: $_tbds-button-font-family; 25 | font-size: $_tbds-button-font-size; 26 | -webkit-font-smoothing: antialiased; 27 | font-weight: $_tbds-button-font-weight; 28 | justify-content: center; 29 | line-height: 1; 30 | padding-inline-end: var(--tbds-button-padding-inline); 31 | padding-inline-start: var(--tbds-button-padding-inline); 32 | text-decoration: none; 33 | transition: background-color 200ms ease; 34 | user-select: none; 35 | vertical-align: middle; 36 | white-space: nowrap; 37 | 38 | @supports (padding-inline: 0) { 39 | padding-inline: var(--tbds-button-padding-inline); 40 | } 41 | 42 | &:hover { 43 | background-color: $_tbds-button-background-color-hover; 44 | color: $_tbds-button-text-color-hover; 45 | } 46 | 47 | &:focus { 48 | box-shadow: 0 0 0 2px #fff, 0 0 0 4px $tbds-focus-outline-color; 49 | outline: none; 50 | } 51 | 52 | &:disabled { 53 | cursor: not-allowed; 54 | opacity: 0.5; 55 | 56 | &:hover { 57 | background-color: $_tbds-button-background-color; 58 | } 59 | } 60 | } 61 | 62 | .tbds-button--full-width { 63 | inline-size: 100%; 64 | } 65 | 66 | .tbds-button__icon { 67 | block-size: 1em; 68 | fill: currentColor; 69 | inline-size: 1em; 70 | } 71 | 72 | .tbds-button__icon--start { 73 | margin-inline-end: 0.5em; 74 | } 75 | 76 | .tbds-button__icon--end { 77 | margin-inline-start: 0.5em; 78 | } 79 | -------------------------------------------------------------------------------- /src/elements/index.scss: -------------------------------------------------------------------------------- 1 | @import "../settings/index"; 2 | 3 | @import "./lib/layout"; 4 | @import "./lib/media"; 5 | @import "./lib/typography"; 6 | -------------------------------------------------------------------------------- /src/elements/lib/layout.scss: -------------------------------------------------------------------------------- 1 | html { 2 | box-sizing: border-box; 3 | } 4 | 5 | *, 6 | *::before, 7 | *::after { 8 | box-sizing: inherit; 9 | } 10 | 11 | img { 12 | max-inline-size: 100%; 13 | } 14 | 15 | [hidden] { 16 | // stylelint-disable-next-line declaration-no-important 17 | display: none !important; 18 | } 19 | -------------------------------------------------------------------------------- /src/elements/lib/media.scss: -------------------------------------------------------------------------------- 1 | img, 2 | video { 3 | @media (inverted-colors: inverted) { 4 | filter: invert(100%); 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/elements/lib/typography.scss: -------------------------------------------------------------------------------- 1 | html { 2 | color: $tbds-color-text-default; 3 | } 4 | 5 | h1, 6 | h2, 7 | h3, 8 | h4, 9 | h5, 10 | h6 { 11 | font-weight: $tbds-font-weight-bold; 12 | } 13 | 14 | a { 15 | color: $tbds-color-text-link; 16 | text-decoration: underline; 17 | text-decoration-skip-ink: auto; 18 | 19 | &:hover { 20 | color: $tbds-color-text-link-hover; 21 | text-decoration: none; 22 | } 23 | 24 | &:focus { 25 | outline: $tbds-focus-outline; 26 | outline-offset: $tbds-focus-outline-offset; 27 | text-decoration: none; 28 | } 29 | } 30 | 31 | b, 32 | strong { 33 | font-weight: $tbds-font-weight-bold; 34 | } 35 | -------------------------------------------------------------------------------- /src/forms/README.md: -------------------------------------------------------------------------------- 1 | # Forms 2 | 3 | [View prototype on CodePen][codepen]. 4 | 5 | [codepen]: https://codepen.io/thoughtbot/pen/BeoedZ 6 | 7 | ### Default 8 | 9 | ```html 10 | 11 |
12 | 15 | 16 | 23 |
24 | 25 |
26 | 30 | 31 | 39 |
40 | 41 |
42 | 51 | 52 | 59 |
60 | 61 |
62 | 65 | 66 | 72 |
73 | 74 |
75 | 82 | 83 | 90 |
91 | 92 |
93 | 100 | 101 | 108 |
109 | 110 |
111 | 114 | 115 | 120 |
121 | 122 |
123 |
124 | 125 | Privacy settings 126 | 127 | 128 |
129 | 136 | 137 | 140 |
141 | 142 |
143 | 150 | 151 | 154 |
155 |
156 |
157 | 158 |
159 |
160 | 161 | What borough do you live in? 162 | 163 | 164 |
165 | 172 | 173 | 176 |
177 | 178 |
179 | 186 | 187 | 190 |
191 | 192 |
193 | 200 | 201 | 204 |
205 | 206 |
207 | 214 | 215 | 218 |
219 | 220 |
221 | 228 | 229 | 232 |
233 |
234 |
235 | 236 |
237 |
238 | 239 | What foods do you enjoy? 240 | 241 | 242 | Select all that apply 243 | 244 | 245 | 246 |
247 | 254 | 255 | 258 |
259 | 260 |
261 | 268 | 269 | 272 |
273 | 274 |
275 | 282 | 283 | 286 |
287 |
288 |
289 | 290 |
291 | 294 | 295 | 296 |
297 | 298 |
299 |
300 | 301 | Options 302 | 303 | 304 |
305 | 312 | 313 | 320 |
321 | 322 |
323 | 330 | 331 | 338 |
339 |
340 |
341 | 342 |
343 | 346 |
347 | 348 | ``` 349 | -------------------------------------------------------------------------------- /src/forms/index.scss: -------------------------------------------------------------------------------- 1 | @import "../settings/index"; 2 | 3 | @import "./lib/reset"; 4 | @import "./lib/form"; 5 | 6 | @import "./lib/input-button-unit"; 7 | -------------------------------------------------------------------------------- /src/forms/lib/form.scss: -------------------------------------------------------------------------------- 1 | .tbds-form { 2 | --tbds-form-block-size: #{$tbds-control-block-size}; 3 | --tbds-form-padding-inline: 0.5rem; 4 | } 5 | 6 | .tbds-form__label { 7 | display: block; 8 | font-weight: $tbds-font-weight-bold; 9 | margin-block-end: 0.5rem; 10 | } 11 | 12 | .tbds-form__help-text { 13 | color: #666; 14 | font-weight: $tbds-font-weight-normal; 15 | } 16 | 17 | .tbds-form__help-text--block { 18 | display: block; 19 | margin-block-start: 0.3rem; 20 | } 21 | 22 | .tbds-form__text-input { 23 | appearance: none; 24 | background-color: #fff; 25 | block-size: var(--tbds-form-block-size); 26 | border: 1px solid #888; 27 | border-radius: 4px; 28 | font-size: 16px; 29 | inline-size: 100%; 30 | margin: 0; 31 | padding-inline-end: var(--tbds-form-padding-inline); 32 | padding-inline-start: var(--tbds-form-padding-inline); 33 | 34 | @supports (padding-inline: 0) { 35 | padding-inline: var(--tbds-form-padding-inline); 36 | } 37 | 38 | &:focus { 39 | border-color: $tbds-brand-blue; 40 | box-shadow: 0 0 0 1px $tbds-brand-blue; 41 | outline: none; 42 | } 43 | } 44 | 45 | .tbds-form__textarea { 46 | appearance: none; 47 | background-color: #fff; 48 | block-size: auto; 49 | border: 1px solid #888; 50 | border-radius: 4px; 51 | font-size: 16px; 52 | inline-size: 100%; 53 | line-height: 1.4; 54 | margin: 0; 55 | min-block-size: var(--tbds-form-block-size); 56 | padding: var(--tbds-form-padding-inline); 57 | resize: vertical; 58 | 59 | @supports (resize: block) { 60 | resize: block; 61 | } 62 | 63 | &:focus { 64 | border-color: $tbds-brand-blue; 65 | box-shadow: 0 0 0 1px $tbds-brand-blue; 66 | outline: none; 67 | } 68 | } 69 | 70 | .tbds-form__choice { 71 | align-items: baseline; 72 | display: flex; 73 | } 74 | 75 | .tbds-form__choice + .tbds-form__choice { 76 | margin-block-start: 1rem; 77 | } 78 | 79 | .tbds-form__choice--inline { 80 | display: inline-flex; 81 | } 82 | 83 | .tbds-form__choice--inline + .tbds-form__choice--inline { 84 | margin-block-start: 0; 85 | margin-inline-start: 1rem; 86 | } 87 | 88 | .tbds-form__choice-input { 89 | margin-inline-end: 0.75rem; 90 | } 91 | -------------------------------------------------------------------------------- /src/forms/lib/input-button-unit.scss: -------------------------------------------------------------------------------- 1 | .tbds-input-button-unit { 2 | display: flex; 3 | } 4 | 5 | .tbds-input-button-unit__input { 6 | border-bottom-right-radius: 0; 7 | border-inline-end: none; 8 | border-top-right-radius: 0; 9 | flex: 1 1 auto; 10 | margin: 0; 11 | 12 | @supports (border-end-end-radius: 0) { 13 | border-end-end-radius: 0; 14 | border-start-end-radius: 0; 15 | } 16 | } 17 | 18 | .tbds-input-button-unit__button { 19 | border-bottom-left-radius: 0; 20 | border-top-left-radius: 0; 21 | 22 | @supports (border-start-start-radius: 0) { 23 | border-end-start-radius: 0; 24 | border-start-start-radius: 0; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/forms/lib/reset.scss: -------------------------------------------------------------------------------- 1 | fieldset { 2 | border: none; 3 | margin: 0; 4 | padding: 0; 5 | } 6 | 7 | select { 8 | font-size: 16px; 9 | inline-size: 100%; 10 | } 11 | -------------------------------------------------------------------------------- /src/icon/README.md: -------------------------------------------------------------------------------- 1 | # Icon 2 | 3 | [View prototype on CodePen][codepen]. 4 | 5 | [codepen]: https://codepen.io/thoughtbot/pen/mYbVgx 6 | 7 | ## Usage 8 | 9 | ### Default 10 | 11 | ```html 12 | 13 | … 14 | 15 | ``` 16 | 17 | ### Size modifiers 18 | 19 | ```html 20 | 21 | … 22 | 23 | 24 | 25 | … 26 | 27 | ``` 28 | -------------------------------------------------------------------------------- /src/icon/index.scss: -------------------------------------------------------------------------------- 1 | @import "../settings/index"; 2 | 3 | @import "./lib/icon"; 4 | -------------------------------------------------------------------------------- /src/icon/lib/icon.scss: -------------------------------------------------------------------------------- 1 | .tbds-icon { 2 | --tbds-icon-size: 1em; 3 | 4 | block-size: var(--tbds-icon-size); 5 | fill: currentColor; 6 | } 7 | 8 | .tbds-icon--large { 9 | --tbds-icon-size: 1.25em; 10 | } 11 | 12 | .tbds-icon--small { 13 | --tbds-icon-size: 0.75em; 14 | } 15 | -------------------------------------------------------------------------------- /src/index.scss: -------------------------------------------------------------------------------- 1 | @use "@sass-collective/strip-unit"; 2 | 3 | @import "app-frame/index"; 4 | @import "avatar/index"; 5 | @import "badge/index"; 6 | @import "button/index"; 7 | @import "elements/index"; 8 | @import "forms/index"; 9 | @import "icon/index"; 10 | @import "media/index"; 11 | @import "skip-link/index"; 12 | @import "stack/index"; 13 | @import "utilities/index"; 14 | -------------------------------------------------------------------------------- /src/logo/emblem-inverted.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/logo/emblem.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/logo/horizontal-inverted.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/logo/horizontal.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/logo/veritcal.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/logo/vertical-inverted.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/logo/wordmark-inverted.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/logo/wordmark.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/media/README.md: -------------------------------------------------------------------------------- 1 | # Media 2 | 3 | [View prototype on CodePen][codepen]. 4 | 5 | [codepen]: https://codepen.io/thoughtbot/pen/LoNMxz 6 | 7 | ## Usage 8 | 9 | ### Default 10 | 11 | ```html 12 |
13 |
14 | alternative text 15 |
16 | 17 |
18 | Some content 19 |
20 |
21 | ``` 22 | 23 | ### Block-centered 24 | 25 | ```html 26 |
27 |
28 | alternative text 29 |
30 | 31 |
32 | Some content 33 |
34 |
35 | ``` 36 | -------------------------------------------------------------------------------- /src/media/index.scss: -------------------------------------------------------------------------------- 1 | @import "../settings/index"; 2 | 3 | @import "./lib/media"; 4 | -------------------------------------------------------------------------------- /src/media/lib/media.scss: -------------------------------------------------------------------------------- 1 | .tbds-media { 2 | align-items: flex-start; 3 | display: flex; 4 | } 5 | 6 | .tbds-media--block-center { 7 | align-items: center; 8 | } 9 | 10 | .tbds-media__figure { 11 | margin-inline-end: $tbds-space-2; 12 | } 13 | 14 | .tbds-media__body { 15 | flex: 1; 16 | } 17 | -------------------------------------------------------------------------------- /src/settings/README.md: -------------------------------------------------------------------------------- 1 | # Settings 2 | 3 | ## Usage 4 | 5 | ## Layout variables 6 | 7 | | Variable | Scale | Value | 8 | | --------------- | ----- | ------- | 9 | | `$tbds-space-0` | 0 | `0` | 10 | | `$tbds-space-1` | 1 | `4px` | 11 | | `$tbds-space-2` | 2 | `8px` | 12 | | `$tbds-space-3` | 3 | `16px` | 13 | | `$tbds-space-4` | 4 | `24px` | 14 | | `$tbds-space-5` | 5 | `32px` | 15 | | `$tbds-space-6` | 6 | `40px` | 16 | 17 | ## Color palette variables 18 | 19 | | Variable | Value | 20 | | ------------------------------ | --------- | 21 | | `$tbds-brand-red` | `#e03131` | 22 | | `$tbds-brand-gray-dark` | `#29292c` | 23 | | `$tbds-brand-gray-medium` | `#3d3e44` | 24 | | `$tbds-brand-gray-light` | `#67676e` | 25 | | `$tbds-brand-gray-ultra-light` | `#f0f0f8` | 26 | | `$tbds-brand-blue` | `#2e52e4` | 27 | | `$tbds-brand-purple` | `#6931e0` | 28 | | `$tbds-brand-yellow` | `#ffc726` | 29 | | `$tbds-brand-yellow-light` | `#ffe7a3` | 30 | 31 | ### Figma library 32 | 33 | The color palette is also available as Figma styles through our 34 | [Figma library][tbds-figma-library]. 35 | 36 | [tbds-figma-library]: https://tbot.io/tbds-figma-library 37 | 38 | ## Functional color variables 39 | 40 | | Variable | Value | 41 | | ----------------------------- | -------------------------- | 42 | | `$tbds-color-text-default` | `$tbds-brand-gray-dark` | 43 | | `$tbds-color-text-link` | `$tbds-color-text-default` | 44 | | `$tbds-color-text-link-hover` | `$tbds-brand-red` | 45 | 46 | ## Typography variables 47 | 48 | | Variable | Value | 49 | | -------------------------- | ------------------------------------------------------------------------------------------------------ | 50 | | `$tbds-font-sans-serif` | `-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Roboto", "Helvetica", "Arial", sans-serif` | 51 | | `$tbds-font-weight-normal` | `400` | 52 | | `$tbds-font-weight-bold` | `700` | 53 | 54 | ## Breakpoints 55 | 56 | | Breakpoint | Variable | Value | 57 | | ---------- | ------------------------- | ------ | 58 | | `small` | `$tbds-breakpoint-small` | `32em` | 59 | | `medium` | `$tbds-breakpoint-medium` | `50em` | 60 | | `large` | `$tbds-breakpoint-large` | `72em` | 61 | -------------------------------------------------------------------------------- /src/settings/index.scss: -------------------------------------------------------------------------------- 1 | @import "./lib/breakpoints"; 2 | @import "./lib/color"; 3 | @import "./lib/controls"; 4 | @import "./lib/focus"; 5 | @import "./lib/layout"; 6 | @import "./lib/typography"; 7 | 8 | @import "./tools/generate-breakpoint-classes"; 9 | @import "./tools/strip-unit"; 10 | -------------------------------------------------------------------------------- /src/settings/lib/breakpoints.scss: -------------------------------------------------------------------------------- 1 | $tbds-breakpoints: ( 2 | "small": 32em, 3 | "medium": 50em, 4 | "large": 72em, 5 | ) !default; 6 | 7 | $tbds-breakpoint-small: map-get($tbds-breakpoints, "small") !default; 8 | $tbds-breakpoint-medium: map-get($tbds-breakpoints, "medium") !default; 9 | $tbds-breakpoint-large: map-get($tbds-breakpoints, "large") !default; 10 | 11 | @mixin tbds-small { 12 | @media (min-width: #{$tbds-breakpoint-small}) { 13 | @content; 14 | } 15 | } 16 | 17 | @mixin tbds-medium { 18 | @media (min-width: #{$tbds-breakpoint-medium}) { 19 | @content; 20 | } 21 | } 22 | 23 | @mixin tbds-large { 24 | @media (min-width: #{$tbds-breakpoint-large}) { 25 | @content; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/settings/lib/color-palette.scss: -------------------------------------------------------------------------------- 1 | // Changes made here should be reflected in the tbds Figma library: 2 | // https://tbot.io/tbds-figma-library 3 | 4 | $tbds-brand-red: #e03131 !default; 5 | $tbds-brand-gray-dark: #29292c !default; 6 | $tbds-brand-gray-medium: #3d3e44 !default; 7 | $tbds-brand-gray-light: #67676e !default; 8 | $tbds-brand-gray-ultra-light: #f0f0f8 !default; 9 | $tbds-brand-blue: #2e52e4 !default; 10 | $tbds-brand-purple: #6931e0 !default; 11 | $tbds-brand-yellow: #ffc726 !default; 12 | $tbds-brand-yellow-light: #ffe7a3 !default; 13 | -------------------------------------------------------------------------------- /src/settings/lib/color.scss: -------------------------------------------------------------------------------- 1 | @import "color-palette"; 2 | 3 | $tbds-color-text-default: $tbds-brand-gray-dark !default; 4 | $tbds-color-text-link: $tbds-color-text-default !default; 5 | $tbds-color-text-link-hover: $tbds-brand-red !default; 6 | -------------------------------------------------------------------------------- /src/settings/lib/controls.scss: -------------------------------------------------------------------------------- 1 | $tbds-control-block-size: 2.5rem !default; 2 | -------------------------------------------------------------------------------- /src/settings/lib/focus.scss: -------------------------------------------------------------------------------- 1 | $tbds-focus-outline-color: $tbds-brand-blue !default; 2 | $tbds-focus-outline-width: 2px !default; 3 | $tbds-focus-outline: $tbds-focus-outline-width solid $tbds-focus-outline-color !default; 4 | $tbds-focus-outline-offset: 2px !default; 5 | -------------------------------------------------------------------------------- /src/settings/lib/layout.scss: -------------------------------------------------------------------------------- 1 | $tbds-base-space-value: 8px !default; 2 | 3 | $tbds-space-values: ( 4 | "0": 0, 5 | "1": calc($tbds-base-space-value / 2), 6 | "2": $tbds-base-space-value, 7 | "3": calc($tbds-base-space-value * 2), 8 | "4": calc($tbds-base-space-value * 3), 9 | "5": calc($tbds-base-space-value * 4), 10 | "6": calc($tbds-base-space-value * 5), 11 | ) !default; 12 | 13 | $tbds-space-0: map-get($tbds-space-values, "0") !default; 14 | $tbds-space-1: map-get($tbds-space-values, "1") !default; 15 | $tbds-space-2: map-get($tbds-space-values, "2") !default; 16 | $tbds-space-3: map-get($tbds-space-values, "3") !default; 17 | $tbds-space-4: map-get($tbds-space-values, "4") !default; 18 | $tbds-space-5: map-get($tbds-space-values, "5") !default; 19 | $tbds-space-6: map-get($tbds-space-values, "6") !default; 20 | -------------------------------------------------------------------------------- /src/settings/lib/typography.scss: -------------------------------------------------------------------------------- 1 | $tbds-font-sans-serif: ( 2 | -apple-system, 3 | system-ui, 4 | BlinkMacSystemFont, 5 | "Segoe UI", 6 | "Roboto", 7 | "Helvetica", 8 | "Arial", 9 | sans-serif, 10 | ) !default; 11 | 12 | $tbds-font-weight-normal: 400 !default; 13 | $tbds-font-weight-bold: 700 !default; 14 | -------------------------------------------------------------------------------- /src/settings/tools/generate-breakpoint-classes.scss: -------------------------------------------------------------------------------- 1 | @mixin tbds-generate-breakpoint-classes( 2 | $selector, 3 | $property, 4 | $value, 5 | $important: null, 6 | ) { 7 | @if $important { 8 | $important: "!important"; 9 | } 10 | 11 | .#{$selector} { 12 | #{$property}: unquote(#{$value})#{$important}; 13 | } 14 | 15 | @each $breakpoint, $breakpoint-value in $tbds-breakpoints { 16 | @media (min-width: $breakpoint-value) { 17 | .#{$selector}\@#{$breakpoint} { 18 | #{$property}: unquote(#{$value})#{$important}; 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/settings/tools/strip-unit.scss: -------------------------------------------------------------------------------- 1 | @function tbds-strip-unit($value) { 2 | @return (calc($value / ($value * 0 + 1))); 3 | } 4 | -------------------------------------------------------------------------------- /src/skip-link/README.md: -------------------------------------------------------------------------------- 1 | # Skip link 2 | 3 | [View prototype on CodePen][codepen]. 4 | 5 | A skip link allows assistive technology users to bypass content repeated across 6 | multiple pages of a site. It is typically used to skip over primary navigation. 7 | 8 | Ideally, a skip link target should point to the page's first-level heading. 9 | This ensures some assistive technology will not automatically read out the 10 | entire container's contents without being asked to. 11 | 12 | Skip links should also be placed as high up in the document source order as 13 | possible, while still being contained by a landmark element. 14 | 15 | [codepen]: https://codepen.io/thoughtbot/pen/QWLrQzW 16 | 17 | ## Usage 18 | 19 | ### Default 20 | 21 | ```html 22 | 23 | Skip to main content 24 | 25 | ``` 26 | -------------------------------------------------------------------------------- /src/skip-link/index.scss: -------------------------------------------------------------------------------- 1 | @import "../settings/index"; 2 | 3 | @import "./lib/skip-link"; 4 | -------------------------------------------------------------------------------- /src/skip-link/lib/skip-link.scss: -------------------------------------------------------------------------------- 1 | $_tbds-skip-link-background-color: $tbds-brand-red !default; 2 | $_tbds-skip-link-border: 0 !default; 3 | $_tbds-skip-link-border-radius: 5px !default; 4 | $_tbds-skip-link-font-family: $tbds-font-sans-serif !default; 5 | $_tbds-skip-link-font-size: 16px !default; 6 | $_tbds-skip-link-font-weight: $tbds-font-weight-bold !default; 7 | $_tbds-skip-link-text-color: #fff !default; 8 | $_tbds-skip-link-x-offset: 1em !default; 9 | $_tbds-skip-link-y-offset: 1em !default; 10 | 11 | .tbds-skip-link { 12 | border: 0; 13 | clip: rect(0 0 0 0); 14 | height: auto; 15 | margin: 0; 16 | overflow: hidden; 17 | padding: 0; 18 | position: absolute; 19 | white-space: nowrap; 20 | width: 1px; 21 | 22 | &:active, 23 | &:focus { 24 | background-color: $_tbds-skip-link-background-color; 25 | border: $_tbds-skip-link-border; 26 | border-radius: $_tbds-skip-link-border-radius; 27 | clip: initial; 28 | color: $_tbds-skip-link-text-color; 29 | font-family: $_tbds-skip-link-font-family; 30 | font-size: $_tbds-skip-link-font-size; 31 | font-weight: $_tbds-skip-link-font-weight; 32 | height: initial; 33 | // stylelint-disable-next-line csstools/use-logical 34 | left: $_tbds-skip-link-x-offset; 35 | margin: initial; 36 | overflow: hidden; 37 | padding: 0.75em 1.5em; 38 | position: absolute; 39 | top: $_tbds-skip-link-y-offset; 40 | white-space: normal; 41 | width: auto; 42 | 43 | @supports (inset: 1em) { 44 | inset: $_tbds-skip-link-x-offset auto auto $_tbds-skip-link-y-offset; 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/stack/README.md: -------------------------------------------------------------------------------- 1 | # Stacks (block and inline) 2 | 3 | Stacks lay out a set of items with even spacing. There are two stack components: 4 | `tbds-block-stack` and `tbds-inline-stack`. Use `tbds-block-stack` to add equal 5 | space between block elements (a set of items laid out vertically), and use 6 | `tbds-inline-stack` to add equal space between inline-level elements (a set of 7 | items laid out horizontally). 8 | 9 | Both `tbds-block-stack` and `tbds-inline-stack` come with modifier classes to 10 | control the gap size between the items: 11 | 12 | | Gap modifier | Space value | Value | 13 | | ------------ | --------------- | ------ | 14 | | `gap-1` | `$tbds-space-1` | `4px` | 15 | | `gap-2` | `$tbds-space-2` | `8px` | 16 | | `gap-3` | `$tbds-space-3` | `16px` | 17 | | `gap-4` | `$tbds-space-4` | `24px` | 18 | | `gap-5` | `$tbds-space-5` | `32px` | 19 | | `gap-6` | `$tbds-space-6` | `40px` | 20 | 21 | View prototypes on CodePen: 22 | 23 | - [Block stack][codepen-block-stack] 24 | - [Inline stack][codepen-inline-stack] 25 | 26 | [codepen-block-stack]: https://codepen.io/thoughtbot/pen/axMzEa 27 | [codepen-inline-stack]: https://codepen.io/thoughtbot/pen/MRxYGO 28 | 29 | ## Usage 30 | 31 | ### Block stack 32 | 33 | ```html 34 |
35 |
36 | Item 37 |
38 | 39 |
40 | Item 41 |
42 |
43 | ``` 44 | 45 | ### Block stack, gap 2 46 | 47 | ```html 48 |
49 |
50 | Item 51 |
52 | 53 |
54 | Item 55 |
56 |
57 | ``` 58 | 59 | ### Block stack, bordered 60 | 61 | ```html 62 |
63 |
64 | Item 65 |
66 | 67 |
68 | Item 69 |
70 |
71 | ``` 72 | 73 | ### Inline stack 74 | 75 | ```html 76 |
77 |
78 | Item 79 |
80 | 81 |
82 | Item 83 |
84 |
85 | ``` 86 | 87 | ### Inline stack, gap 2 88 | 89 | ```html 90 |
91 |
92 | Item 93 |
94 | 95 |
96 | Item 97 |
98 |
99 | ``` 100 | 101 | ### Inline stack, item pushes to right 102 | 103 | ```html 104 |
105 |
106 | Item 107 |
108 | 109 |
110 | Item 111 |
112 |
113 | ``` 114 | -------------------------------------------------------------------------------- /src/stack/index.scss: -------------------------------------------------------------------------------- 1 | @import "../settings/index"; 2 | 3 | @import "./lib/block-stack"; 4 | @import "./lib/inline-stack"; 5 | -------------------------------------------------------------------------------- /src/stack/lib/block-stack.scss: -------------------------------------------------------------------------------- 1 | $_tbds-block-stack-border: 1px solid #bbb !default; 2 | 3 | .tbds-block-stack { 4 | --tbds-block-stack-gap: #{$tbds-space-2}; 5 | } 6 | 7 | .tbds-block-stack--gap-1 { 8 | --tbds-block-stack-gap: #{$tbds-space-1}; 9 | } 10 | 11 | .tbds-block-stack--gap-2 { 12 | --tbds-block-stack-gap: #{$tbds-space-2}; 13 | } 14 | 15 | .tbds-block-stack--gap-3 { 16 | --tbds-block-stack-gap: #{$tbds-space-3}; 17 | } 18 | 19 | .tbds-block-stack--gap-4 { 20 | --tbds-block-stack-gap: #{$tbds-space-4}; 21 | } 22 | 23 | .tbds-block-stack--gap-5 { 24 | --tbds-block-stack-gap: #{$tbds-space-5}; 25 | } 26 | 27 | .tbds-block-stack--gap-6 { 28 | --tbds-block-stack-gap: #{$tbds-space-6}; 29 | } 30 | 31 | .tbds-block-stack__item:not(:last-child) { 32 | margin-block-end: calc(var(--tbds-block-stack-gap) / 2); 33 | padding-block-end: calc(var(--tbds-block-stack-gap) / 2); 34 | } 35 | 36 | .tbds-block-stack--bordered { 37 | .tbds-block-stack__item:not(:last-child) { 38 | border-block-end: $_tbds-block-stack-border; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/stack/lib/inline-stack.scss: -------------------------------------------------------------------------------- 1 | .tbds-inline-stack { 2 | --tbds-inline-stack-gap: #{$tbds-space-2}; 3 | 4 | align-items: center; 5 | display: flex; 6 | } 7 | 8 | .tbds-inline-stack--gap-1 { 9 | --tbds-inline-stack-gap: #{$tbds-space-1}; 10 | } 11 | 12 | .tbds-inline-stack--gap-2 { 13 | --tbds-inline-stack-gap: #{$tbds-space-2}; 14 | } 15 | 16 | .tbds-inline-stack--gap-3 { 17 | --tbds-inline-stack-gap: #{$tbds-space-3}; 18 | } 19 | 20 | .tbds-inline-stack--gap-4 { 21 | --tbds-inline-stack-gap: #{$tbds-space-4}; 22 | } 23 | 24 | .tbds-inline-stack--gap-5 { 25 | --tbds-inline-stack-gap: #{$tbds-space-5}; 26 | } 27 | 28 | .tbds-inline-stack--gap-6 { 29 | --tbds-inline-stack-gap: #{$tbds-space-6}; 30 | } 31 | 32 | .tbds-inline-stack__item:not(:last-child) { 33 | margin-inline-end: calc(var(--tbds-inline-stack-gap) / 2); 34 | padding-inline-end: calc(var(--tbds-inline-stack-gap) / 2); 35 | } 36 | 37 | .tbds-inline-stack__item--push-start { 38 | margin-inline-start: auto; 39 | } 40 | -------------------------------------------------------------------------------- /src/utilities/README.md: -------------------------------------------------------------------------------- 1 | # Utilities 2 | 3 | ## Usage 4 | 5 | ### Margin 6 | 7 | Margin utilities are based on the global spacing scale and available 8 | for each of these margin properties: 9 | 10 | - `margin-block-start` 11 | - `margin-inline-end` 12 | - `margin-block-end` 13 | - `margin-inline-start` 14 | - `margin-block` 15 | - `margin-inline` 16 | 17 | ```html 18 |
19 | Some content 20 |
21 | ``` 22 | 23 | #### Breakpoint variants 24 | 25 | Margin utilities can also be used to set `margin` at specific breakpoints. 26 | Each variant's styles are applied at the breakpoint and up (using a 27 | `min-width` media query). 28 | 29 | ```html 30 |
31 | Some content 32 |
33 | ``` 34 | 35 | #### `auto` 36 | 37 | The `auto` keyword value is also available as utility classes for the margin 38 | properties above. Note that breakpoint variants are not supported in 39 | this context. 40 | 41 | ```html 42 |
43 | Some content 44 |
45 | ``` 46 | 47 | ### Padding 48 | 49 | Padding utilities are based on the global spacing scale and available 50 | for each of these padding properties: 51 | 52 | - `padding-block-start` 53 | - `padding-inline-end` 54 | - `padding-block-end` 55 | - `padding-inline-start` 56 | - `padding-block` 57 | - `padding-inline` 58 | 59 | ```html 60 |
61 | Some content 62 |
63 | ``` 64 | 65 | #### Breakpoint variants 66 | 67 | Padding utilities can also be used to set `padding` at specific breakpoints. 68 | Each variant's styles are applied at the breakpoint and up (using a 69 | `min-width` media query). 70 | 71 | ```html 72 |
73 | Some content 74 |
75 | ``` 76 | 77 | ### Inline size utilities 78 | 79 | Inline size utilities can be used to set the `inline-size` on element, and are 80 | available with the following values (quarters, thirds, and fifths): 81 | 82 | - `20%` 83 | - `25%` 84 | - `33.3333%` 85 | - `40%` 86 | - `50%` 87 | - `60%` 88 | - `66.6666%` 89 | - `75%` 90 | - `80%` 91 | - `100%` 92 | 93 | ```html 94 |
95 | Some content 96 |
97 | ``` 98 | 99 | #### Breakpoint variants 100 | 101 | Inline size utilities can also be used to set `inline-size` at specific 102 | breakpoints. Each variant's styles are applied at the breakpoint and up (using 103 | a `min-width` media query). 104 | 105 | ```html 106 |
107 | Some content 108 |
109 | ``` 110 | 111 | ### Font weight 112 | 113 | ```html 114 |

115 | Set text in normal weight 116 |

117 | ``` 118 | 119 | ```html 120 |

121 | Set text in bold weight 122 |

123 | ``` 124 | 125 | ### Font style 126 | 127 | ```html 128 |

129 | Style text normal 130 |

131 | ``` 132 | 133 | ```html 134 |

135 | Style text italicized 136 |

137 | ``` 138 | 139 | ### Text align 140 | 141 | ```html 142 |

143 | Align text to the end of the content flow 144 |

145 | ``` 146 | 147 | ```html 148 |

149 | Align text to the start of the content flow 150 |

151 | ``` 152 | 153 | ```html 154 |

155 | Center-align text 156 |

157 | ``` 158 | 159 | #### Breakpoint variants 160 | 161 | Text align utilities can also be used to set styles at specific breakpoints. 162 | Each variant's styles are applied at the breakpoint and up (using a 163 | `min-width` media query). 164 | 165 | ```html 166 |
167 | Some content 168 |
169 | ``` 170 | 171 | ### Line height 172 | 173 | Set `line-height` to `0` to remove extra space from elements that inherit 174 | `line-height` but don't contain any text. 175 | 176 | ```html 177 |
178 | 179 |
180 | ``` 181 | -------------------------------------------------------------------------------- /src/utilities/index.scss: -------------------------------------------------------------------------------- 1 | @import "../settings/index"; 2 | 3 | @import "./lib/font-style"; 4 | @import "./lib/font-weight"; 5 | @import "./lib/inline-size"; 6 | @import "./lib/line-height"; 7 | @import "./lib/margin"; 8 | @import "./lib/padding"; 9 | @import "./lib/text-align"; 10 | -------------------------------------------------------------------------------- /src/utilities/lib/font-style.scss: -------------------------------------------------------------------------------- 1 | .tbds-font-style-normal { 2 | // stylelint-disable-next-line declaration-no-important 3 | font-style: normal !important; 4 | } 5 | 6 | .tbds-font-style-italic { 7 | // stylelint-disable-next-line declaration-no-important 8 | font-style: italic !important; 9 | } 10 | -------------------------------------------------------------------------------- /src/utilities/lib/font-weight.scss: -------------------------------------------------------------------------------- 1 | .tbds-font-weight-normal { 2 | // stylelint-disable-next-line declaration-no-important 3 | font-weight: $tbds-font-weight-normal !important; 4 | } 5 | 6 | .tbds-font-weight-bold { 7 | // stylelint-disable-next-line declaration-no-important 8 | font-weight: $tbds-font-weight-bold !important; 9 | } 10 | -------------------------------------------------------------------------------- /src/utilities/lib/inline-size.scss: -------------------------------------------------------------------------------- 1 | $tbds-inline-size-lengths: ( 2 | 20%, 3 | 25%, 4 | 33.3333%, 5 | 40%, 6 | 50%, 7 | 60%, 8 | 66.6666%, 9 | 75%, 10 | 80%, 11 | 100%, 12 | ) !default; 13 | 14 | @each $length in $tbds-inline-size-lengths { 15 | $rounded-unitless-length: round(strip-unit.strip($length)); 16 | $percent-sign: \0025; 17 | 18 | @include tbds-generate-breakpoint-classes( 19 | $selector: "tbds-inline-size-" + $rounded-unitless-length + $percent-sign, 20 | $property: "inline-size", 21 | $value: $length, 22 | $important: true, 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /src/utilities/lib/line-height.scss: -------------------------------------------------------------------------------- 1 | .tbds-line-height-0 { 2 | // stylelint-disable-next-line declaration-no-important 3 | line-height: 0 !important; 4 | } 5 | -------------------------------------------------------------------------------- /src/utilities/lib/margin.scss: -------------------------------------------------------------------------------- 1 | $_tbds-margin-properties: ( 2 | "margin-block", 3 | "margin-block-end", 4 | "margin-block-start", 5 | "margin-inline", 6 | "margin-inline-end", 7 | "margin-inline-start", 8 | ) !default; 9 | 10 | @each $margin-property in $_tbds-margin-properties { 11 | @each $space-increment, $space-value in $tbds-space-values { 12 | @include tbds-generate-breakpoint-classes( 13 | $selector: "tbds-" + $margin-property + "-" + $space-increment, 14 | $property: $margin-property, 15 | $value: $space-value, 16 | $important: true, 17 | ); 18 | } 19 | } 20 | 21 | @each $margin-property in $_tbds-margin-properties { 22 | .tbds-#{$margin-property}-auto { 23 | // stylelint-disable-next-line declaration-no-important 24 | #{$margin-property}: auto !important; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/utilities/lib/padding.scss: -------------------------------------------------------------------------------- 1 | $_tbds-padding-properties: ( 2 | "padding-block", 3 | "padding-block-end", 4 | "padding-block-start", 5 | "padding-inline", 6 | "padding-inline-end", 7 | "padding-inline-start", 8 | ) !default; 9 | 10 | @each $padding-property in $_tbds-padding-properties { 11 | @each $space-increment, $space-value in $tbds-space-values { 12 | @include tbds-generate-breakpoint-classes( 13 | $selector: "tbds-" + $padding-property + "-" + $space-increment, 14 | $property: $padding-property, 15 | $value: $space-value, 16 | $important: true, 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/utilities/lib/text-align.scss: -------------------------------------------------------------------------------- 1 | $_tbds-text-align-values: ( 2 | "start", 3 | "center", 4 | "end", 5 | ) !default; 6 | 7 | @each $text-align-value in $_tbds-text-align-values { 8 | @include tbds-generate-breakpoint-classes( 9 | $selector: "tbds-text-align-" + $text-align-value, 10 | $property: "text-align", 11 | $value: $text-align-value, 12 | $important: true, 13 | ); 14 | } 15 | --------------------------------------------------------------------------------