├── .github ├── FUNDING.yml └── workflows │ └── nodejs.yml ├── .gitignore ├── .npmignore ├── CONTRIBUTORS.md ├── LICENSE ├── README.md ├── code-gen.js ├── demo ├── .gitignore ├── elm.json ├── index.html ├── main.css ├── package.json ├── postcss.config.js ├── src │ └── Main.elm ├── tailwind.config.js └── yarn.lock ├── index.js ├── options.js ├── package.json ├── test └── tests.js └── yarn.lock /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | 2 | 3 | github: [monty5811]# Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | -------------------------------------------------------------------------------- /.github/workflows/nodejs.yml: -------------------------------------------------------------------------------- 1 | name: Node CI 2 | 3 | on: # rebuild any PRs and main branch changes 4 | pull_request: 5 | push: 6 | branches: 7 | - master 8 | 9 | jobs: 10 | test: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | strategy: 15 | matrix: 16 | node-version: [12.x, 14.x] 17 | 18 | steps: 19 | - uses: actions/checkout@v2 20 | - name: Use Node.js ${{ matrix.node-version }} 21 | uses: actions/setup-node@v1 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | - name: yarn install and test 25 | run: | 26 | cd demo 27 | yarn 28 | cd .. 29 | yarn 30 | yarn test 31 | env: 32 | CI: true 33 | 34 | elm-format: 35 | runs-on: ubuntu-latest 36 | 37 | strategy: 38 | matrix: 39 | node-version: [12.x, 14.x] 40 | 41 | steps: 42 | - uses: actions/checkout@v2 43 | - name: Use Node.js ${{ matrix.node-version }} 44 | uses: actions/setup-node@v1 45 | with: 46 | node-version: ${{ matrix.node-version }} 47 | - name: Install module dependencies 48 | run: yarn install --frozen-lockfile --production 49 | - name: Install demo dependencies 50 | working-directory: demo 51 | run: yarn 52 | - name: Build elm files 53 | working-directory: demo 54 | run: yarn build 55 | - name: validate with elm-format 56 | working-directory: demo 57 | run: yarn check-format 58 | 59 | build-demo: 60 | runs-on: ubuntu-latest 61 | 62 | strategy: 63 | matrix: 64 | node-version: [12.x, 14.x] 65 | 66 | steps: 67 | - uses: actions/checkout@v2 68 | - name: Use Node.js ${{ matrix.node-version }} 69 | uses: actions/setup-node@v1 70 | with: 71 | node-version: ${{ matrix.node-version }} 72 | - name: Install module dependencies 73 | run: yarn install --frozen-lockfile --production 74 | - name: Check demo site builds 75 | working-directory: demo 76 | run: | 77 | yarn install --frozen-lockfile --production 78 | yarn run build-prod 79 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | demo/src/TLWND.elm 2 | demo/src/TLWND/*.elm 3 | node_modules/ 4 | npm-debug.log 5 | yarn-error.log 6 | docs.json 7 | elm-stuff/ 8 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | yarn-error.log 2 | yarn.lock 3 | demo/ 4 | node_modules/ 5 | src/ 6 | docs.json 7 | elm-stuff/ 8 | -------------------------------------------------------------------------------- /CONTRIBUTORS.md: -------------------------------------------------------------------------------- 1 | postcss-elm-tailwind contributors (sorted alphabetically) 2 | ============================================ 3 | 4 | * **[Dean Montgomery](https://github.com/monty5811)** 5 | 6 | * **[Nhan Thai](https://github.com/dandoh)** 7 | 8 | * **[Phill Sparks](https://github.com/sparksp)** 9 | 10 | * **[Steven Vandevelde](https://github.com/icidasset)** 11 | 12 | 13 | [Full contributors list](https://github.com/monty5811/postcss-elm-tailwind/graphs/contributors). 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright 2019 Dean Montgomery 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # postcss-elm-tailwind 2 | 3 | [tailwind](https://tailwindcss.com) + [elm](http://elm-lang.org) = :rocket: 4 | 5 | See the [demo](https://postcss-elm-tailwind-demo.onrender.com/) and [repo](https://github.com/monty5811/postcss-elm-tailwind/tree/master/demo). 6 | 7 | [![Actions Status](https://github.com/monty5811/postcss-elm-tailwind/workflows/Node%20CI/badge.svg)](https://github.com/monty5811/postcss-elm-tailwind/actions) 8 | 9 | ```elm 10 | view : Model -> Html Msg 11 | view model = 12 | Html.div [ TW.h_screen, TW.w_screen, TW.flex, TW.justify_center, TW.items_center, TW.bg_gray_200 ] 13 | [ Html.div [] 14 | [ Html.button 15 | [ E.onClick Decrement 16 | , TW.px_2 17 | , TW.px_4 18 | , TW.text_white 19 | , TW.bg_blue_500 20 | , TW.w_full 21 | ] 22 | [ Html.text "-" ] 23 | , Html.div 24 | [ TW.text_2xl 25 | , TW.text_center 26 | , TW.my_4 27 | ] 28 | [ Html.text (String.fromInt model) ] 29 | , Html.button 30 | [ E.onClick Increment 31 | , TW.px_2 32 | , TW.px_4 33 | , TW.text_white 34 | , TW.bg_blue_500 35 | , TW.w_full 36 | ] 37 | [ Html.text "+" ] 38 | ] 39 | ] 40 | ``` 41 | 42 | ## Installation 43 | 44 | ``` 45 | yarn add postcss-elm-tailwind --dev 46 | 47 | # OR 48 | 49 | npm i -D postcss-elm-tailwind 50 | ``` 51 | 52 | ## Usage 53 | 54 | ```js 55 | module.exports = { 56 | plugins: [ 57 | require("tailwindcss"), 58 | require("postcss-elm-tailwind")({ 59 | tailwindConfig: "./tailwind.config.js", // tell us where your tailwind.config.js lives 60 | // only the tailwindConfig key is required, the rest are optional: 61 | elmFile: "src/Tailwind.elm", // change where the generated Elm module is saved 62 | elmModuleName: "Tailwind", // this must match the file name or Elm will complain 63 | nameStyle: "snake", // "snake" for snake case, "camel" for camel case 64 | splitByScreens: true // generate an Elm module for each screen 65 | }) 66 | ] 67 | }; 68 | ``` 69 | 70 | See the [demo](https://github.com/monty5811/postcss-elm-tailwind/tree/master/demo) for a full example. 71 | 72 | ### Other output formats 73 | 74 | #### SVG 75 | 76 | If you want to use Tailwind classes to style `SVG` you can output an `Svg` module like this: 77 | 78 | ```js 79 | module.exports = { 80 | plugins: [ 81 | require("tailwindcss"), 82 | require("postcss-elm-tailwind")({ 83 | tailwindConfig: "./tailwind.config.js", 84 | elmFile: "src/Tailwind.elm", 85 | elmModuleName: "Tailwind", 86 | formats: { 87 | svg: { 88 | elmFile: "src/Tailwind/Svg.elm", 89 | elmModuleName: "Tailwind.Svg" 90 | } 91 | } 92 | }) 93 | ] 94 | }; 95 | ``` 96 | 97 | #### String 98 | 99 | If you want access to the class names themselves, you can output a `String` module as an escape hatch: 100 | 101 | ```js 102 | module.exports = { 103 | plugins: [ 104 | require("tailwindcss"), 105 | require("postcss-elm-tailwind")({ 106 | tailwindConfig: "./tailwind.config.js", 107 | elmFile: "src/Tailwind.elm", 108 | elmModuleName: "Tailwind", 109 | formats: { 110 | string: { 111 | elmFile: "src/Tailwind/String.elm", 112 | elmModuleName: "Tailwind.String" 113 | } 114 | } 115 | }) 116 | ] 117 | }; 118 | ``` 119 | 120 | ## Other things to note 121 | 122 | In order to get a small build, you'll need to build Tailwind twice - once 123 | without purgecss to build `TW.elm` with all the classes and once with purgecss 124 | so that all the unused classes are removed from your production CSS. 125 | See how this is implemented in the [demo](https://github.com/monty5811/postcss-elm-tailwind/blob/master/demo/package.json#L22). 126 | -------------------------------------------------------------------------------- /code-gen.js: -------------------------------------------------------------------------------- 1 | function elmBodyHtml(elmModuleName, classes) { 2 | return elmHeaderHtml(elmModuleName, classes) + 3 | elmBody({ type: "Html.Attribute msg", fn: "A.class " }, classes); 4 | } 5 | 6 | function elmBodyString(elmModuleName, classes) { 7 | return elmHeaderString(elmModuleName, classes) + 8 | elmBody({ type: "String", fn: "" }, classes); 9 | } 10 | 11 | function elmBodySvg(elmModuleName, classes) { 12 | return elmHeaderSvg(elmModuleName, classes) + 13 | elmBody({ type: "Svg.Attribute msg", fn: "A.class " }, classes); 14 | } 15 | 16 | function elmHeaderExports(elmFns, includeClassList) { 17 | let tmp = Array.from(elmFns.values()).map(o => o.elm); 18 | if (includeClassList) { 19 | tmp.push("classList"); 20 | } 21 | tmp.sort(); 22 | return tmp.join("\n , "); 23 | } 24 | 25 | function elmHeaderHtml(elmModuleName, elmFns) { 26 | l = elmHeaderExports(elmFns, true); 27 | 28 | return `module ${elmModuleName} exposing 29 | ( ${l} 30 | ) 31 | 32 | import Html 33 | import Html.Attributes as A 34 | 35 | 36 | classList : List ( Html.Attribute msg, Bool ) -> List (Html.Attribute msg) 37 | classList classes = 38 | List.map Tuple.first <| List.filter Tuple.second classes 39 | `; 40 | } 41 | 42 | function elmHeaderSvg(elmModuleName, elmFns) { 43 | l = elmHeaderExports(elmFns, true); 44 | 45 | return `module ${elmModuleName} exposing 46 | ( ${l} 47 | ) 48 | 49 | import Svg 50 | import Svg.Attributes as A 51 | 52 | 53 | classList : List ( Svg.Attribute msg, Bool ) -> List (Svg.Attribute msg) 54 | classList classes = 55 | List.map Tuple.first <| List.filter Tuple.second classes 56 | `; 57 | } 58 | 59 | function elmHeaderString(elmModuleName, elmFns) { 60 | l = elmHeaderExports(elmFns, false); 61 | 62 | return `module ${elmModuleName} exposing 63 | ( ${l} 64 | ) 65 | `; 66 | } 67 | 68 | function elmBody(config, classes) { 69 | let body = ""; 70 | for (let [cls, {elm}] of classes) { 71 | body = body + elmFunction(config, { cls, elm }); 72 | } 73 | return body; 74 | } 75 | 76 | function elmFunction(config, { cls, elm }) { 77 | return ` 78 | 79 | ${elm} : ${config.type} 80 | ${elm} = 81 | ${config.fn}"${cls}" 82 | `; 83 | } 84 | 85 | // parse, clean up stuff 86 | 87 | function fixClass(cls) { 88 | // remove the dot 89 | cls = cls.replace(/^(\.)/, ""); 90 | // make other dots safe 91 | cls = cls.replace(/\\\./g, "."); 92 | // remove > anything 93 | cls = cls.replace(/\s?>\s?.*/, ""); 94 | // remove pseudo-elements (::) 95 | cls = cls.replace(/::.*$/, ""); 96 | // remove not pseudo-classes (:not()) 97 | cls = cls.replace(/:not\([^\)]*\)/g, ""); 98 | // remove pseudo-classes (:) 99 | cls = cls.replace( 100 | /(:(active|after|before|checked|disabled|focus|focus-within|hover|visited|nth-child\((even|odd)\)|(first|last)-child))+$/, 101 | "" 102 | ); 103 | // make \3 safe for elm 104 | cls = cls.replace(/\\3/g, "\\\\3"); 105 | // make / safe for elm 106 | cls = cls.replace(/\\\//g, "/"); 107 | // make \/ safe for elm 108 | cls = cls.replace(/\\([/])/g, "\\\\$1"); 109 | // make \: safe for elm 110 | cls = cls.replace(/\\([:])/g, "$1"); 111 | return cls; 112 | } 113 | 114 | function toScreen(cls, opts) { 115 | let screen = null; 116 | for (let index = 0; index < opts.screens.length; index++) { 117 | const currentScreen = opts.screens[index]; 118 | if (cls.includes(`${currentScreen}:`)) { 119 | screen = currentScreen; 120 | } 121 | } 122 | return screen; 123 | } 124 | 125 | function toElmName(cls, opts) { 126 | var elm = cls; 127 | // handle negative with prefix 128 | if (opts.prefix) { 129 | let re_neg_with_prefix = new RegExp(`(${opts.prefix})-([a-z])`); 130 | elm = elm.replace(re_neg_with_prefix, "$1neg_$2"); 131 | } 132 | // handle negative at start of string 133 | elm = elm.replace(/^-([a-z])/, "_neg_$1"); 134 | // handle negative with variant 135 | elm = elm.replace(/:-([a-z])/, "__neg_$1"); 136 | // replace dashes now we have sorted the negative stuff 137 | elm = elm.replace(/-/g, "_"); 138 | // replace : 139 | elm = elm.replace(/:/g, "__"); 140 | // handle fractions 141 | elm = elm.replace(/\//g, "over"); 142 | // handle escaping chars \3 143 | elm = elm.replace(/\\\\3/g, "") 144 | // clean up 145 | elm = elm.replace(/\\__/g, "_"); 146 | elm = elm.replace(/^_/g, ""); 147 | // handle :nth-child(even), etc 148 | elm = elm.replace(/_nth_child\(.+\)/, ""); 149 | elm = elm.replace(/_(last|first)_child/, ""); 150 | // replace any other dots 151 | if (opts.nameStyle === "camel") { 152 | elm = elm.replace(/\./g, "Dot"); 153 | } else { 154 | elm = elm.replace(/\./g, "_dot_"); 155 | } 156 | // remove screens prefix 157 | if (opts.splitByScreens) { 158 | const screens_re = RegExp(`(${opts.screens.join("|")})__`); 159 | elm = elm.replace(screens_re, ''); 160 | } 161 | // convert to camel case 162 | if (opts.nameStyle === "camel") { 163 | elm = elm.replace(/(_+\w)/g, (g) => g.replace(/_/g, "").toUpperCase()); 164 | } 165 | return elm; 166 | } 167 | 168 | exports.elmBodyHtml = elmBodyHtml; 169 | exports.elmBodyString = elmBodyString; 170 | exports.elmBodySvg = elmBodySvg; 171 | exports.elmFunction = elmFunction; 172 | exports.fixClass = fixClass; 173 | exports.toElmName = toElmName; 174 | exports.toScreen = toScreen; 175 | -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | elm-stuff/ 3 | src/TW.elm 4 | src/TLWND.elm 5 | src/TLWND/ -------------------------------------------------------------------------------- /demo/elm.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "application", 3 | "source-directories": [ 4 | "src" 5 | ], 6 | "elm-version": "0.19.1", 7 | "dependencies": { 8 | "direct": { 9 | "elm/browser": "1.0.1", 10 | "elm/core": "1.0.2", 11 | "elm/html": "1.0.0", 12 | "elm/svg": "1.0.1" 13 | }, 14 | "indirect": { 15 | "elm/json": "1.1.3", 16 | "elm/time": "1.0.0", 17 | "elm/url": "1.0.0", 18 | "elm/virtual-dom": "1.0.2" 19 | } 20 | }, 21 | "test-dependencies": { 22 | "direct": {}, 23 | "indirect": {} 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 16 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /demo/main.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | 3 | @tailwind components; 4 | 5 | @tailwind utilities; 6 | 7 | 8 | /* purgecss end ignore */ 9 | 10 | .test\.with\.a\.dot { 11 | /* here to test classes with "." in them */ 12 | cursor: pointer; 13 | } 14 | 15 | /* test font awesome stuff */ 16 | /*! 17 | * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com 18 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 19 | */ 20 | .fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} 21 | -------------------------------------------------------------------------------- /demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "postcss-elm-tailwind-demo", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "@tailwindcss/forms": "^0.3.3", 8 | "autoprefixer": "^10.3.3", 9 | "elm": "^0.19.1-2", 10 | "elm-format": "0.8.3", 11 | "postcss": "^8.3.6", 12 | "postcss-cli": "^8.0.0", 13 | "purgecss": "^2.2.1", 14 | "tailwindcss": "^2.2.9" 15 | }, 16 | "scripts": { 17 | "copy-index": "cp index.html dist/", 18 | "build-elm": "elm make src/Main.elm --output=dist/app.js --optimize", 19 | "build-tw": "postcss -o dist/main.css main.css", 20 | "build": "yarn build-tw && yarn build-elm && yarn copy-index", 21 | "build-prod": "yarn build-tw && yarn build-elm && NODE_ENV=production yarn build-tw && yarn copy-index", 22 | "check-format": "elm-format src/**/*.elm --validate" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /demo/postcss.config.js: -------------------------------------------------------------------------------- 1 | const process = require("process"); 2 | const postcssElmTailwind = require("../index.js")({ 3 | tailwindConfig: "./tailwind.config.js", 4 | elmFile: "src/TLWND.elm", 5 | elmModuleName: "TLWND", 6 | formats: { 7 | svg: { 8 | elmFile: "src/TLWND/Svg.elm", 9 | elmModuleName: "TLWND.Svg" 10 | }, 11 | string: { 12 | elmFile: "src/TLWND/String.elm", 13 | elmModuleName: "TLWND.String" 14 | } 15 | } 16 | }); 17 | 18 | module.exports = { 19 | plugins: [ 20 | require("tailwindcss"), 21 | ...(process.env.NODE_ENV === "production" ? [] : [postcssElmTailwind]), 22 | require("autoprefixer") 23 | ] 24 | }; 25 | -------------------------------------------------------------------------------- /demo/src/Main.elm: -------------------------------------------------------------------------------- 1 | module Main exposing (main) 2 | 3 | import Browser exposing (sandbox) 4 | import Html exposing (Html) 5 | import Html.Attributes as A 6 | import Html.Events as E 7 | import TLWND as TW 8 | import TLWND.LG as TW_lg 9 | -- here to make sure we compile the other formats: 10 | import TLWND.Svg 11 | import TLWND.String 12 | import TLWND.XL 13 | import TLWND.XXL 14 | 15 | 16 | 17 | -- MAIN 18 | 19 | 20 | main : Program () Model Msg 21 | main = 22 | Browser.sandbox { init = init, update = update, view = view } 23 | 24 | 25 | 26 | -- MODEL 27 | 28 | 29 | type alias Model = 30 | { current : Int 31 | , history : List Int 32 | } 33 | 34 | 35 | init : Model 36 | init = 37 | { current = 0 38 | , history = [] 39 | } 40 | 41 | 42 | 43 | -- UPDATE 44 | 45 | 46 | type Msg 47 | = Increment 48 | | Decrement 49 | 50 | 51 | update : Msg -> Model -> Model 52 | update msg model = 53 | case msg of 54 | Increment -> 55 | updateModel (model.current + 1) model 56 | 57 | Decrement -> 58 | updateModel (model.current - 1) model 59 | 60 | 61 | updateModel : Int -> Model -> Model 62 | updateModel newVal model = 63 | { model | current = newVal, history = newVal :: model.history } 64 | 65 | 66 | 67 | -- VIEW 68 | 69 | 70 | view : Model -> Html Msg 71 | view model = 72 | Html.div 73 | [ TW.tw_text_gray_900 74 | , TW.tw_max_w_3xl 75 | , TW.tw_w_full 76 | , TW.tw_mx_auto 77 | , TW.tw_px_6 78 | , TW.tw_py_12 79 | ] 80 | [ Html.h1 81 | [ TW.tw_text_2xl 82 | , TW.tw_font_normal 83 | , TW.tw_mb_2 84 | ] 85 | [ Html.text "Demo: postcss-elm-tailwind" 86 | ] 87 | , Html.div [ TW.tw_text_gray_700 ] 88 | [ Html.a 89 | [ A.href "https://github.com/monty5811/postcss-elm-tailwind" 90 | , TW.hover__tw_underline 91 | ] 92 | [ Html.text "github" ] 93 | , Html.span [] [ Html.text " | " ] 94 | , Html.a 95 | [ A.href "https://github.com/monty5811/postcss-elm-tailwind/tree/master/demo" 96 | , TW.hover__tw_underline 97 | ] 98 | [ Html.text "source" ] 99 | ] 100 | , Html.hr [ TW.tw_my_8 ] [] 101 | , Html.div [] 102 | [ Html.h2 103 | [ TW.tw_text_xl 104 | , TW.tw_font_normal 105 | , TW.tw_mb_4 106 | ] 107 | [ Html.text "Form" ] 108 | , Html.label [ TW.tw_block ] 109 | [ Html.span [ TW.tw_text_gray_700 ] [ Html.text "Name" ] 110 | , Html.input 111 | [ TW.tw_mt_1, TW.tw_block, TW.tw_w_full, TW.tw_border_gray_300, TW.tw_rounded_md, TW.focus__tw_border_blue_300, TW.focus__tw_ring, TW.focus__tw_ring_blue_200, TW.focus__tw_ring_opacity_50, A.placeholder "Jane Doe", A.type_ "text" ] 112 | [] 113 | ] 114 | , Html.div [ TW.tw_mt_4 ] 115 | [ Html.span [ TW.tw_text_gray_700 ] [ Html.text "Account Type" ] 116 | , Html.div [ TW.tw_mt_2 ] 117 | [ Html.label [ TW.tw_inline_flex, TW.tw_items_center ] 118 | [ Html.input [ A.type_ "radio", TW.tw_border_gray_300, TW.focus__tw_border_blue_300, TW.focus__tw_ring, TW.focus__tw_ring_blue_200, TW.focus__tw_ring_opacity_50, TW.focus__tw_ring_offset_0, A.name "accountType", A.value "personal" ] [] 119 | , Html.span [ TW.tw_ml_2 ] [ Html.text "Personal" ] 120 | ] 121 | , Html.label [ TW.tw_inline_flex, TW.tw_items_center, TW.tw_ml_6 ] 122 | [ Html.input [ A.type_ "radio", TW.tw_border_gray_300, TW.focus__tw_border_blue_300, TW.focus__tw_ring, TW.focus__tw_ring_blue_200, TW.focus__tw_ring_opacity_50, TW.focus__tw_ring_offset_0, A.name "accountType", A.value "business" ] [] 123 | , Html.span [ TW.tw_ml_2 ] [ Html.text "Business" ] 124 | ] 125 | ] 126 | ] 127 | , Html.label [ TW.tw_block, TW.tw_mt_4 ] 128 | [ Html.span [ TW.tw_text_gray_700 ] [ Html.text "Requested Limit" ] 129 | , Html.select [ TW.tw_mt_1, TW.tw_block, TW.tw_w_full, TW.tw_border_gray_300, TW.tw_rounded_md, TW.focus__tw_border_blue_300, TW.focus__tw_ring, TW.focus__tw_ring_blue_200, TW.focus__tw_ring_opacity_50] 130 | [ Html.option [] [ Html.text "$1,000" ] 131 | , Html.option [] [ Html.text "$5,000" ] 132 | , Html.option [] [ Html.text "$10,000" ] 133 | , Html.option [] [ Html.text "$25,000" ] 134 | ] 135 | ] 136 | , Html.div [ TW.tw_flex, TW.tw_mt_6 ] 137 | [ Html.label [ TW.tw_flex, TW.tw_items_center ] 138 | [ Html.input [ A.type_ "checkbox", TW.tw_rounded, TW.tw_border_gray_300, TW.tw_text_blue_600, TW.tw_shadow_sm, TW.focus__tw_border_blue_300, TW.focus__tw_ring, TW.focus__tw_ring_offset_0, TW.focus__tw_ring_blue_200, TW.focus__tw_ring_opacity_50 ] [] 139 | , Html.span [ TW.tw_ml_2 ] 140 | [ Html.text "I agree to the " 141 | , Html.span [ TW.tw_underline ] [ Html.text "privacy policy" ] 142 | ] 143 | ] 144 | ] 145 | ] 146 | , Html.hr [ TW.tw_my_8 ] [] 147 | , Html.div [] 148 | [ Html.h2 149 | [ TW.tw_text_xl 150 | , TW.tw_font_normal 151 | , TW.tw_mb_4 152 | ] 153 | [ Html.text "Counter" ] 154 | , Html.button 155 | (E.onClick Decrement :: buttonCls) 156 | [ Html.i 157 | [ TW.fa 158 | , TW.fa_minus 159 | ] 160 | [] 161 | ] 162 | , Html.div 163 | (TW.classList 164 | -- make sure classList works ok 165 | [ ( TW.tw_text_2xl, True ) 166 | , ( TW.tw_text_center, True ) 167 | , ( TW.tw_my_4, True ) 168 | , ( TW.tw_text_red_500, model.current > 5 ) 169 | ] 170 | ) 171 | [ Html.text (String.fromInt model.current) ] 172 | , Html.button 173 | (E.onClick Increment :: buttonCls) 174 | [ Html.i 175 | [ TW.fa 176 | , TW.fa_plus 177 | ] 178 | [] 179 | ] 180 | ] 181 | , Html.div [] 182 | [ Html.h2 183 | [ TW.tw_text_xl 184 | , TW.tw_font_normal 185 | , TW.tw_mb_4 186 | , TW.test_dot_with_dot_a_dot_dot -- here to test classes with a "." in them 187 | ] 188 | [ Html.text "Counter History" ] 189 | , Html.div 190 | [] 191 | <| 192 | List.map historyEntry (List.reverse model.history) 193 | ] 194 | ] 195 | 196 | 197 | historyEntry : Int -> Html msg 198 | historyEntry val = 199 | Html.div 200 | [ TW.first__tw_bg_indigo_100 201 | , TW.even__tw_bg_indigo_200 202 | , TW.odd__tw_bg_indigo_300 203 | , TW.last__tw_bg_indigo_400 204 | , TW.tw_max_w_xs 205 | , TW.tw_text_center 206 | ] 207 | [ Html.text <| String.fromInt val ] 208 | 209 | 210 | buttonCls : List (Html.Attribute msg) 211 | buttonCls = 212 | [ TW.tw_rounded 213 | , TW.tw_py_2 214 | , TW.tw_px_4 215 | , TW.tw_text_white 216 | , TW.tw_text_lg 217 | , TW.tw_bg_blue_500 218 | , TW.hover__tw_bg_blue_700 219 | , TW_lg.tw_bg_green_500 220 | , TW_lg.hover__tw_bg_green_700 221 | --, TW.hover__tw_font_bold 222 | , TW.tw_mx_auto 223 | , TW.tw_block 224 | , TW.tw_w_1over4 225 | , TW.tw_transition 226 | , TW.tw_duration_500 227 | , TW.tw_ease_in_out 228 | , TW.tw_transform 229 | , TW.hover__tw_neg_translate_y_1 230 | , TW.hover__tw_scale_110 231 | , TLWND.XXL.tw_rounded_md 232 | , TLWND.XL.tw_rounded_md 233 | ] 234 | -------------------------------------------------------------------------------- /demo/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | theme: {}, 3 | variants: { 4 | backgroundColor: [ 5 | "responsive", 6 | "active", 7 | "disabled", 8 | "even", 9 | "first", 10 | "focus-within", 11 | "focus", 12 | "group-focus", 13 | "group-hover", 14 | "hover", 15 | "last", 16 | "odd", 17 | "visited" 18 | ] 19 | }, 20 | plugins: [require('@tailwindcss/forms')], 21 | prefix: "tw-", 22 | purge: { 23 | mode: 'all', // Removes unused font-awesome fonts and icons 24 | content: ['./index.html', './dist/app.js'], 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /demo/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.14.5" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" 8 | integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== 9 | dependencies: 10 | "@babel/highlight" "^7.14.5" 11 | 12 | "@babel/helper-validator-identifier@^7.14.5": 13 | version "7.14.9" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" 15 | integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== 16 | 17 | "@babel/highlight@^7.14.5": 18 | version "7.14.5" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" 20 | integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.14.5" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@nodelib/fs.scandir@2.1.3": 27 | version "2.1.3" 28 | resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz" 29 | integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== 30 | dependencies: 31 | "@nodelib/fs.stat" "2.0.3" 32 | run-parallel "^1.1.9" 33 | 34 | "@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": 35 | version "2.0.3" 36 | resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz" 37 | integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== 38 | 39 | "@nodelib/fs.walk@^1.2.3": 40 | version "1.2.4" 41 | resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz" 42 | integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== 43 | dependencies: 44 | "@nodelib/fs.scandir" "2.1.3" 45 | fastq "^1.6.0" 46 | 47 | "@tailwindcss/forms@^0.3.3": 48 | version "0.3.3" 49 | resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.3.3.tgz#a29d22668804f3dae293dcadbef1aa6315c45b64" 50 | integrity sha512-U8Fi/gq4mSuaLyLtFISwuDYzPB73YzgozjxOIHsK6NXgg/IWD1FLaHbFlWmurAMyy98O+ao74ksdQefsquBV1Q== 51 | dependencies: 52 | mini-svg-data-uri "^1.2.3" 53 | 54 | "@types/color-name@^1.1.1": 55 | version "1.1.1" 56 | resolved "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz" 57 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 58 | 59 | "@types/parse-json@^4.0.0": 60 | version "4.0.0" 61 | resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" 62 | integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== 63 | 64 | acorn-node@^1.6.1: 65 | version "1.8.2" 66 | resolved "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz" 67 | integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== 68 | dependencies: 69 | acorn "^7.0.0" 70 | acorn-walk "^7.0.0" 71 | xtend "^4.0.2" 72 | 73 | acorn-walk@^7.0.0: 74 | version "7.1.1" 75 | resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz" 76 | integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== 77 | 78 | acorn@^7.0.0: 79 | version "7.2.0" 80 | resolved "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz" 81 | integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ== 82 | 83 | ajv@^6.12.3: 84 | version "6.12.6" 85 | resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" 86 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 87 | dependencies: 88 | fast-deep-equal "^3.1.1" 89 | fast-json-stable-stringify "^2.0.0" 90 | json-schema-traverse "^0.4.1" 91 | uri-js "^4.2.2" 92 | 93 | ansi-regex@^5.0.0: 94 | version "5.0.0" 95 | resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" 96 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 97 | 98 | ansi-styles@^3.2.1: 99 | version "3.2.1" 100 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" 101 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 102 | dependencies: 103 | color-convert "^1.9.0" 104 | 105 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 106 | version "4.2.1" 107 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz" 108 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 109 | dependencies: 110 | "@types/color-name" "^1.1.1" 111 | color-convert "^2.0.1" 112 | 113 | anymatch@~3.1.1: 114 | version "3.1.1" 115 | resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz" 116 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 117 | dependencies: 118 | normalize-path "^3.0.0" 119 | picomatch "^2.0.4" 120 | 121 | anymatch@~3.1.2: 122 | version "3.1.2" 123 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 124 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 125 | dependencies: 126 | normalize-path "^3.0.0" 127 | picomatch "^2.0.4" 128 | 129 | arg@^5.0.1: 130 | version "5.0.1" 131 | resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" 132 | integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== 133 | 134 | array-union@^2.1.0: 135 | version "2.1.0" 136 | resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" 137 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 138 | 139 | asn1@~0.2.3: 140 | version "0.2.4" 141 | resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz" 142 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 143 | dependencies: 144 | safer-buffer "~2.1.0" 145 | 146 | assert-plus@1.0.0, assert-plus@^1.0.0: 147 | version "1.0.0" 148 | resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 149 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 150 | 151 | asynckit@^0.4.0: 152 | version "0.4.0" 153 | resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" 154 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 155 | 156 | at-least-node@^1.0.0: 157 | version "1.0.0" 158 | resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" 159 | integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== 160 | 161 | autoprefixer@^10.3.3: 162 | version "10.3.3" 163 | resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.3.3.tgz#4bac89c74ef98e6a40fe1c5b76c0d1c91db153ce" 164 | integrity sha512-yRzjxfnggrP/+qVHlUuZz5FZzEbkT+Yt0/Df6ScEMnbbZBLzYB2W0KLxoQCW+THm1SpOsM1ZPcTHAwuvmibIsQ== 165 | dependencies: 166 | browserslist "^4.16.8" 167 | caniuse-lite "^1.0.30001252" 168 | colorette "^1.3.0" 169 | fraction.js "^4.1.1" 170 | normalize-range "^0.1.2" 171 | postcss-value-parser "^4.1.0" 172 | 173 | aws-sign2@~0.7.0: 174 | version "0.7.0" 175 | resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" 176 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 177 | 178 | aws4@^1.8.0: 179 | version "1.11.0" 180 | resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" 181 | integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== 182 | 183 | balanced-match@^1.0.0: 184 | version "1.0.0" 185 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" 186 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 187 | 188 | bcrypt-pbkdf@^1.0.0: 189 | version "1.0.2" 190 | resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" 191 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 192 | dependencies: 193 | tweetnacl "^0.14.3" 194 | 195 | binary-extensions@^2.0.0: 196 | version "2.0.0" 197 | resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz" 198 | integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== 199 | 200 | binary@^0.3.0: 201 | version "0.3.0" 202 | resolved "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" 203 | integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= 204 | dependencies: 205 | buffers "~0.1.1" 206 | chainsaw "~0.1.0" 207 | 208 | binwrap@^0.2.2: 209 | version "0.2.2" 210 | resolved "https://registry.npmjs.org/binwrap/-/binwrap-0.2.2.tgz" 211 | integrity sha512-Y+Wvypk3JhH5GPZAvlwJAWOVH/OsOhQMSj37vySuWHwQivoALplPxfBA8b973rFJI7OS+O+1YmmYXIiEXVMAcw== 212 | dependencies: 213 | mustache "^3.0.1" 214 | request "^2.88.0" 215 | request-promise "^4.2.4" 216 | tar "^4.4.10" 217 | unzip-stream "^0.3.0" 218 | 219 | bluebird@^3.5.0: 220 | version "3.7.2" 221 | resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" 222 | integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== 223 | 224 | brace-expansion@^1.1.7: 225 | version "1.1.11" 226 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 227 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 228 | dependencies: 229 | balanced-match "^1.0.0" 230 | concat-map "0.0.1" 231 | 232 | braces@^3.0.1, braces@~3.0.2: 233 | version "3.0.2" 234 | resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" 235 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 236 | dependencies: 237 | fill-range "^7.0.1" 238 | 239 | browserslist@^4.16.8: 240 | version "4.16.8" 241 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.8.tgz#cb868b0b554f137ba6e33de0ecff2eda403c4fb0" 242 | integrity sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ== 243 | dependencies: 244 | caniuse-lite "^1.0.30001251" 245 | colorette "^1.3.0" 246 | electron-to-chromium "^1.3.811" 247 | escalade "^3.1.1" 248 | node-releases "^1.1.75" 249 | 250 | buffers@~0.1.1: 251 | version "0.1.1" 252 | resolved "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" 253 | integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= 254 | 255 | bytes@^3.0.0: 256 | version "3.1.0" 257 | resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz" 258 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 259 | 260 | callsites@^3.0.0: 261 | version "3.1.0" 262 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 263 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 264 | 265 | camelcase-css@^2.0.1: 266 | version "2.0.1" 267 | resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" 268 | integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== 269 | 270 | caniuse-lite@^1.0.30001251, caniuse-lite@^1.0.30001252: 271 | version "1.0.30001252" 272 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz#cb16e4e3dafe948fc4a9bb3307aea054b912019a" 273 | integrity sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw== 274 | 275 | caseless@~0.12.0: 276 | version "0.12.0" 277 | resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" 278 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 279 | 280 | chainsaw@~0.1.0: 281 | version "0.1.0" 282 | resolved "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" 283 | integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= 284 | dependencies: 285 | traverse ">=0.3.0 <0.4" 286 | 287 | chalk@^2.0.0, chalk@^2.4.2: 288 | version "2.4.2" 289 | resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" 290 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 291 | dependencies: 292 | ansi-styles "^3.2.1" 293 | escape-string-regexp "^1.0.5" 294 | supports-color "^5.3.0" 295 | 296 | chalk@^4.0.0: 297 | version "4.0.0" 298 | resolved "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz" 299 | integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== 300 | dependencies: 301 | ansi-styles "^4.1.0" 302 | supports-color "^7.1.0" 303 | 304 | chalk@^4.1.2: 305 | version "4.1.2" 306 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 307 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 308 | dependencies: 309 | ansi-styles "^4.1.0" 310 | supports-color "^7.1.0" 311 | 312 | chokidar@^3.3.0: 313 | version "3.4.0" 314 | resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz" 315 | integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== 316 | dependencies: 317 | anymatch "~3.1.1" 318 | braces "~3.0.2" 319 | glob-parent "~5.1.0" 320 | is-binary-path "~2.1.0" 321 | is-glob "~4.0.1" 322 | normalize-path "~3.0.0" 323 | readdirp "~3.4.0" 324 | optionalDependencies: 325 | fsevents "~2.1.2" 326 | 327 | chokidar@^3.5.2: 328 | version "3.5.2" 329 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" 330 | integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== 331 | dependencies: 332 | anymatch "~3.1.2" 333 | braces "~3.0.2" 334 | glob-parent "~5.1.2" 335 | is-binary-path "~2.1.0" 336 | is-glob "~4.0.1" 337 | normalize-path "~3.0.0" 338 | readdirp "~3.6.0" 339 | optionalDependencies: 340 | fsevents "~2.3.2" 341 | 342 | chownr@^1.1.4: 343 | version "1.1.4" 344 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" 345 | integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== 346 | 347 | cliui@^7.0.2: 348 | version "7.0.4" 349 | resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" 350 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 351 | dependencies: 352 | string-width "^4.2.0" 353 | strip-ansi "^6.0.0" 354 | wrap-ansi "^7.0.0" 355 | 356 | color-convert@^1.9.0: 357 | version "1.9.3" 358 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" 359 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 360 | dependencies: 361 | color-name "1.1.3" 362 | 363 | color-convert@^2.0.1: 364 | version "2.0.1" 365 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" 366 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 367 | dependencies: 368 | color-name "~1.1.4" 369 | 370 | color-name@1.1.3: 371 | version "1.1.3" 372 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" 373 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 374 | 375 | color-name@^1.0.0, color-name@~1.1.4: 376 | version "1.1.4" 377 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 378 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 379 | 380 | color-string@^1.6.0: 381 | version "1.6.0" 382 | resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" 383 | integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== 384 | dependencies: 385 | color-name "^1.0.0" 386 | simple-swizzle "^0.2.2" 387 | 388 | color@^4.0.1: 389 | version "4.0.1" 390 | resolved "https://registry.yarnpkg.com/color/-/color-4.0.1.tgz#21df44cd10245a91b1ccf5ba031609b0e10e7d67" 391 | integrity sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA== 392 | dependencies: 393 | color-convert "^2.0.1" 394 | color-string "^1.6.0" 395 | 396 | colorette@^1.2.1, colorette@^1.2.2, colorette@^1.3.0: 397 | version "1.3.0" 398 | resolved "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz" 399 | integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w== 400 | 401 | combined-stream@^1.0.6, combined-stream@~1.0.6: 402 | version "1.0.8" 403 | resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" 404 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 405 | dependencies: 406 | delayed-stream "~1.0.0" 407 | 408 | commander@^5.0.0: 409 | version "5.1.0" 410 | resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" 411 | integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== 412 | 413 | commander@^6.0.0: 414 | version "6.2.1" 415 | resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" 416 | integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== 417 | 418 | concat-map@0.0.1: 419 | version "0.0.1" 420 | resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 421 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 422 | 423 | core-util-is@1.0.2: 424 | version "1.0.2" 425 | resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" 426 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 427 | 428 | cosmiconfig@^7.0.1: 429 | version "7.0.1" 430 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" 431 | integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== 432 | dependencies: 433 | "@types/parse-json" "^4.0.0" 434 | import-fresh "^3.2.1" 435 | parse-json "^5.0.0" 436 | path-type "^4.0.0" 437 | yaml "^1.10.0" 438 | 439 | css-unit-converter@^1.1.1: 440 | version "1.1.2" 441 | resolved "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz" 442 | integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== 443 | 444 | cssesc@^3.0.0: 445 | version "3.0.0" 446 | resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" 447 | integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== 448 | 449 | dashdash@^1.12.0: 450 | version "1.14.1" 451 | resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" 452 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 453 | dependencies: 454 | assert-plus "^1.0.0" 455 | 456 | defined@^1.0.0: 457 | version "1.0.0" 458 | resolved "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" 459 | integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= 460 | 461 | delayed-stream@~1.0.0: 462 | version "1.0.0" 463 | resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" 464 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 465 | 466 | dependency-graph@^0.9.0: 467 | version "0.9.0" 468 | resolved "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.9.0.tgz" 469 | integrity sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w== 470 | 471 | detective@^5.2.0: 472 | version "5.2.0" 473 | resolved "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz" 474 | integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== 475 | dependencies: 476 | acorn-node "^1.6.1" 477 | defined "^1.0.0" 478 | minimist "^1.1.1" 479 | 480 | didyoumean@^1.2.2: 481 | version "1.2.2" 482 | resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" 483 | integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== 484 | 485 | dir-glob@^3.0.1: 486 | version "3.0.1" 487 | resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" 488 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 489 | dependencies: 490 | path-type "^4.0.0" 491 | 492 | dlv@^1.1.3: 493 | version "1.1.3" 494 | resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" 495 | integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== 496 | 497 | ecc-jsbn@~0.1.1: 498 | version "0.1.2" 499 | resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" 500 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 501 | dependencies: 502 | jsbn "~0.1.0" 503 | safer-buffer "^2.1.0" 504 | 505 | electron-to-chromium@^1.3.811: 506 | version "1.3.824" 507 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.824.tgz#9f85cc826c70b12180009d461e3b19c8121a56d2" 508 | integrity sha512-Fk+5aD0HDi9i9ZKt9n2VPOZO1dQy7PV++hz2wJ/KIn+CvVfu4fny39squHtyVDPuHNuoJGAZIbuReEklqYIqfA== 509 | 510 | elm-format@0.8.3: 511 | version "0.8.3" 512 | resolved "https://registry.npmjs.org/elm-format/-/elm-format-0.8.3.tgz" 513 | integrity sha512-shXOgfg8F5hDJagP91zJ3QT0PoMbusPfhgEeu3uRofTaN843cFpjZ8qlQip6pFQxtWyQE/P+NMg3vP6lyWI5Mg== 514 | dependencies: 515 | binwrap "^0.2.2" 516 | 517 | elm@^0.19.1-2: 518 | version "0.19.1-5" 519 | resolved "https://registry.npmjs.org/elm/-/elm-0.19.1-5.tgz" 520 | integrity sha512-dyBoPvFiNLvxOStQJdyq28gZEjS/enZXdZ5yyCtNtDEMbFJJVQq4pYNRKvhrKKdlxNot6d96iQe1uczoqO5yvA== 521 | dependencies: 522 | request "^2.88.0" 523 | 524 | emoji-regex@^8.0.0: 525 | version "8.0.0" 526 | resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" 527 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 528 | 529 | error-ex@^1.3.1: 530 | version "1.3.2" 531 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 532 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 533 | dependencies: 534 | is-arrayish "^0.2.1" 535 | 536 | escalade@^3.1.1: 537 | version "3.1.1" 538 | resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" 539 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 540 | 541 | escape-string-regexp@^1.0.5: 542 | version "1.0.5" 543 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" 544 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 545 | 546 | extend@~3.0.2: 547 | version "3.0.2" 548 | resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" 549 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 550 | 551 | extsprintf@1.3.0: 552 | version "1.3.0" 553 | resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" 554 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 555 | 556 | extsprintf@^1.2.0: 557 | version "1.4.0" 558 | resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz" 559 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 560 | 561 | fast-deep-equal@^3.1.1: 562 | version "3.1.3" 563 | resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" 564 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 565 | 566 | fast-glob@^3.1.1: 567 | version "3.2.2" 568 | resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz" 569 | integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A== 570 | dependencies: 571 | "@nodelib/fs.stat" "^2.0.2" 572 | "@nodelib/fs.walk" "^1.2.3" 573 | glob-parent "^5.1.0" 574 | merge2 "^1.3.0" 575 | micromatch "^4.0.2" 576 | picomatch "^2.2.1" 577 | 578 | fast-glob@^3.2.7: 579 | version "3.2.7" 580 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" 581 | integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== 582 | dependencies: 583 | "@nodelib/fs.stat" "^2.0.2" 584 | "@nodelib/fs.walk" "^1.2.3" 585 | glob-parent "^5.1.2" 586 | merge2 "^1.3.0" 587 | micromatch "^4.0.4" 588 | 589 | fast-json-stable-stringify@^2.0.0: 590 | version "2.1.0" 591 | resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" 592 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 593 | 594 | fastq@^1.6.0: 595 | version "1.8.0" 596 | resolved "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz" 597 | integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== 598 | dependencies: 599 | reusify "^1.0.4" 600 | 601 | fill-range@^7.0.1: 602 | version "7.0.1" 603 | resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" 604 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 605 | dependencies: 606 | to-regex-range "^5.0.1" 607 | 608 | forever-agent@~0.6.1: 609 | version "0.6.1" 610 | resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" 611 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 612 | 613 | form-data@~2.3.2: 614 | version "2.3.3" 615 | resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" 616 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 617 | dependencies: 618 | asynckit "^0.4.0" 619 | combined-stream "^1.0.6" 620 | mime-types "^2.1.12" 621 | 622 | fraction.js@^4.1.1: 623 | version "4.1.1" 624 | resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.1.tgz#ac4e520473dae67012d618aab91eda09bcb400ff" 625 | integrity sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg== 626 | 627 | fs-extra@^10.0.0: 628 | version "10.0.0" 629 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" 630 | integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== 631 | dependencies: 632 | graceful-fs "^4.2.0" 633 | jsonfile "^6.0.1" 634 | universalify "^2.0.0" 635 | 636 | fs-extra@^9.0.0: 637 | version "9.0.0" 638 | resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz" 639 | integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== 640 | dependencies: 641 | at-least-node "^1.0.0" 642 | graceful-fs "^4.2.0" 643 | jsonfile "^6.0.1" 644 | universalify "^1.0.0" 645 | 646 | fs-minipass@^1.2.7: 647 | version "1.2.7" 648 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" 649 | integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== 650 | dependencies: 651 | minipass "^2.6.0" 652 | 653 | fs.realpath@^1.0.0: 654 | version "1.0.0" 655 | resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" 656 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 657 | 658 | fsevents@~2.1.2: 659 | version "2.1.3" 660 | resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz" 661 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== 662 | 663 | fsevents@~2.3.2: 664 | version "2.3.2" 665 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 666 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 667 | 668 | function-bind@^1.1.1: 669 | version "1.1.1" 670 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 671 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 672 | 673 | get-caller-file@^2.0.5: 674 | version "2.0.5" 675 | resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" 676 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 677 | 678 | get-stdin@^8.0.0: 679 | version "8.0.0" 680 | resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz" 681 | integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== 682 | 683 | getpass@^0.1.1: 684 | version "0.1.7" 685 | resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" 686 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 687 | dependencies: 688 | assert-plus "^1.0.0" 689 | 690 | glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: 691 | version "5.1.2" 692 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 693 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 694 | dependencies: 695 | is-glob "^4.0.1" 696 | 697 | glob-parent@^6.0.1: 698 | version "6.0.1" 699 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.1.tgz#42054f685eb6a44e7a7d189a96efa40a54971aa7" 700 | integrity sha512-kEVjS71mQazDBHKcsq4E9u/vUzaLcw1A8EtUeydawvIWQCJM0qQ08G1H7/XTjFUulla6XQiDOG6MXSaG0HDKog== 701 | dependencies: 702 | is-glob "^4.0.1" 703 | 704 | glob@^7.0.0: 705 | version "7.1.6" 706 | resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" 707 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 708 | dependencies: 709 | fs.realpath "^1.0.0" 710 | inflight "^1.0.4" 711 | inherits "2" 712 | minimatch "^3.0.4" 713 | once "^1.3.0" 714 | path-is-absolute "^1.0.0" 715 | 716 | glob@^7.1.3: 717 | version "7.1.7" 718 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" 719 | integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== 720 | dependencies: 721 | fs.realpath "^1.0.0" 722 | inflight "^1.0.4" 723 | inherits "2" 724 | minimatch "^3.0.4" 725 | once "^1.3.0" 726 | path-is-absolute "^1.0.0" 727 | 728 | globby@^11.0.0: 729 | version "11.0.0" 730 | resolved "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz" 731 | integrity sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg== 732 | dependencies: 733 | array-union "^2.1.0" 734 | dir-glob "^3.0.1" 735 | fast-glob "^3.1.1" 736 | ignore "^5.1.4" 737 | merge2 "^1.3.0" 738 | slash "^3.0.0" 739 | 740 | graceful-fs@^4.1.6, graceful-fs@^4.2.0: 741 | version "4.2.4" 742 | resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz" 743 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 744 | 745 | har-schema@^2.0.0: 746 | version "2.0.0" 747 | resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" 748 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 749 | 750 | har-validator@~5.1.3: 751 | version "5.1.5" 752 | resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" 753 | integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== 754 | dependencies: 755 | ajv "^6.12.3" 756 | har-schema "^2.0.0" 757 | 758 | has-flag@^3.0.0: 759 | version "3.0.0" 760 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" 761 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 762 | 763 | has-flag@^4.0.0: 764 | version "4.0.0" 765 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" 766 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 767 | 768 | has@^1.0.3: 769 | version "1.0.3" 770 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 771 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 772 | dependencies: 773 | function-bind "^1.1.1" 774 | 775 | html-tags@^3.1.0: 776 | version "3.1.0" 777 | resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz" 778 | integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== 779 | 780 | http-signature@~1.2.0: 781 | version "1.2.0" 782 | resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" 783 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 784 | dependencies: 785 | assert-plus "^1.0.0" 786 | jsprim "^1.2.2" 787 | sshpk "^1.7.0" 788 | 789 | ignore@^5.1.4: 790 | version "5.1.6" 791 | resolved "https://registry.npmjs.org/ignore/-/ignore-5.1.6.tgz" 792 | integrity sha512-cgXgkypZBcCnOgSihyeqbo6gjIaIyDqPQB7Ra4vhE9m6kigdGoQDMHjviFhRZo3IMlRy6yElosoviMs5YxZXUA== 793 | 794 | import-cwd@^3.0.0: 795 | version "3.0.0" 796 | resolved "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz" 797 | integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg== 798 | dependencies: 799 | import-from "^3.0.0" 800 | 801 | import-fresh@^3.2.1: 802 | version "3.3.0" 803 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 804 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 805 | dependencies: 806 | parent-module "^1.0.0" 807 | resolve-from "^4.0.0" 808 | 809 | import-from@^3.0.0: 810 | version "3.0.0" 811 | resolved "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz" 812 | integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== 813 | dependencies: 814 | resolve-from "^5.0.0" 815 | 816 | inflight@^1.0.4: 817 | version "1.0.6" 818 | resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" 819 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 820 | dependencies: 821 | once "^1.3.0" 822 | wrappy "1" 823 | 824 | inherits@2: 825 | version "2.0.4" 826 | resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 827 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 828 | 829 | is-arrayish@^0.2.1: 830 | version "0.2.1" 831 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 832 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 833 | 834 | is-arrayish@^0.3.1: 835 | version "0.3.2" 836 | resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" 837 | integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== 838 | 839 | is-binary-path@~2.1.0: 840 | version "2.1.0" 841 | resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" 842 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 843 | dependencies: 844 | binary-extensions "^2.0.0" 845 | 846 | is-core-module@^2.2.0: 847 | version "2.6.0" 848 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" 849 | integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== 850 | dependencies: 851 | has "^1.0.3" 852 | 853 | is-extglob@^2.1.1: 854 | version "2.1.1" 855 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 856 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 857 | 858 | is-fullwidth-code-point@^3.0.0: 859 | version "3.0.0" 860 | resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" 861 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 862 | 863 | is-glob@^4.0.1, is-glob@~4.0.1: 864 | version "4.0.1" 865 | resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" 866 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 867 | dependencies: 868 | is-extglob "^2.1.1" 869 | 870 | is-number@^7.0.0: 871 | version "7.0.0" 872 | resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" 873 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 874 | 875 | is-typedarray@~1.0.0: 876 | version "1.0.0" 877 | resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" 878 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 879 | 880 | isstream@~0.1.2: 881 | version "0.1.2" 882 | resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" 883 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 884 | 885 | js-tokens@^4.0.0: 886 | version "4.0.0" 887 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 888 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 889 | 890 | jsbn@~0.1.0: 891 | version "0.1.1" 892 | resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" 893 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 894 | 895 | json-parse-even-better-errors@^2.3.0: 896 | version "2.3.1" 897 | resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" 898 | integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== 899 | 900 | json-schema-traverse@^0.4.1: 901 | version "0.4.1" 902 | resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" 903 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 904 | 905 | json-schema@0.2.3: 906 | version "0.2.3" 907 | resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" 908 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 909 | 910 | json-stringify-safe@~5.0.1: 911 | version "5.0.1" 912 | resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" 913 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 914 | 915 | jsonfile@^6.0.1: 916 | version "6.0.1" 917 | resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz" 918 | integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== 919 | dependencies: 920 | universalify "^1.0.0" 921 | optionalDependencies: 922 | graceful-fs "^4.1.6" 923 | 924 | jsprim@^1.2.2: 925 | version "1.4.1" 926 | resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz" 927 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 928 | dependencies: 929 | assert-plus "1.0.0" 930 | extsprintf "1.3.0" 931 | json-schema "0.2.3" 932 | verror "1.10.0" 933 | 934 | lilconfig@^2.0.3: 935 | version "2.0.3" 936 | resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.3.tgz" 937 | integrity sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg== 938 | 939 | lines-and-columns@^1.1.6: 940 | version "1.1.6" 941 | resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" 942 | integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= 943 | 944 | lodash.difference@^4.5.0: 945 | version "4.5.0" 946 | resolved "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz" 947 | integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= 948 | 949 | lodash.forown@^4.4.0: 950 | version "4.4.0" 951 | resolved "https://registry.npmjs.org/lodash.forown/-/lodash.forown-4.4.0.tgz" 952 | integrity sha1-hRFc8E9z75ZuztUlEdOJPMRmg68= 953 | 954 | lodash.get@^4.4.2: 955 | version "4.4.2" 956 | resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" 957 | integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= 958 | 959 | lodash.groupby@^4.6.0: 960 | version "4.6.0" 961 | resolved "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz" 962 | integrity sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E= 963 | 964 | lodash.sortby@^4.7.0: 965 | version "4.7.0" 966 | resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" 967 | integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= 968 | 969 | lodash.topath@^4.5.2: 970 | version "4.5.2" 971 | resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" 972 | integrity sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak= 973 | 974 | lodash@^4.17.15, lodash@^4.17.21: 975 | version "4.17.21" 976 | resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" 977 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 978 | 979 | merge2@^1.3.0: 980 | version "1.3.0" 981 | resolved "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz" 982 | integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== 983 | 984 | micromatch@^4.0.2: 985 | version "4.0.2" 986 | resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz" 987 | integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== 988 | dependencies: 989 | braces "^3.0.1" 990 | picomatch "^2.0.5" 991 | 992 | micromatch@^4.0.4: 993 | version "4.0.4" 994 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" 995 | integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== 996 | dependencies: 997 | braces "^3.0.1" 998 | picomatch "^2.2.3" 999 | 1000 | mime-db@1.49.0: 1001 | version "1.49.0" 1002 | resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz" 1003 | integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== 1004 | 1005 | mime-types@^2.1.12, mime-types@~2.1.19: 1006 | version "2.1.32" 1007 | resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz" 1008 | integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== 1009 | dependencies: 1010 | mime-db "1.49.0" 1011 | 1012 | mini-svg-data-uri@^1.2.3: 1013 | version "1.3.3" 1014 | resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.3.3.tgz#91d2c09f45e056e5e1043340b8b37ba7b50f4fac" 1015 | integrity sha512-+fA2oRcR1dJI/7ITmeQJDrYWks0wodlOz0pAEhKYJ2IVc1z0AnwJUsKY2fzFmPAM3Jo9J0rBx8JAA9QQSJ5PuA== 1016 | 1017 | minimatch@^3.0.4: 1018 | version "3.0.4" 1019 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" 1020 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1021 | dependencies: 1022 | brace-expansion "^1.1.7" 1023 | 1024 | minimist@^1.1.1, minimist@^1.2.5: 1025 | version "1.2.5" 1026 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1027 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1028 | 1029 | minipass@^2.6.0, minipass@^2.9.0: 1030 | version "2.9.0" 1031 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" 1032 | integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== 1033 | dependencies: 1034 | safe-buffer "^5.1.2" 1035 | yallist "^3.0.0" 1036 | 1037 | minizlib@^1.3.3: 1038 | version "1.3.3" 1039 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" 1040 | integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== 1041 | dependencies: 1042 | minipass "^2.9.0" 1043 | 1044 | mkdirp@^0.5.1, mkdirp@^0.5.5: 1045 | version "0.5.5" 1046 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1047 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 1048 | dependencies: 1049 | minimist "^1.2.5" 1050 | 1051 | modern-normalize@^1.1.0: 1052 | version "1.1.0" 1053 | resolved "https://registry.yarnpkg.com/modern-normalize/-/modern-normalize-1.1.0.tgz#da8e80140d9221426bd4f725c6e11283d34f90b7" 1054 | integrity sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA== 1055 | 1056 | mustache@^3.0.1: 1057 | version "3.2.1" 1058 | resolved "https://registry.npmjs.org/mustache/-/mustache-3.2.1.tgz" 1059 | integrity sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA== 1060 | 1061 | nanoid@^3.1.23: 1062 | version "3.1.25" 1063 | resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz" 1064 | integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== 1065 | 1066 | node-emoji@^1.11.0: 1067 | version "1.11.0" 1068 | resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" 1069 | integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== 1070 | dependencies: 1071 | lodash "^4.17.21" 1072 | 1073 | node-releases@^1.1.75: 1074 | version "1.1.75" 1075 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe" 1076 | integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw== 1077 | 1078 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1079 | version "3.0.0" 1080 | resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" 1081 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1082 | 1083 | normalize-range@^0.1.2: 1084 | version "0.1.2" 1085 | resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" 1086 | integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= 1087 | 1088 | oauth-sign@~0.9.0: 1089 | version "0.9.0" 1090 | resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" 1091 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 1092 | 1093 | object-hash@^2.2.0: 1094 | version "2.2.0" 1095 | resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" 1096 | integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== 1097 | 1098 | once@^1.3.0: 1099 | version "1.4.0" 1100 | resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 1101 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1102 | dependencies: 1103 | wrappy "1" 1104 | 1105 | parent-module@^1.0.0: 1106 | version "1.0.1" 1107 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1108 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1109 | dependencies: 1110 | callsites "^3.0.0" 1111 | 1112 | parse-json@^5.0.0: 1113 | version "5.2.0" 1114 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" 1115 | integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== 1116 | dependencies: 1117 | "@babel/code-frame" "^7.0.0" 1118 | error-ex "^1.3.1" 1119 | json-parse-even-better-errors "^2.3.0" 1120 | lines-and-columns "^1.1.6" 1121 | 1122 | path-is-absolute@^1.0.0: 1123 | version "1.0.1" 1124 | resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" 1125 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1126 | 1127 | path-parse@^1.0.6: 1128 | version "1.0.7" 1129 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1130 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1131 | 1132 | path-type@^4.0.0: 1133 | version "4.0.0" 1134 | resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" 1135 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1136 | 1137 | performance-now@^2.1.0: 1138 | version "2.1.0" 1139 | resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" 1140 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 1141 | 1142 | picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: 1143 | version "2.2.2" 1144 | resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz" 1145 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 1146 | 1147 | picomatch@^2.2.3: 1148 | version "2.3.0" 1149 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 1150 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 1151 | 1152 | pify@^2.3.0: 1153 | version "2.3.0" 1154 | resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" 1155 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 1156 | 1157 | postcss-cli@^8.0.0: 1158 | version "8.3.1" 1159 | resolved "https://registry.npmjs.org/postcss-cli/-/postcss-cli-8.3.1.tgz" 1160 | integrity sha512-leHXsQRq89S3JC9zw/tKyiVV2jAhnfQe0J8VI4eQQbUjwIe0XxVqLrR+7UsahF1s9wi4GlqP6SJ8ydf44cgF2Q== 1161 | dependencies: 1162 | chalk "^4.0.0" 1163 | chokidar "^3.3.0" 1164 | dependency-graph "^0.9.0" 1165 | fs-extra "^9.0.0" 1166 | get-stdin "^8.0.0" 1167 | globby "^11.0.0" 1168 | postcss-load-config "^3.0.0" 1169 | postcss-reporter "^7.0.0" 1170 | pretty-hrtime "^1.0.3" 1171 | read-cache "^1.0.0" 1172 | slash "^3.0.0" 1173 | yargs "^16.0.0" 1174 | 1175 | postcss-js@^3.0.3: 1176 | version "3.0.3" 1177 | resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-3.0.3.tgz#2f0bd370a2e8599d45439f6970403b5873abda33" 1178 | integrity sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw== 1179 | dependencies: 1180 | camelcase-css "^2.0.1" 1181 | postcss "^8.1.6" 1182 | 1183 | postcss-load-config@^3.0.0, postcss-load-config@^3.1.0: 1184 | version "3.1.0" 1185 | resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz" 1186 | integrity sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g== 1187 | dependencies: 1188 | import-cwd "^3.0.0" 1189 | lilconfig "^2.0.3" 1190 | yaml "^1.10.2" 1191 | 1192 | postcss-nested@5.0.6: 1193 | version "5.0.6" 1194 | resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" 1195 | integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== 1196 | dependencies: 1197 | postcss-selector-parser "^6.0.6" 1198 | 1199 | postcss-reporter@^7.0.0: 1200 | version "7.0.2" 1201 | resolved "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.2.tgz" 1202 | integrity sha512-JyQ96NTQQsso42y6L1H1RqHfWH1C3Jr0pt91mVv5IdYddZAE9DUZxuferNgk6q0o6vBVOrfVJb10X1FgDzjmDw== 1203 | dependencies: 1204 | colorette "^1.2.1" 1205 | lodash.difference "^4.5.0" 1206 | lodash.forown "^4.4.0" 1207 | lodash.get "^4.4.2" 1208 | lodash.groupby "^4.6.0" 1209 | lodash.sortby "^4.7.0" 1210 | 1211 | postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.6: 1212 | version "6.0.6" 1213 | resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz" 1214 | integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== 1215 | dependencies: 1216 | cssesc "^3.0.0" 1217 | util-deprecate "^1.0.2" 1218 | 1219 | postcss-value-parser@^3.3.0: 1220 | version "3.3.1" 1221 | resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz" 1222 | integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== 1223 | 1224 | postcss-value-parser@^4.1.0: 1225 | version "4.1.0" 1226 | resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz" 1227 | integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== 1228 | 1229 | postcss@7.0.28: 1230 | version "7.0.28" 1231 | resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.28.tgz" 1232 | integrity sha512-YU6nVhyWIsVtlNlnAj1fHTsUKW5qxm3KEgzq2Jj6KTEFOTK8QWR12eIDvrlWhiSTK8WIBFTBhOJV4DY6dUuEbw== 1233 | dependencies: 1234 | chalk "^2.4.2" 1235 | source-map "^0.6.1" 1236 | supports-color "^6.1.0" 1237 | 1238 | postcss@^8.1.6, postcss@^8.2.1, postcss@^8.3.6: 1239 | version "8.3.6" 1240 | resolved "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz" 1241 | integrity sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A== 1242 | dependencies: 1243 | colorette "^1.2.2" 1244 | nanoid "^3.1.23" 1245 | source-map-js "^0.6.2" 1246 | 1247 | pretty-hrtime@^1.0.3: 1248 | version "1.0.3" 1249 | resolved "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz" 1250 | integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= 1251 | 1252 | psl@^1.1.28: 1253 | version "1.8.0" 1254 | resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz" 1255 | integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== 1256 | 1257 | punycode@^2.1.0, punycode@^2.1.1: 1258 | version "2.1.1" 1259 | resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" 1260 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1261 | 1262 | purgecss@^2.2.1: 1263 | version "2.2.1" 1264 | resolved "https://registry.npmjs.org/purgecss/-/purgecss-2.2.1.tgz" 1265 | integrity sha512-wngRSLW1dpNr8kr3TL9nTJMyTFI5BiRiaUUEys5M1CA4zEHLF25fRHoshEeDqmhstaNTOddmpYM34zRrUtEGbQ== 1266 | dependencies: 1267 | commander "^5.0.0" 1268 | glob "^7.0.0" 1269 | postcss "7.0.28" 1270 | postcss-selector-parser "^6.0.2" 1271 | 1272 | purgecss@^4.0.3: 1273 | version "4.0.3" 1274 | resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-4.0.3.tgz#8147b429f9c09db719e05d64908ea8b672913742" 1275 | integrity sha512-PYOIn5ibRIP34PBU9zohUcCI09c7drPJJtTDAc0Q6QlRz2/CHQ8ywGLdE7ZhxU2VTqB7p5wkvj5Qcm05Rz3Jmw== 1276 | dependencies: 1277 | commander "^6.0.0" 1278 | glob "^7.0.0" 1279 | postcss "^8.2.1" 1280 | postcss-selector-parser "^6.0.2" 1281 | 1282 | qs@~6.5.2: 1283 | version "6.5.2" 1284 | resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz" 1285 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 1286 | 1287 | quick-lru@^5.1.1: 1288 | version "5.1.1" 1289 | resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" 1290 | integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== 1291 | 1292 | read-cache@^1.0.0: 1293 | version "1.0.0" 1294 | resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" 1295 | integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= 1296 | dependencies: 1297 | pify "^2.3.0" 1298 | 1299 | readdirp@~3.4.0: 1300 | version "3.4.0" 1301 | resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz" 1302 | integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== 1303 | dependencies: 1304 | picomatch "^2.2.1" 1305 | 1306 | readdirp@~3.6.0: 1307 | version "3.6.0" 1308 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1309 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1310 | dependencies: 1311 | picomatch "^2.2.1" 1312 | 1313 | reduce-css-calc@^2.1.8: 1314 | version "2.1.8" 1315 | resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03" 1316 | integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== 1317 | dependencies: 1318 | css-unit-converter "^1.1.1" 1319 | postcss-value-parser "^3.3.0" 1320 | 1321 | request-promise-core@1.1.3: 1322 | version "1.1.3" 1323 | resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz" 1324 | integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== 1325 | dependencies: 1326 | lodash "^4.17.15" 1327 | 1328 | request-promise@^4.2.4: 1329 | version "4.2.5" 1330 | resolved "https://registry.npmjs.org/request-promise/-/request-promise-4.2.5.tgz" 1331 | integrity sha512-ZgnepCykFdmpq86fKGwqntyTiUrHycALuGggpyCZwMvGaZWgxW6yagT0FHkgo5LzYvOaCNvxYwWYIjevSH1EDg== 1332 | dependencies: 1333 | bluebird "^3.5.0" 1334 | request-promise-core "1.1.3" 1335 | stealthy-require "^1.1.1" 1336 | tough-cookie "^2.3.3" 1337 | 1338 | request@^2.88.0: 1339 | version "2.88.2" 1340 | resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" 1341 | integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== 1342 | dependencies: 1343 | aws-sign2 "~0.7.0" 1344 | aws4 "^1.8.0" 1345 | caseless "~0.12.0" 1346 | combined-stream "~1.0.6" 1347 | extend "~3.0.2" 1348 | forever-agent "~0.6.1" 1349 | form-data "~2.3.2" 1350 | har-validator "~5.1.3" 1351 | http-signature "~1.2.0" 1352 | is-typedarray "~1.0.0" 1353 | isstream "~0.1.2" 1354 | json-stringify-safe "~5.0.1" 1355 | mime-types "~2.1.19" 1356 | oauth-sign "~0.9.0" 1357 | performance-now "^2.1.0" 1358 | qs "~6.5.2" 1359 | safe-buffer "^5.1.2" 1360 | tough-cookie "~2.5.0" 1361 | tunnel-agent "^0.6.0" 1362 | uuid "^3.3.2" 1363 | 1364 | require-directory@^2.1.1: 1365 | version "2.1.1" 1366 | resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" 1367 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1368 | 1369 | resolve-from@^4.0.0: 1370 | version "4.0.0" 1371 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1372 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1373 | 1374 | resolve-from@^5.0.0: 1375 | version "5.0.0" 1376 | resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" 1377 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 1378 | 1379 | resolve@^1.20.0: 1380 | version "1.20.0" 1381 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" 1382 | integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== 1383 | dependencies: 1384 | is-core-module "^2.2.0" 1385 | path-parse "^1.0.6" 1386 | 1387 | reusify@^1.0.4: 1388 | version "1.0.4" 1389 | resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" 1390 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1391 | 1392 | rimraf@^3.0.0: 1393 | version "3.0.2" 1394 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1395 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1396 | dependencies: 1397 | glob "^7.1.3" 1398 | 1399 | run-parallel@^1.1.9: 1400 | version "1.1.9" 1401 | resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz" 1402 | integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== 1403 | 1404 | safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1: 1405 | version "5.2.1" 1406 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1407 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1408 | 1409 | safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 1410 | version "2.1.2" 1411 | resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" 1412 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1413 | 1414 | simple-swizzle@^0.2.2: 1415 | version "0.2.2" 1416 | resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" 1417 | integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= 1418 | dependencies: 1419 | is-arrayish "^0.3.1" 1420 | 1421 | slash@^3.0.0: 1422 | version "3.0.0" 1423 | resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" 1424 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1425 | 1426 | source-map-js@^0.6.2: 1427 | version "0.6.2" 1428 | resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz" 1429 | integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== 1430 | 1431 | source-map@^0.6.1: 1432 | version "0.6.1" 1433 | resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" 1434 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1435 | 1436 | sshpk@^1.7.0: 1437 | version "1.16.1" 1438 | resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz" 1439 | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 1440 | dependencies: 1441 | asn1 "~0.2.3" 1442 | assert-plus "^1.0.0" 1443 | bcrypt-pbkdf "^1.0.0" 1444 | dashdash "^1.12.0" 1445 | ecc-jsbn "~0.1.1" 1446 | getpass "^0.1.1" 1447 | jsbn "~0.1.0" 1448 | safer-buffer "^2.0.2" 1449 | tweetnacl "~0.14.0" 1450 | 1451 | stealthy-require@^1.1.1: 1452 | version "1.1.1" 1453 | resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz" 1454 | integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= 1455 | 1456 | string-width@^4.1.0, string-width@^4.2.0: 1457 | version "4.2.0" 1458 | resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz" 1459 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 1460 | dependencies: 1461 | emoji-regex "^8.0.0" 1462 | is-fullwidth-code-point "^3.0.0" 1463 | strip-ansi "^6.0.0" 1464 | 1465 | strip-ansi@^6.0.0: 1466 | version "6.0.0" 1467 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" 1468 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1469 | dependencies: 1470 | ansi-regex "^5.0.0" 1471 | 1472 | supports-color@^5.3.0: 1473 | version "5.5.0" 1474 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" 1475 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1476 | dependencies: 1477 | has-flag "^3.0.0" 1478 | 1479 | supports-color@^6.1.0: 1480 | version "6.1.0" 1481 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz" 1482 | integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== 1483 | dependencies: 1484 | has-flag "^3.0.0" 1485 | 1486 | supports-color@^7.1.0: 1487 | version "7.1.0" 1488 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz" 1489 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 1490 | dependencies: 1491 | has-flag "^4.0.0" 1492 | 1493 | tailwindcss@^2.2.9: 1494 | version "2.2.9" 1495 | resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-2.2.9.tgz#1484bd45a4a9f9f5de7faabf74c11bf0aeb5ad98" 1496 | integrity sha512-P8zCKFkEthfUvqcnun8DqGGXw4QqyDw971NAM23e8QQ+m5HW1agp4upq50rFGwGNtphVYvr+0zvVLSXo5/I9Qg== 1497 | dependencies: 1498 | arg "^5.0.1" 1499 | bytes "^3.0.0" 1500 | chalk "^4.1.2" 1501 | chokidar "^3.5.2" 1502 | color "^4.0.1" 1503 | cosmiconfig "^7.0.1" 1504 | detective "^5.2.0" 1505 | didyoumean "^1.2.2" 1506 | dlv "^1.1.3" 1507 | fast-glob "^3.2.7" 1508 | fs-extra "^10.0.0" 1509 | glob-parent "^6.0.1" 1510 | html-tags "^3.1.0" 1511 | is-glob "^4.0.1" 1512 | lodash "^4.17.21" 1513 | lodash.topath "^4.5.2" 1514 | modern-normalize "^1.1.0" 1515 | node-emoji "^1.11.0" 1516 | normalize-path "^3.0.0" 1517 | object-hash "^2.2.0" 1518 | postcss-js "^3.0.3" 1519 | postcss-load-config "^3.1.0" 1520 | postcss-nested "5.0.6" 1521 | postcss-selector-parser "^6.0.6" 1522 | postcss-value-parser "^4.1.0" 1523 | pretty-hrtime "^1.0.3" 1524 | purgecss "^4.0.3" 1525 | quick-lru "^5.1.1" 1526 | reduce-css-calc "^2.1.8" 1527 | resolve "^1.20.0" 1528 | tmp "^0.2.1" 1529 | 1530 | tar@^4.4.10: 1531 | version "4.4.19" 1532 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" 1533 | integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== 1534 | dependencies: 1535 | chownr "^1.1.4" 1536 | fs-minipass "^1.2.7" 1537 | minipass "^2.9.0" 1538 | minizlib "^1.3.3" 1539 | mkdirp "^0.5.5" 1540 | safe-buffer "^5.2.1" 1541 | yallist "^3.1.1" 1542 | 1543 | tmp@^0.2.1: 1544 | version "0.2.1" 1545 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" 1546 | integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== 1547 | dependencies: 1548 | rimraf "^3.0.0" 1549 | 1550 | to-regex-range@^5.0.1: 1551 | version "5.0.1" 1552 | resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 1553 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1554 | dependencies: 1555 | is-number "^7.0.0" 1556 | 1557 | tough-cookie@^2.3.3, tough-cookie@~2.5.0: 1558 | version "2.5.0" 1559 | resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" 1560 | integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== 1561 | dependencies: 1562 | psl "^1.1.28" 1563 | punycode "^2.1.1" 1564 | 1565 | "traverse@>=0.3.0 <0.4": 1566 | version "0.3.9" 1567 | resolved "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" 1568 | integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= 1569 | 1570 | tunnel-agent@^0.6.0: 1571 | version "0.6.0" 1572 | resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" 1573 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 1574 | dependencies: 1575 | safe-buffer "^5.0.1" 1576 | 1577 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1578 | version "0.14.5" 1579 | resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" 1580 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 1581 | 1582 | universalify@^1.0.0: 1583 | version "1.0.0" 1584 | resolved "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz" 1585 | integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== 1586 | 1587 | universalify@^2.0.0: 1588 | version "2.0.0" 1589 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" 1590 | integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== 1591 | 1592 | unzip-stream@^0.3.0: 1593 | version "0.3.0" 1594 | resolved "https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.0.tgz" 1595 | integrity sha512-NG1h/MdGIX3HzyqMjyj1laBCmlPYhcO4xEy7gEqqzGiSLw7XqDQCnY4nYSn5XSaH8mQ6TFkaujrO8d/PIZN85A== 1596 | dependencies: 1597 | binary "^0.3.0" 1598 | mkdirp "^0.5.1" 1599 | 1600 | uri-js@^4.2.2: 1601 | version "4.4.1" 1602 | resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" 1603 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1604 | dependencies: 1605 | punycode "^2.1.0" 1606 | 1607 | util-deprecate@^1.0.2: 1608 | version "1.0.2" 1609 | resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" 1610 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1611 | 1612 | uuid@^3.3.2: 1613 | version "3.4.0" 1614 | resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" 1615 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 1616 | 1617 | verror@1.10.0: 1618 | version "1.10.0" 1619 | resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" 1620 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 1621 | dependencies: 1622 | assert-plus "^1.0.0" 1623 | core-util-is "1.0.2" 1624 | extsprintf "^1.2.0" 1625 | 1626 | wrap-ansi@^7.0.0: 1627 | version "7.0.0" 1628 | resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" 1629 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1630 | dependencies: 1631 | ansi-styles "^4.0.0" 1632 | string-width "^4.1.0" 1633 | strip-ansi "^6.0.0" 1634 | 1635 | wrappy@1: 1636 | version "1.0.2" 1637 | resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 1638 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1639 | 1640 | xtend@^4.0.2: 1641 | version "4.0.2" 1642 | resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" 1643 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 1644 | 1645 | y18n@^5.0.5: 1646 | version "5.0.8" 1647 | resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" 1648 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1649 | 1650 | yallist@^3.0.0, yallist@^3.1.1: 1651 | version "3.1.1" 1652 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 1653 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 1654 | 1655 | yaml@^1.10.0, yaml@^1.10.2: 1656 | version "1.10.2" 1657 | resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" 1658 | integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== 1659 | 1660 | yargs-parser@^20.2.2: 1661 | version "20.2.9" 1662 | resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" 1663 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1664 | 1665 | yargs@^16.0.0: 1666 | version "16.2.0" 1667 | resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" 1668 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1669 | dependencies: 1670 | cliui "^7.0.2" 1671 | escalade "^3.1.1" 1672 | get-caller-file "^2.0.5" 1673 | require-directory "^2.1.1" 1674 | string-width "^4.2.0" 1675 | y18n "^5.0.5" 1676 | yargs-parser "^20.2.2" 1677 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | const {promisify} = require("util"); 4 | 5 | const mkdir = promisify(fs.mkdir); 6 | 7 | const {fixClass, toElmName, toScreen} = require("./code-gen.js"); 8 | const {formats, cleanOpts} = require("./options.js"); 9 | 10 | let classes = new Map(); 11 | 12 | module.exports = (opts = {}) => { 13 | opts = cleanOpts(opts); 14 | return { 15 | postcssPlugin: 'postcss-elm-tailwind', 16 | Rule(rule) { 17 | rule.selector 18 | .split(" ") 19 | .map((sel) => sel.split(",")) 20 | .reduce((arr, v) => (arr.push(...v), arr), []) 21 | .forEach((selector) => processSelector(selector, opts)); 22 | }, 23 | OnceExit() { 24 | const formats_ = formats(opts) 25 | .map(data => splitByScreens(opts, classes, data)) 26 | .flat() 27 | .map(data => { 28 | const fileContent = data.elmBodyFn(data.elmModuleName, data.classesSet); 29 | return writeFile(data.elmFile, fileContent); 30 | } 31 | ); 32 | return tap(Promise.all(formats_), (p) => 33 | p.then((files) => console.log("Saved", files)) 34 | ); 35 | }, 36 | } 37 | }; 38 | 39 | module.exports.postcss = true 40 | 41 | function splitByScreens(opts, classesSet, {elmFile, elmModuleName, elmBodyFn}) { 42 | if (!opts.splitByScreens) { 43 | return [{elmFile, elmModuleName, elmBodyFn, classesSet}] 44 | } 45 | const screens = [...opts.screens]; 46 | screens.push(null) 47 | 48 | return screens.map( 49 | screen => extractScreen(screen, elmFile, elmModuleName, elmBodyFn, classesSet) 50 | ) 51 | } 52 | 53 | let fixClassStartingWithNumber = (className) => 54 | className.match(/(\d+)/) 55 | ? function () { 56 | let number = className.match(/(\d+)/)[0] 57 | let nName = className.replace(number, '') 58 | let firstChar = nName.charAt(0) 59 | let multiChars = firstChar.repeat(number) 60 | return nName.replace(firstChar, multiChars) 61 | }() 62 | : className 63 | 64 | function extractScreen(screen, elmFile, elmModuleName, elmBodyFn, classesSet) { 65 | let newFile = elmFile; 66 | let newModule = elmModuleName; 67 | if (screen !== null) { 68 | let newName = fixClassStartingWithNumber(screen.toUpperCase()) 69 | 70 | newFile = newFile.replace(".elm", `/${newName}.elm`); 71 | newModule = `${newModule}.${newName}`; 72 | } 73 | const newClasses = new Map(); 74 | for (let [cls, val] of classesSet) { 75 | if (screen === val.screen) { 76 | newClasses.set(cls, val); 77 | } 78 | } 79 | return {elmFile: newFile, elmModuleName: newModule, elmBodyFn: elmBodyFn, classesSet: newClasses} 80 | } 81 | 82 | async function writeFile(fname, content) { 83 | let folder = path.dirname(fname); 84 | await mkdir(folder, {recursive: true}); 85 | 86 | return new Promise((resolve, reject) => 87 | fs.writeFile(fname, content, (err) => { 88 | if (err) return reject(err); 89 | resolve(fname); 90 | }) 91 | ); 92 | } 93 | 94 | function processSelector(selector, opts) { 95 | if (!selector.startsWith(".")) { 96 | // Keep only classes 97 | return; 98 | } 99 | 100 | let cls, elm, screen; 101 | 102 | cls = fixClass(selector); 103 | elm = toElmName(cls, opts); 104 | screen = toScreen(cls, opts); 105 | 106 | classes.set(cls, {elm, screen}); 107 | } 108 | 109 | const tap = (v, fn) => { 110 | fn(v); 111 | return v; 112 | }; 113 | -------------------------------------------------------------------------------- /options.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const resolveConfig = require("tailwindcss/resolveConfig"); 3 | const { elmBodyHtml, elmBodyString, elmBodySvg} = require("./code-gen.js") 4 | 5 | const defaultOpts = { 6 | tailwindConfig: null, 7 | splitByScreens: true, 8 | elmFile: "src/TW.elm", 9 | elmModuleName: "TW", 10 | prefix: "", 11 | nameStyle: "snake", 12 | formats: { 13 | /* 14 | string: { 15 | elmFile: "src/TW/String.elm", 16 | }, 17 | svg: { 18 | elmFile: "src/TW/Svg.elm", 19 | } 20 | */ 21 | }, 22 | }; 23 | 24 | function cleanOpts(opts) { 25 | opts = { ...defaultOpts, ...opts }; 26 | opts.formats = { ...opts.formats }; 27 | // grab resolved tailwind config: 28 | if (opts.tailwindConfig === null) { 29 | throw new Error("Failed to specify Tailwind config file. Add a `tailwindConfig` key to your config."); 30 | } 31 | const twConfig = resolveConfig(require(path.resolve(opts.tailwindConfig))); 32 | opts.prefix = twConfig.prefix; 33 | opts.screens = Object.keys(twConfig.theme.screens); 34 | 35 | return opts; 36 | } 37 | 38 | function formats(opts) { 39 | return [ 40 | cleanFormat(opts, elmBodyHtml), 41 | cleanFormat({ ...opts.formats.string }, elmBodyString), 42 | cleanFormat({ ...opts.formats.svg }, elmBodySvg), 43 | ].filter((f) => f); 44 | } 45 | 46 | function cleanFormat({ elmFile, elmModuleName }, elmBodyFn) { 47 | if (!elmFile) return false; 48 | if (!elmModuleName) return false; 49 | return { elmFile, elmModuleName, elmBodyFn }; 50 | } 51 | 52 | exports.cleanOpts = cleanOpts; 53 | exports.defaultOpts = defaultOpts; 54 | exports.formats = formats; 55 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "postcss-elm-tailwind", 3 | "main": "./index.js", 4 | "version": "0.11.0", 5 | "description": "PostCSS plugin Tailwind classes for Elm", 6 | "keywords": [ 7 | "postcss", 8 | "css", 9 | "postcss-plugin", 10 | "elm", 11 | "tailwind" 12 | ], 13 | "scripts": { 14 | "test": "mocha" 15 | }, 16 | "author": "Dean Montgomery", 17 | "license": "MIT", 18 | "repository": "monty5811/postcss-elm-tailwind", 19 | "dependencies": { 20 | "autoprefixer": "^10.3.3", 21 | "tailwindcss": "^2.2.9" 22 | }, 23 | "peerDependencies": { 24 | "postcss": "^8.0.0" 25 | }, 26 | "devDependencies": { 27 | "@tailwindcss/forms": "^0.3.3", 28 | "elm": "^0.19.1-2", 29 | "elm-format": "0.8.3", 30 | "mocha": "^7.2.0", 31 | "postcss": "^8.0.0", 32 | "postcss-cli": "^8.0.0" 33 | }, 34 | "engines": { 35 | "node": ">=12.0.0" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /test/tests.js: -------------------------------------------------------------------------------- 1 | const { fixClass, toElmName, elmFunction } = require("../code-gen.js"); 2 | const { cleanOpts, defaultOpts } = require("../options.js"); 3 | 4 | let assert = require("assert"); 5 | 6 | function toElmName_(cls) { 7 | return toElmName(fixClass(cls), {...defaultOpts, screens: ["sm"]}) 8 | } 9 | 10 | describe("cleanOpts", () => { 11 | it("should throw if no tailwind config supplied", () => { 12 | assert.throws(() => cleanOpts(undefined)); 13 | }); 14 | it("should not override elmFile", () => { 15 | assert.deepStrictEqual(cleanOpts({ elmFile: "src/NotTW.elm", tailwindConfig: "./demo/tailwind.config.js" }), { 16 | elmFile: "src/NotTW.elm", 17 | elmModuleName: "TW", 18 | prefix: "tw-", 19 | nameStyle: "snake", 20 | formats: {}, 21 | splitByScreens: true, 22 | tailwindConfig: "./demo/tailwind.config.js", 23 | screens: ["sm", "md", "lg", "xl", "2xl"] 24 | }); 25 | }); 26 | }); 27 | 28 | describe("fixClass", () => { 29 | it("should let container pass through", () => { 30 | assert.strictEqual(fixClass(".container"), "container"); 31 | }); 32 | it("should let mx-auto pass through", () => { 33 | assert.strictEqual(fixClass(".mx-auto"), "mx-auto"); 34 | }); 35 | it("responsive", () => { 36 | assert.strictEqual(fixClass(".sm:mx-auto"), "sm:mx-auto"); 37 | }); 38 | describe("pseudo-classes", () => { 39 | it("removes :after", () => { 40 | assert.strictEqual( 41 | fixClass(".tw-clearfix:after"), 42 | "tw-clearfix" 43 | ); 44 | }); 45 | it("removes :before", () => { 46 | assert.strictEqual( 47 | fixClass(".fa-accessible-icon:before"), 48 | "fa-accessible-icon" 49 | ); 50 | }); 51 | it("removes :disabled", () => { 52 | assert.strictEqual( 53 | fixClass(".disabled:tw-bg-transparent:disabled"), 54 | "disabled:tw-bg-transparent" 55 | ); 56 | }); 57 | it("removes :focus-within", () => { 58 | assert.strictEqual( 59 | fixClass(".sm:focus-within:tw-text-transparent:focus-within"), 60 | "sm:focus-within:tw-text-transparent" 61 | ); 62 | }); 63 | it("removes :not", () => { 64 | assert.strictEqual( 65 | fixClass(".sm:not(:active)"), 66 | "sm" 67 | ); 68 | }); 69 | it("removes :visited", () => { 70 | assert.strictEqual( 71 | fixClass(".visited:tw-bg-teal-100:visited"), 72 | "visited:tw-bg-teal-100" 73 | ); 74 | }); 75 | it("removes chained pseudo classes", () => { 76 | assert.strictEqual( 77 | fixClass(".visited:tw-bg-teal-100:nth-child(odd):active"), 78 | "visited:tw-bg-teal-100" 79 | ); 80 | }); 81 | }); 82 | it("removes pseudo-elements (::)", () => { 83 | assert.strictEqual(fixClass(".tw-form-select::-ms-expand"), "tw-form-select"); 84 | }); 85 | it("removes pseudo-classes and psuedo-elements", () => { 86 | assert.strictEqual( 87 | fixClass(".focus:placeholder-gray-400:focus::placeholder"), 88 | "focus:placeholder-gray-400" 89 | ); 90 | assert.strictEqual( 91 | fixClass(".focus:tw-placeholder-transparent:focus::-webkit-input-placeholder"), 92 | "focus:tw-placeholder-transparent" 93 | ); 94 | }); 95 | it("removes chained pseudo-classes", () => { 96 | assert.strictEqual( 97 | fixClass(".tw-form-checkbox:checked:focus"), 98 | "tw-form-checkbox" 99 | ); 100 | assert.strictEqual( 101 | fixClass(".tw-form-checkbox:focus:checked"), 102 | "tw-form-checkbox" 103 | ); 104 | }); 105 | it("handles responsive with pseudo-classes", () => { 106 | assert.strictEqual( 107 | fixClass(".lg:active:tw-text-transparent:active"), 108 | "lg:active:tw-text-transparent" 109 | ); 110 | assert.strictEqual( 111 | fixClass(".xl:focus:no-underline:focus"), 112 | "xl:focus:no-underline" 113 | ); 114 | assert.strictEqual( 115 | fixClass(".lg:hover:tw-text-opacity-50:hover"), 116 | "lg:hover:tw-text-opacity-50" 117 | ); 118 | }); 119 | it("with prefix", () => { 120 | assert.strictEqual( 121 | fixClass(".hover:tw-bg-blue-500:hover"), 122 | "hover:tw-bg-blue-500" 123 | ); 124 | }); 125 | it("ratio", () => { 126 | assert.strictEqual(fixClass(".w-1\\/2"), "w-1/2"); 127 | }); 128 | // regression tests for github issue #7: 129 | it("handle variants", () => { 130 | assert.strictEqual( 131 | fixClass(".xl:odd:tw-bg-pink-700:nth-child(odd)"), 132 | "xl:odd:tw-bg-pink-700" 133 | ); 134 | assert.strictEqual( 135 | fixClass(".lg:even:bg-pink-700:nth-child(even)"), 136 | "lg:even:bg-pink-700" 137 | ); 138 | assert.strictEqual( 139 | fixClass(".first:tw-bg-red-400:first-child"), 140 | "first:tw-bg-red-400" 141 | ); 142 | assert.strictEqual( 143 | fixClass(".last:tw-bg-transparent:last-child"), 144 | "last:tw-bg-transparent" 145 | ); 146 | }); 147 | // regession tests for github issue #13 148 | it("handle '.' in class names", () => { 149 | assert.strictEqual(fixClass(".col-gap-1\\.5"), "col-gap-1.5"); 150 | }); 151 | // regression test for font awesome (and a lot of other stuff) 152 | it("handle '>' in class names", () => { 153 | assert.strictEqual(fixClass("fa > li"), "fa"); 154 | assert.strictEqual(fixClass("fa >li"), "fa"); 155 | assert.strictEqual(fixClass("fa> li"), "fa"); 156 | }); 157 | it("handle '\\3' in class names", () => { 158 | assert.strictEqual(fixClass(".\\32xl\\:tw-translate-y-14"), "\\\\32xl:tw-translate-y-14"); 159 | }) 160 | }); 161 | 162 | describe("fixClass -> toElmName", () => { 163 | const camelCaseOpts = { ...defaultOpts, nameStyle: "camel", screens: ["sm"] }; 164 | it("should let container pass through", () => { 165 | assert.strictEqual(toElmName_("container"), "container"); 166 | }); 167 | it("should let mx-auto pass through", () => { 168 | assert.strictEqual(toElmName_("mx-auto"), "mx_auto"); 169 | }); 170 | it("should let mx-auto pass through camel case", () => { 171 | assert.strictEqual(toElmName(fixClass("mx-auto"), camelCaseOpts), "mxAuto"); 172 | }); 173 | it("responsive", () => { 174 | assert.strictEqual(toElmName_("sm:mx-auto"), "mx_auto"); 175 | }); 176 | it("responsive and focus", () => { 177 | assert.strictEqual( 178 | toElmName_(".xl:focus:no-underline:focus"), 179 | "xl__focus__no_underline" 180 | ); 181 | }); 182 | it("over", () => { 183 | assert.strictEqual(toElmName_(".w-1\\/2"), "w_1over2"); 184 | }); 185 | it("negative", () => { 186 | assert.strictEqual(toElmName_(".-m-1"), "neg_m_1"); 187 | }); 188 | it("negative with variant .sm:-m-24", () => { 189 | assert.strictEqual(toElmName_(".sm:-m-24"), "neg_m_24"); 190 | }); 191 | it("negative with variant .sm:-translate-x-1", () => { 192 | assert.strictEqual( 193 | toElmName_(".sm:-translate-x-1"), 194 | "neg_translate_x_1" 195 | ); 196 | assert.strictEqual( 197 | toElmName(fixClass(".sm:-translate-x-1"), {...defaultOpts, splitByScreens: false}), 198 | "sm__neg_translate_x_1" 199 | ); 200 | }); 201 | it("with prefix", () => { 202 | assert.strictEqual( 203 | toElmName(fixClass(".hover:tw-bg-blue-500:hover"), { 204 | ...defaultOpts, 205 | prefix: "tw-", 206 | screens: ["sm"] 207 | }), 208 | "hover__tw_bg_blue_500" 209 | ); 210 | }); 211 | it("negative with prefix and variant .xl:tw--my-64", () => { 212 | assert.strictEqual( 213 | toElmName(fixClass(".xl:tw--my-64"), { 214 | ...defaultOpts, 215 | prefix: "tw-", 216 | screens: ["sm"] 217 | }), 218 | "xl__tw_neg_my_64" 219 | ); 220 | }); 221 | it("negative with prefix and variant .xl:tw--my-64 camel", () => { 222 | assert.strictEqual( 223 | toElmName(fixClass(".xl:tw--my-64"), { 224 | ...camelCaseOpts, 225 | prefix: "tw-", 226 | 227 | }), 228 | "xlTwNegMy64" 229 | ); 230 | }); 231 | it("not-negative with prefix .xl:tw-my-64", () => { 232 | assert.strictEqual( 233 | toElmName(fixClass(".xl:tw-my-64"), { 234 | ...defaultOpts, 235 | prefix: "-tw", 236 | screens: ["sm"] 237 | }), 238 | "xl__tw_my_64" 239 | ); 240 | }); 241 | it("cursor-pointer", () => { 242 | assert.strictEqual(toElmName_(".cursor-pointer"), "cursor_pointer"); 243 | }); 244 | it("font-medium", () => { 245 | assert.strictEqual(toElmName_(".font-medium"), "font_medium"); 246 | }); 247 | // regression tests for github issue #7: 248 | it("handle variants", () => { 249 | assert.strictEqual( 250 | toElmName_(".xl\:odd\:tw-bg-pink-700:nth-child(odd)"), 251 | "xl__odd__tw_bg_pink_700" 252 | ); 253 | assert.strictEqual( 254 | toElmName_(".lg\:even\:tw-bg-pink-700:nth-child(even)"), 255 | "lg__even__tw_bg_pink_700" 256 | ); 257 | assert.strictEqual(toElmName_(".last\:tw-bg-transparent:last-child"), "last__tw_bg_transparent"); 258 | }); 259 | // regession tests for github issue #13 260 | it("handle '.' in class names", () => { 261 | assert.strictEqual(toElmName_(".col-gap-1\\.5"), "col_gap_1_dot_5"); 262 | }); 263 | // regression test for font awesome (and a lot of other stuff) 264 | it("handle '>' in class names", () => { 265 | assert.strictEqual(toElmName_("fa > li"), "fa"); 266 | assert.strictEqual(toElmName_("fa> li"), "fa"); 267 | assert.strictEqual(toElmName_("fa >li"), "fa"); 268 | }); 269 | // regression test for .bottom-0.5 270 | it("handle '.bottom-0.5'", () => { 271 | assert.strictEqual(toElmName_(".bottom-0\.5"), "bottom_0_dot_5"); 272 | }); 273 | // regression test for 2XL 274 | it("handle classes starting with numbers", () => { 275 | assert.strictEqual(toElmName(fixClass(".\\32xl\\:tw-translate-y-14"), { 276 | ...defaultOpts, 277 | screens: ["2xl"] 278 | }), "tw_translate_y_14"); 279 | assert.strictEqual(toElmName(fixClass(".\\32xl\\:focus\\:tw-translate-y-52"), { 280 | ...defaultOpts, 281 | screens: ["2xl"] 282 | }), "focus__tw_translate_y_52"); 283 | }); 284 | }); 285 | 286 | describe("elmFunction", () => { 287 | it("generates Html attributes", () => { 288 | assert.ok( 289 | /Html\.Attribute/.test( 290 | elmFunction( 291 | { type: "Html.Attribute msg", fn: "A.class " }, 292 | "bg-pink-700", 293 | "bg_pink_700" 294 | ) 295 | ) 296 | ); 297 | }); 298 | it("generates Svg attributes", () => { 299 | assert.ok( 300 | /Svg\.Attribute/.test( 301 | elmFunction( 302 | { type: "Svg.Attribute msg", fn: "A.class " }, 303 | "bg-pink-700", 304 | "bg_pink_700" 305 | ) 306 | ) 307 | ); 308 | }); 309 | it("generates strings", () => { 310 | assert.ok( 311 | /String/.test( 312 | elmFunction({ type: "String", fn: "" }, "bg-pink-700", "bg_pink_700") 313 | ) 314 | ); 315 | }); 316 | }); 317 | --------------------------------------------------------------------------------