Commit 893f3c79e762a19e4364964835ebd30cb466c848

Authored by Vben
1 parent e8d6f885

refactor(css): refactored windicss to tailwindcss

Too many changes to show.

To preserve performance only 16 of 17 files are displayed.

.vscode/settings.json
... ... @@ -122,11 +122,13 @@
122 122 "vben",
123 123 "windi",
124 124 "browserslist",
  125 + "tailwindcss",
125 126 "esnext",
126 127 "antv",
127 128 "tinymce",
128 129 "qrcode",
129 130 "sider",
130   - "pinia"
  131 + "pinia",
  132 + "sider"
131 133 ]
132 134 }
... ...
CHANGELOG.zh_CN.md
1   -## Wip
  1 +## 2.5.0(2021-06-20)
  2 +
  3 +## (破坏性更新) Breaking changes
  4 +
  5 +- 将项目`windicss`改为`tailwindcss`,解决内存溢出问题
  6 + - 目前项目不兼容地方有
  7 + - `!xl:m-4` 之类的写法需要改为`xl:!m-4`,注意只有`!`这个不兼容,没用到则不用改
  8 + - `windicss`自身新增的特性需要调整,比如`Attribute`模式不兼容
2 9  
3 10 ### ✨ Refactor
4 11  
... ...
build/vite/plugin/index.ts
... ... @@ -5,7 +5,6 @@ import vueJsx from '@vitejs/plugin-vue-jsx';
5 5 import legacy from '@vitejs/plugin-legacy';
6 6  
7 7 import purgeIcons from 'vite-plugin-purge-icons';
8   -import windiCSS from 'vite-plugin-windicss';
9 8  
10 9 import { configHtmlPlugin } from './html';
11 10 import { configPwaConfig } from './pwa';
... ... @@ -46,9 +45,6 @@ export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
46 45 // vite-plugin-svg-icons
47 46 vitePlugins.push(configSvgIconsPlugin(isBuild));
48 47  
49   - // vite-plugin-windicss
50   - vitePlugins.push(windiCSS());
51   -
52 48 // vite-plugin-mock
53 49 VITE_USE_MOCK && vitePlugins.push(configMockPlugin(isBuild));
54 50  
... ...
jest.config.mjs
... ... @@ -17,7 +17,6 @@ export default {
17 17 ],
18 18 transform: {
19 19 '^.+\\.tsx?$': 'ts-jest',
20   - '^.+\\.(vue)$': 'vue-jest',
21 20 },
22 21 transformIgnorePatterns: ['<rootDir>/tests/__mocks__/', '/node_modules/'],
23 22 // A map from regular expressions to module names that allow to stub out resources with a single module
... ...
package.json
... ... @@ -87,9 +87,8 @@
87 87 "@vitejs/plugin-vue": "^1.2.3",
88 88 "@vitejs/plugin-vue-jsx": "^1.1.5",
89 89 "@vue/compiler-sfc": "3.0.11",
90   - "@vue/test-utils": "^2.0.0-rc.6",
  90 + "@vue/test-utils": "^2.0.0-rc.7",
91 91 "autoprefixer": "^10.2.6",
92   - "babel-jest": "^27.0.2",
93 92 "commitizen": "^4.2.4",
94 93 "conventional-changelog-cli": "^2.1.1",
95 94 "cross-env": "^7.0.3",
... ... @@ -109,6 +108,7 @@
109 108 "jest": "^27.0.4",
110 109 "less": "^4.1.1",
111 110 "lint-staged": "^11.0.0",
  111 + "npm-run-all": "^4.1.5",
112 112 "postcss": "^8.3.5",
113 113 "prettier": "^2.3.1",
114 114 "pretty-quick": "^3.1.1",
... ... @@ -118,10 +118,11 @@
118 118 "stylelint-config-prettier": "^8.0.2",
119 119 "stylelint-config-standard": "^22.0.0",
120 120 "stylelint-order": "^4.1.0",
  121 + "tailwindcss": "^2.2.2",
121 122 "ts-jest": "^27.0.3",
122 123 "ts-node": "^10.0.0",
123 124 "typescript": "4.3.4",
124   - "vite": "2.3.7",
  125 + "vite": "2.3.8",
125 126 "vite-plugin-compression": "^0.2.5",
126 127 "vite-plugin-html": "^2.0.7",
127 128 "vite-plugin-imagemin": "^0.3.2",
... ... @@ -131,9 +132,7 @@
131 132 "vite-plugin-style-import": "^1.0.0",
132 133 "vite-plugin-svg-icons": "^0.7.1",
133 134 "vite-plugin-theme": "^0.8.1",
134   - "vite-plugin-windicss": "^1.0.4",
135 135 "vue-eslint-parser": "^7.6.0",
136   - "vue-jest": "^5.0.0-alpha.10",
137 136 "vue-tsc": "^0.1.7"
138 137 },
139 138 "resolutions": {
... ...
postcss.config.js
1 1 module.exports = {
2 2 plugins: {
  3 + tailwindcss: {},
3 4 autoprefixer: {},
4 5 },
5 6 };
... ...
src/design/tailwind.css 0 → 100644
  1 +/*! tailwindcss v2.2.0 | MIT License | https://tailwindcss.com */
  2 +
  3 +/*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */
  4 +
  5 +/*
  6 +Document
  7 +========
  8 +*/
  9 +
  10 +/**
  11 +Use a better box model (opinionated).
  12 +*/
  13 +
  14 +*,
  15 +::before,
  16 +::after {
  17 + box-sizing: border-box;
  18 +}
  19 +
  20 +/**
  21 +Use a more readable tab size (opinionated).
  22 +*/
  23 +
  24 +html {
  25 + -moz-tab-size: 4;
  26 + -o-tab-size: 4;
  27 + tab-size: 4;
  28 +}
  29 +
  30 +/**
  31 +1. Correct the line height in all browsers.
  32 +2. Prevent adjustments of font size after orientation changes in iOS.
  33 +*/
  34 +
  35 +html {
  36 + line-height: 1.15;
  37 + /* 1 */
  38 + -webkit-text-size-adjust: 100%;
  39 + /* 2 */
  40 +}
  41 +
  42 +/*
  43 +Sections
  44 +========
  45 +*/
  46 +
  47 +/**
  48 +Remove the margin in all browsers.
  49 +*/
  50 +
  51 +body {
  52 + margin: 0;
  53 +}
  54 +
  55 +/**
  56 +Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
  57 +*/
  58 +
  59 +body {
  60 + font-family: system-ui, -apple-system,
  61 + /* Firefox supports this but not yet `system-ui` */ 'Segoe UI', Roboto, Helvetica, Arial,
  62 + sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';
  63 +}
  64 +
  65 +/*
  66 +Grouping content
  67 +================
  68 +*/
  69 +
  70 +/**
  71 +1. Add the correct height in Firefox.
  72 +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
  73 +*/
  74 +
  75 +hr {
  76 + height: 0;
  77 + /* 1 */
  78 + color: inherit;
  79 + /* 2 */
  80 +}
  81 +
  82 +/*
  83 +Text-level semantics
  84 +====================
  85 +*/
  86 +
  87 +/**
  88 +Add the correct text decoration in Chrome, Edge, and Safari.
  89 +*/
  90 +
  91 +abbr[title] {
  92 + -webkit-text-decoration: underline dotted;
  93 + text-decoration: underline dotted;
  94 +}
  95 +
  96 +/**
  97 +Add the correct font weight in Edge and Safari.
  98 +*/
  99 +
  100 +b,
  101 +strong {
  102 + font-weight: bolder;
  103 +}
  104 +
  105 +/**
  106 +1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
  107 +2. Correct the odd 'em' font sizing in all browsers.
  108 +*/
  109 +
  110 +code,
  111 +kbd,
  112 +samp,
  113 +pre {
  114 + font-family: ui-monospace, SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace;
  115 + /* 1 */
  116 + font-size: 1em;
  117 + /* 2 */
  118 +}
  119 +
  120 +/**
  121 +Add the correct font size in all browsers.
  122 +*/
  123 +
  124 +small {
  125 + font-size: 80%;
  126 +}
  127 +
  128 +/**
  129 +Prevent 'sub' and 'sup' elements from affecting the line height in all browsers.
  130 +*/
  131 +
  132 +sub,
  133 +sup {
  134 + font-size: 75%;
  135 + line-height: 0;
  136 + position: relative;
  137 + vertical-align: baseline;
  138 +}
  139 +
  140 +sub {
  141 + bottom: -0.25em;
  142 +}
  143 +
  144 +sup {
  145 + top: -0.5em;
  146 +}
  147 +
  148 +/*
  149 +Tabular data
  150 +============
  151 +*/
  152 +
  153 +/**
  154 +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
  155 +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
  156 +*/
  157 +
  158 +table {
  159 + text-indent: 0;
  160 + /* 1 */
  161 + border-color: inherit;
  162 + /* 2 */
  163 +}
  164 +
  165 +/*
  166 +Forms
  167 +=====
  168 +*/
  169 +
  170 +/**
  171 +1. Change the font styles in all browsers.
  172 +2. Remove the margin in Firefox and Safari.
  173 +*/
  174 +
  175 +button,
  176 +input,
  177 +optgroup,
  178 +select,
  179 +textarea {
  180 + font-family: inherit;
  181 + /* 1 */
  182 + font-size: 100%;
  183 + /* 1 */
  184 + line-height: 1.15;
  185 + /* 1 */
  186 + margin: 0;
  187 + /* 2 */
  188 +}
  189 +
  190 +/**
  191 +Remove the inheritance of text transform in Edge and Firefox.
  192 +1. Remove the inheritance of text transform in Firefox.
  193 +*/
  194 +
  195 +button,
  196 +select {
  197 + /* 1 */
  198 + text-transform: none;
  199 +}
  200 +
  201 +/**
  202 +Correct the inability to style clickable types in iOS and Safari.
  203 +*/
  204 +
  205 +button,
  206 +[type='button'],
  207 +[type='reset'],
  208 +[type='submit'] {
  209 + -webkit-appearance: button;
  210 +}
  211 +
  212 +/**
  213 +Remove the inner border and padding in Firefox.
  214 +*/
  215 +
  216 +::-moz-focus-inner {
  217 + border-style: none;
  218 + padding: 0;
  219 +}
  220 +
  221 +/**
  222 +Restore the focus styles unset by the previous rule.
  223 +*/
  224 +
  225 +:-moz-focusring {
  226 + outline: 1px dotted ButtonText;
  227 +}
  228 +
  229 +/**
  230 +Remove the additional ':invalid' styles in Firefox.
  231 +See: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737
  232 +*/
  233 +
  234 +:-moz-ui-invalid {
  235 + box-shadow: none;
  236 +}
  237 +
  238 +/**
  239 +Remove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.
  240 +*/
  241 +
  242 +legend {
  243 + padding: 0;
  244 +}
  245 +
  246 +/**
  247 +Add the correct vertical alignment in Chrome and Firefox.
  248 +*/
  249 +
  250 +progress {
  251 + vertical-align: baseline;
  252 +}
  253 +
  254 +/**
  255 +Correct the cursor style of increment and decrement buttons in Safari.
  256 +*/
  257 +
  258 +::-webkit-inner-spin-button,
  259 +::-webkit-outer-spin-button {
  260 + height: auto;
  261 +}
  262 +
  263 +/**
  264 +1. Correct the odd appearance in Chrome and Safari.
  265 +2. Correct the outline style in Safari.
  266 +*/
  267 +
  268 +[type='search'] {
  269 + -webkit-appearance: textfield;
  270 + /* 1 */
  271 + outline-offset: -2px;
  272 + /* 2 */
  273 +}
  274 +
  275 +/**
  276 +Remove the inner padding in Chrome and Safari on macOS.
  277 +*/
  278 +
  279 +::-webkit-search-decoration {
  280 + -webkit-appearance: none;
  281 +}
  282 +
  283 +/**
  284 +1. Correct the inability to style clickable types in iOS and Safari.
  285 +2. Change font properties to 'inherit' in Safari.
  286 +*/
  287 +
  288 +::-webkit-file-upload-button {
  289 + -webkit-appearance: button;
  290 + /* 1 */
  291 + font: inherit;
  292 + /* 2 */
  293 +}
  294 +
  295 +/*
  296 +Interactive
  297 +===========
  298 +*/
  299 +
  300 +/*
  301 +Add the correct display in Chrome and Safari.
  302 +*/
  303 +
  304 +summary {
  305 + display: list-item;
  306 +}
  307 +
  308 +/**
  309 + * Manually forked from SUIT CSS Base: https://github.com/suitcss/base
  310 + * A thin layer on top of normalize.css that provides a starting point more
  311 + * suitable for web applications.
  312 + */
  313 +
  314 +/**
  315 + * Removes the default spacing and border for appropriate elements.
  316 + */
  317 +
  318 +blockquote,
  319 +dl,
  320 +dd,
  321 +h1,
  322 +h2,
  323 +h3,
  324 +h4,
  325 +h5,
  326 +h6,
  327 +hr,
  328 +figure,
  329 +p,
  330 +pre {
  331 + margin: 0;
  332 +}
  333 +
  334 +button {
  335 + background-color: transparent;
  336 + background-image: none;
  337 +}
  338 +
  339 +/**
  340 + * Work around a Firefox/IE bug where the transparent `button` background
  341 + * results in a loss of the default `button` focus styles.
  342 + */
  343 +
  344 +button:focus {
  345 + outline: 1px dotted;
  346 + outline: 5px auto -webkit-focus-ring-color;
  347 +}
  348 +
  349 +fieldset {
  350 + margin: 0;
  351 + padding: 0;
  352 +}
  353 +
  354 +ol,
  355 +ul {
  356 + list-style: none;
  357 + margin: 0;
  358 + padding: 0;
  359 +}
  360 +
  361 +/**
  362 + * Tailwind custom reset styles
  363 + */
  364 +
  365 +/**
  366 + * 1. Use the user's configured `sans` font-family (with Tailwind's default
  367 + * sans-serif font stack as a fallback) as a sane default.
  368 + * 2. Use Tailwind's default "normal" line-height so the user isn't forced
  369 + * to override it to ensure consistency even when using the default theme.
  370 + */
  371 +
  372 +html {
  373 + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
  374 + 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
  375 + 'Segoe UI Symbol', 'Noto Color Emoji';
  376 + /* 1 */
  377 + line-height: 1.5;
  378 + /* 2 */
  379 +}
  380 +
  381 +/**
  382 + * Inherit font-family and line-height from `html` so users can set them as
  383 + * a class directly on the `html` element.
  384 + */
  385 +
  386 +body {
  387 + font-family: inherit;
  388 + line-height: inherit;
  389 +}
  390 +
  391 +/**
  392 + * 1. Prevent padding and border from affecting element width.
  393 + *
  394 + * We used to set this in the html element and inherit from
  395 + * the parent element for everything else. This caused issues
  396 + * in shadow-dom-enhanced elements like <details> where the content
  397 + * is wrapped by a div with box-sizing set to `content-box`.
  398 + *
  399 + * https://github.com/mozdevs/cssremedy/issues/4
  400 + *
  401 + *
  402 + * 2. Allow adding a border to an element by just adding a border-width.
  403 + *
  404 + * By default, the way the browser specifies that an element should have no
  405 + * border is by setting it's border-style to `none` in the user-agent
  406 + * stylesheet.
  407 + *
  408 + * In order to easily add borders to elements by just setting the `border-width`
  409 + * property, we change the default border-style for all elements to `solid`, and
  410 + * use border-width to hide them instead. This way our `border` utilities only
  411 + * need to set the `border-width` property instead of the entire `border`
  412 + * shorthand, making our border utilities much more straightforward to compose.
  413 + *
  414 + * https://github.com/tailwindcss/tailwindcss/pull/116
  415 + */
  416 +
  417 +*,
  418 +::before,
  419 +::after {
  420 + box-sizing: border-box;
  421 + /* 1 */
  422 + border-width: 0;
  423 + /* 2 */
  424 + border-style: solid;
  425 + /* 2 */
  426 + border-color: currentColor;
  427 + /* 2 */
  428 +}
  429 +
  430 +/*
  431 + * Ensure horizontal rules are visible by default
  432 + */
  433 +
  434 +hr {
  435 + border-top-width: 1px;
  436 +}
  437 +
  438 +/**
  439 + * Undo the `border-style: none` reset that Normalize applies to images so that
  440 + * our `border-{width}` utilities have the expected effect.
  441 + *
  442 + * The Normalize reset is unnecessary for us since we default the border-width
  443 + * to 0 on all elements.
  444 + *
  445 + * https://github.com/tailwindcss/tailwindcss/issues/362
  446 + */
  447 +
  448 +img {
  449 + border-style: solid;
  450 +}
  451 +
  452 +textarea {
  453 + resize: vertical;
  454 +}
  455 +
  456 +input::-moz-placeholder,
  457 +textarea::-moz-placeholder {
  458 + opacity: 1;
  459 + color: #a1a1aa;
  460 +}
  461 +
  462 +input:-ms-input-placeholder,
  463 +textarea:-ms-input-placeholder {
  464 + opacity: 1;
  465 + color: #a1a1aa;
  466 +}
  467 +
  468 +input::placeholder,
  469 +textarea::placeholder {
  470 + opacity: 1;
  471 + color: #a1a1aa;
  472 +}
  473 +
  474 +button,
  475 +[role='button'] {
  476 + cursor: pointer;
  477 +}
  478 +
  479 +table {
  480 + border-collapse: collapse;
  481 +}
  482 +
  483 +h1,
  484 +h2,
  485 +h3,
  486 +h4,
  487 +h5,
  488 +h6 {
  489 + font-size: inherit;
  490 + font-weight: inherit;
  491 +}
  492 +
  493 +/**
  494 + * Reset links to optimize for opt-in styling instead of
  495 + * opt-out.
  496 + */
  497 +
  498 +a {
  499 + color: inherit;
  500 + text-decoration: inherit;
  501 +}
  502 +
  503 +/**
  504 + * Reset form element properties that are easy to forget to
  505 + * style explicitly so you don't inadvertently introduce
  506 + * styles that deviate from your design system. These styles
  507 + * supplement a partial reset that is already applied by
  508 + * normalize.css.
  509 + */
  510 +
  511 +button,
  512 +input,
  513 +optgroup,
  514 +select,
  515 +textarea {
  516 + padding: 0;
  517 + line-height: inherit;
  518 + color: inherit;
  519 +}
  520 +
  521 +/**
  522 + * Use the configured 'mono' font family for elements that
  523 + * are expected to be rendered with a monospace font, falling
  524 + * back to the system monospace stack if there is no configured
  525 + * 'mono' font family.
  526 + */
  527 +
  528 +pre,
  529 +code,
  530 +kbd,
  531 +samp {
  532 + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono',
  533 + 'Courier New', monospace;
  534 +}
  535 +
  536 +/**
  537 + * 1. Make replaced elements `display: block` by default as that's
  538 + * the behavior you want almost all of the time. Inspired by
  539 + * CSS Remedy, with `svg` added as well.
  540 + *
  541 + * https://github.com/mozdevs/cssremedy/issues/14
  542 + *
  543 + * 2. Add `vertical-align: middle` to align replaced elements more
  544 + * sensibly by default when overriding `display` by adding a
  545 + * utility like `inline`.
  546 + *
  547 + * This can trigger a poorly considered linting error in some
  548 + * tools but is included by design.
  549 + *
  550 + * https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210
  551 + */
  552 +
  553 +img,
  554 +svg,
  555 +video,
  556 +canvas,
  557 +audio,
  558 +iframe,
  559 +embed,
  560 +object {
  561 + display: block;
  562 + /* 1 */
  563 + vertical-align: middle;
  564 + /* 2 */
  565 +}
  566 +
  567 +/**
  568 + * Constrain images and videos to the parent width and preserve
  569 + * their intrinsic aspect ratio.
  570 + *
  571 + * https://github.com/mozdevs/cssremedy/issues/14
  572 + */
  573 +
  574 +img,
  575 +video {
  576 + max-width: 100%;
  577 + height: auto;
  578 +}
  579 +
  580 +*,
  581 +::before,
  582 +::after {
  583 + --tw-translate-x: 0;
  584 + --tw-translate-y: 0;
  585 + --tw-rotate: 0;
  586 + --tw-skew-x: 0;
  587 + --tw-skew-y: 0;
  588 + --tw-scale-x: 1;
  589 + --tw-scale-y: 1;
  590 + --tw-transform: translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y))
  591 + rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y))
  592 + scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
  593 + --tw-border-opacity: 1;
  594 + border-color: rgba(228, 228, 231, var(--tw-border-opacity));
  595 + --tw-shadow: 0 0 #0000;
  596 + --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/);
  597 + --tw-ring-offset-width: 0px;
  598 + --tw-ring-offset-color: #fff;
  599 + --tw-ring-color: rgba(59, 130, 246, 0.5);
  600 + --tw-ring-offset-shadow: 0 0 #0000;
  601 + --tw-ring-shadow: 0 0 #0000;
  602 + --tw-blur: var(--tw-empty, /*!*/ /*!*/);
  603 + --tw-brightness: var(--tw-empty, /*!*/ /*!*/);
  604 + --tw-contrast: var(--tw-empty, /*!*/ /*!*/);
  605 + --tw-grayscale: var(--tw-empty, /*!*/ /*!*/);
  606 + --tw-hue-rotate: var(--tw-empty, /*!*/ /*!*/);
  607 + --tw-invert: var(--tw-empty, /*!*/ /*!*/);
  608 + --tw-saturate: var(--tw-empty, /*!*/ /*!*/);
  609 + --tw-sepia: var(--tw-empty, /*!*/ /*!*/);
  610 + --tw-drop-shadow: var(--tw-empty, /*!*/ /*!*/);
  611 + --tw-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale)
  612 + var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
  613 + --tw-backdrop-blur: var(--tw-empty, /*!*/ /*!*/);
  614 + --tw-backdrop-brightness: var(--tw-empty, /*!*/ /*!*/);
  615 + --tw-backdrop-contrast: var(--tw-empty, /*!*/ /*!*/);
  616 + --tw-backdrop-grayscale: var(--tw-empty, /*!*/ /*!*/);
  617 + --tw-backdrop-hue-rotate: var(--tw-empty, /*!*/ /*!*/);
  618 + --tw-backdrop-invert: var(--tw-empty, /*!*/ /*!*/);
  619 + --tw-backdrop-opacity: var(--tw-empty, /*!*/ /*!*/);
  620 + --tw-backdrop-saturate: var(--tw-empty, /*!*/ /*!*/);
  621 + --tw-backdrop-sepia: var(--tw-empty, /*!*/ /*!*/);
  622 + --tw-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness)
  623 + var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate)
  624 + var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate)
  625 + var(--tw-backdrop-sepia);
  626 +}
  627 +
  628 +* > .enter-x:nth-child(1) {
  629 + transform: translateX(50px);
  630 +}
  631 +
  632 +* > .-enter-x:nth-child(1) {
  633 + transform: translateX(-50px);
  634 +}
  635 +
  636 +* > .enter-x:nth-child(1),
  637 +* > .-enter-x:nth-child(1) {
  638 + z-index: 9;
  639 + opacity: 0;
  640 + -webkit-animation: enter-x-animation 0.4s ease-in-out 0.3s;
  641 + animation: enter-x-animation 0.4s ease-in-out 0.3s;
  642 + -webkit-animation-fill-mode: forwards;
  643 + animation-fill-mode: forwards;
  644 + -webkit-animation-delay: 0.1s;
  645 + animation-delay: 0.1s;
  646 +}
  647 +
  648 +* > .enter-y:nth-child(1) {
  649 + transform: translateY(50px);
  650 +}
  651 +
  652 +* > .enter-y:nth-child(1),
  653 +* > .-enter-y:nth-child(1) {
  654 + z-index: 9;
  655 + opacity: 0;
  656 + -webkit-animation: enter-y-animation 0.4s ease-in-out 0.3s;
  657 + animation: enter-y-animation 0.4s ease-in-out 0.3s;
  658 + -webkit-animation-fill-mode: forwards;
  659 + animation-fill-mode: forwards;
  660 + -webkit-animation-delay: 0.1s;
  661 + animation-delay: 0.1s;
  662 +}
  663 +
  664 +* > .enter-x:nth-child(2) {
  665 + transform: translateX(50px);
  666 +}
  667 +
  668 +* > .-enter-x:nth-child(2) {
  669 + transform: translateX(-50px);
  670 +}
  671 +
  672 +* > .enter-x:nth-child(2),
  673 +* > .-enter-x:nth-child(2) {
  674 + z-index: 8;
  675 + opacity: 0;
  676 + -webkit-animation: enter-x-animation 0.4s ease-in-out 0.3s;
  677 + animation: enter-x-animation 0.4s ease-in-out 0.3s;
  678 + -webkit-animation-fill-mode: forwards;
  679 + animation-fill-mode: forwards;
  680 + -webkit-animation-delay: 0.2s;
  681 + animation-delay: 0.2s;
  682 +}
  683 +
  684 +* > .enter-y:nth-child(2) {
  685 + transform: translateY(50px);
  686 +}
  687 +
  688 +* > .enter-y:nth-child(2),
  689 +* > .-enter-y:nth-child(2) {
  690 + z-index: 8;
  691 + opacity: 0;
  692 + -webkit-animation: enter-y-animation 0.4s ease-in-out 0.3s;
  693 + animation: enter-y-animation 0.4s ease-in-out 0.3s;
  694 + -webkit-animation-fill-mode: forwards;
  695 + animation-fill-mode: forwards;
  696 + -webkit-animation-delay: 0.2s;
  697 + animation-delay: 0.2s;
  698 +}
  699 +
  700 +* > .enter-x:nth-child(3) {
  701 + transform: translateX(50px);
  702 +}
  703 +
  704 +* > .-enter-x:nth-child(3) {
  705 + transform: translateX(-50px);
  706 +}
  707 +
  708 +* > .enter-x:nth-child(3),
  709 +* > .-enter-x:nth-child(3) {
  710 + z-index: 7;
  711 + opacity: 0;
  712 + -webkit-animation: enter-x-animation 0.4s ease-in-out 0.3s;
  713 + animation: enter-x-animation 0.4s ease-in-out 0.3s;
  714 + -webkit-animation-fill-mode: forwards;
  715 + animation-fill-mode: forwards;
  716 + -webkit-animation-delay: 0.3s;
  717 + animation-delay: 0.3s;
  718 +}
  719 +
  720 +* > .enter-y:nth-child(3) {
  721 + transform: translateY(50px);
  722 +}
  723 +
  724 +* > .enter-y:nth-child(3),
  725 +* > .-enter-y:nth-child(3) {
  726 + z-index: 7;
  727 + opacity: 0;
  728 + -webkit-animation: enter-y-animation 0.4s ease-in-out 0.3s;
  729 + animation: enter-y-animation 0.4s ease-in-out 0.3s;
  730 + -webkit-animation-fill-mode: forwards;
  731 + animation-fill-mode: forwards;
  732 + -webkit-animation-delay: 0.3s;
  733 + animation-delay: 0.3s;
  734 +}
  735 +
  736 +* > .enter-x:nth-child(4) {
  737 + transform: translateX(50px);
  738 +}
  739 +
  740 +* > .-enter-x:nth-child(4) {
  741 + transform: translateX(-50px);
  742 +}
  743 +
  744 +* > .enter-x:nth-child(4),
  745 +* > .-enter-x:nth-child(4) {
  746 + z-index: 6;
  747 + opacity: 0;
  748 + -webkit-animation: enter-x-animation 0.4s ease-in-out 0.3s;
  749 + animation: enter-x-animation 0.4s ease-in-out 0.3s;
  750 + -webkit-animation-fill-mode: forwards;
  751 + animation-fill-mode: forwards;
  752 + -webkit-animation-delay: 0.4s;
  753 + animation-delay: 0.4s;
  754 +}
  755 +
  756 +* > .enter-y:nth-child(4) {
  757 + transform: translateY(50px);
  758 +}
  759 +
  760 +* > .enter-y:nth-child(4),
  761 +* > .-enter-y:nth-child(4) {
  762 + z-index: 6;
  763 + opacity: 0;
  764 + -webkit-animation: enter-y-animation 0.4s ease-in-out 0.3s;
  765 + animation: enter-y-animation 0.4s ease-in-out 0.3s;
  766 + -webkit-animation-fill-mode: forwards;
  767 + animation-fill-mode: forwards;
  768 + -webkit-animation-delay: 0.4s;
  769 + animation-delay: 0.4s;
  770 +}
  771 +
  772 +* > .enter-x:nth-child(5) {
  773 + transform: translateX(50px);
  774 +}
  775 +
  776 +* > .-enter-x:nth-child(5) {
  777 + transform: translateX(-50px);
  778 +}
  779 +
  780 +* > .enter-x:nth-child(5),
  781 +* > .-enter-x:nth-child(5) {
  782 + z-index: 5;
  783 + opacity: 0;
  784 + -webkit-animation: enter-x-animation 0.4s ease-in-out 0.3s;
  785 + animation: enter-x-animation 0.4s ease-in-out 0.3s;
  786 + -webkit-animation-fill-mode: forwards;
  787 + animation-fill-mode: forwards;
  788 + -webkit-animation-delay: 0.5s;
  789 + animation-delay: 0.5s;
  790 +}
  791 +
  792 +* > .enter-y:nth-child(5) {
  793 + transform: translateY(50px);
  794 +}
  795 +
  796 +* > .enter-y:nth-child(5),
  797 +* > .-enter-y:nth-child(5) {
  798 + z-index: 5;
  799 + opacity: 0;
  800 + -webkit-animation: enter-y-animation 0.4s ease-in-out 0.3s;
  801 + animation: enter-y-animation 0.4s ease-in-out 0.3s;
  802 + -webkit-animation-fill-mode: forwards;
  803 + animation-fill-mode: forwards;
  804 + -webkit-animation-delay: 0.5s;
  805 + animation-delay: 0.5s;
  806 +}
  807 +
  808 +@-webkit-keyframes enter-x-animation {
  809 + to {
  810 + opacity: 1;
  811 + transform: translateX(0);
  812 + }
  813 +}
  814 +
  815 +@keyframes enter-x-animation {
  816 + to {
  817 + opacity: 1;
  818 + transform: translateX(0);
  819 + }
  820 +}
  821 +
  822 +@-webkit-keyframes enter-y-animation {
  823 + to {
  824 + opacity: 1;
  825 + transform: translateY(0);
  826 + }
  827 +}
  828 +
  829 +@keyframes enter-y-animation {
  830 + to {
  831 + opacity: 1;
  832 + transform: translateY(0);
  833 + }
  834 +}
  835 +
  836 +.container {
  837 + width: 100%;
  838 +}
  839 +
  840 +@media (min-width: 576px) {
  841 + .container {
  842 + max-width: 576px;
  843 + }
  844 +}
  845 +
  846 +@media (min-width: 768px) {
  847 + .container {
  848 + max-width: 768px;
  849 + }
  850 +}
  851 +
  852 +@media (min-width: 992px) {
  853 + .container {
  854 + max-width: 992px;
  855 + }
  856 +}
  857 +
  858 +@media (min-width: 1200px) {
  859 + .container {
  860 + max-width: 1200px;
  861 + }
  862 +}
  863 +
  864 +@media (min-width: 1600px) {
  865 + .container {
  866 + max-width: 1600px;
  867 + }
  868 +}
  869 +
  870 +.visible {
  871 + visibility: visible;
  872 +}
  873 +
  874 +.invisible {
  875 + visibility: hidden;
  876 +}
  877 +
  878 +.static {
  879 + position: static;
  880 +}
  881 +
  882 +.fixed {
  883 + position: fixed;
  884 +}
  885 +
  886 +.absolute {
  887 + position: absolute;
  888 +}
  889 +
  890 +.relative {
  891 + position: relative;
  892 +}
  893 +
  894 +.inset-0 {
  895 + top: 0px;
  896 + right: 0px;
  897 + bottom: 0px;
  898 + left: 0px;
  899 +}
  900 +
  901 +.top-0 {
  902 + top: 0px;
  903 +}
  904 +
  905 +.left-1\/2 {
  906 + left: 50%;
  907 +}
  908 +
  909 +.left-5 {
  910 + left: 1.25rem;
  911 +}
  912 +
  913 +.top-5 {
  914 + top: 1.25rem;
  915 +}
  916 +
  917 +.bottom-5 {
  918 + bottom: 1.25rem;
  919 +}
  920 +
  921 +.top-4 {
  922 + top: 1rem;
  923 +}
  924 +
  925 +.right-4 {
  926 + right: 1rem;
  927 +}
  928 +
  929 +.top-3 {
  930 + top: 0.75rem;
  931 +}
  932 +
  933 +.right-7 {
  934 + right: 1.75rem;
  935 +}
  936 +
  937 +.m-3 {
  938 + margin: 0.75rem;
  939 +}
  940 +
  941 +.m-10 {
  942 + margin: 2.5rem;
  943 +}
  944 +
  945 +.m-4 {
  946 + margin: 1rem;
  947 +}
  948 +
  949 +.m-5 {
  950 + margin: 1.25rem;
  951 +}
  952 +
  953 +.mx-auto {
  954 + margin-left: auto;
  955 + margin-right: auto;
  956 +}
  957 +
  958 +.\!my-4 {
  959 + margin-top: 1rem !important;
  960 + margin-bottom: 1rem !important;
  961 +}
  962 +
  963 +.mx-4 {
  964 + margin-left: 1rem;
  965 + margin-right: 1rem;
  966 +}
  967 +
  968 +.my-4 {
  969 + margin-top: 1rem;
  970 + margin-bottom: 1rem;
  971 +}
  972 +
  973 +.my-auto {
  974 + margin-top: auto;
  975 + margin-bottom: auto;
  976 +}
  977 +
  978 +.\!my-2 {
  979 + margin-top: 0.5rem !important;
  980 + margin-bottom: 0.5rem !important;
  981 +}
  982 +
  983 +.mx-1 {
  984 + margin-left: 0.25rem;
  985 + margin-right: 0.25rem;
  986 +}
  987 +
  988 +.my-3 {
  989 + margin-top: 0.75rem;
  990 + margin-bottom: 0.75rem;
  991 +}
  992 +
  993 +.\!mx-auto {
  994 + margin-left: auto !important;
  995 + margin-right: auto !important;
  996 +}
  997 +
  998 +.mx-12 {
  999 + margin-left: 3rem;
  1000 + margin-right: 3rem;
  1001 +}
  1002 +
  1003 +.my-2 {
  1004 + margin-top: 0.5rem;
  1005 + margin-bottom: 0.5rem;
  1006 +}
  1007 +
  1008 +.my-5 {
  1009 + margin-top: 1.25rem;
  1010 + margin-bottom: 1.25rem;
  1011 +}
  1012 +
  1013 +.mx-2 {
  1014 + margin-left: 0.5rem;
  1015 + margin-right: 0.5rem;
  1016 +}
  1017 +
  1018 +.ml-1 {
  1019 + margin-left: 0.25rem;
  1020 +}
  1021 +
  1022 +.ml-2 {
  1023 + margin-left: 0.5rem;
  1024 +}
  1025 +
  1026 +.mr-2 {
  1027 + margin-right: 0.5rem;
  1028 +}
  1029 +
  1030 +.mr-1 {
  1031 + margin-right: 0.25rem;
  1032 +}
  1033 +
  1034 +.mt-1 {
  1035 + margin-top: 0.25rem;
  1036 +}
  1037 +
  1038 +.mt-2 {
  1039 + margin-top: 0.5rem;
  1040 +}
  1041 +
  1042 +.\!mt-4 {
  1043 + margin-top: 1rem !important;
  1044 +}
  1045 +
  1046 +.mb-1 {
  1047 + margin-bottom: 0.25rem;
  1048 +}
  1049 +
  1050 +.\!mr-4 {
  1051 + margin-right: 1rem !important;
  1052 +}
  1053 +
  1054 +.mt-4 {
  1055 + margin-top: 1rem;
  1056 +}
  1057 +
  1058 +.mb-4 {
  1059 + margin-bottom: 1rem;
  1060 +}
  1061 +
  1062 +.mt-5 {
  1063 + margin-top: 1.25rem;
  1064 +}
  1065 +
  1066 +.mt-10 {
  1067 + margin-top: 2.5rem;
  1068 +}
  1069 +
  1070 +.ml-4 {
  1071 + margin-left: 1rem;
  1072 +}
  1073 +
  1074 +.mr-5 {
  1075 + margin-right: 1.25rem;
  1076 +}
  1077 +
  1078 +.mr-4 {
  1079 + margin-right: 1rem;
  1080 +}
  1081 +
  1082 +.-mt-16 {
  1083 + margin-top: -4rem;
  1084 +}
  1085 +
  1086 +.mb-6 {
  1087 + margin-bottom: 1.5rem;
  1088 +}
  1089 +
  1090 +.mr-10 {
  1091 + margin-right: 2.5rem;
  1092 +}
  1093 +
  1094 +.mb-2 {
  1095 + margin-bottom: 0.5rem;
  1096 +}
  1097 +
  1098 +.mr-0 {
  1099 + margin-right: 0px;
  1100 +}
  1101 +
  1102 +.\!ml-4 {
  1103 + margin-left: 1rem !important;
  1104 +}
  1105 +
  1106 +.ml-5 {
  1107 + margin-left: 1.25rem;
  1108 +}
  1109 +
  1110 +.block {
  1111 + display: block;
  1112 +}
  1113 +
  1114 +.\!block {
  1115 + display: block !important;
  1116 +}
  1117 +
  1118 +.inline-block {
  1119 + display: inline-block;
  1120 +}
  1121 +
  1122 +.inline {
  1123 + display: inline;
  1124 +}
  1125 +
  1126 +.flex {
  1127 + display: flex;
  1128 +}
  1129 +
  1130 +.inline-flex {
  1131 + display: inline-flex;
  1132 +}
  1133 +
  1134 +.table {
  1135 + display: table;
  1136 +}
  1137 +
  1138 +.\!table {
  1139 + display: table !important;
  1140 +}
  1141 +
  1142 +.grid {
  1143 + display: grid;
  1144 +}
  1145 +
  1146 +.contents {
  1147 + display: contents;
  1148 +}
  1149 +
  1150 +.list-item {
  1151 + display: list-item;
  1152 +}
  1153 +
  1154 +.hidden {
  1155 + display: none;
  1156 +}
  1157 +
  1158 +.h-full {
  1159 + height: 100%;
  1160 +}
  1161 +
  1162 +.h-20 {
  1163 + height: 5rem;
  1164 +}
  1165 +
  1166 +.h-screen {
  1167 + height: 100vh;
  1168 +}
  1169 +
  1170 +.h-16 {
  1171 + height: 4rem;
  1172 +}
  1173 +
  1174 +.h-2\/5 {
  1175 + height: 40%;
  1176 +}
  1177 +
  1178 +.\!h-full {
  1179 + height: 100% !important;
  1180 +}
  1181 +
  1182 +.h-10 {
  1183 + height: 2.5rem;
  1184 +}
  1185 +
  1186 +.h-32 {
  1187 + height: 8rem;
  1188 +}
  1189 +
  1190 +.h-64 {
  1191 + height: 16rem;
  1192 +}
  1193 +
  1194 +.max-h-80 {
  1195 + max-height: 20rem;
  1196 +}
  1197 +
  1198 +.min-h-full {
  1199 + min-height: 100%;
  1200 +}
  1201 +
  1202 +.w-full {
  1203 + width: 100%;
  1204 +}
  1205 +
  1206 +.w-2\/3 {
  1207 + width: 66.666667%;
  1208 +}
  1209 +
  1210 +.w-1\/3 {
  1211 + width: 33.333333%;
  1212 +}
  1213 +
  1214 +.w-screen {
  1215 + width: 100vw;
  1216 +}
  1217 +
  1218 +.w-2\/5 {
  1219 + width: 40%;
  1220 +}
  1221 +
  1222 +.w-1\/2 {
  1223 + width: 50%;
  1224 +}
  1225 +
  1226 +.\!w-full {
  1227 + width: 100% !important;
  1228 +}
  1229 +
  1230 +.w-12 {
  1231 + width: 3rem;
  1232 +}
  1233 +
  1234 +.w-1\/4 {
  1235 + width: 25%;
  1236 +}
  1237 +
  1238 +.w-3\/4 {
  1239 + width: 75%;
  1240 +}
  1241 +
  1242 +.flex-1 {
  1243 + flex: 1 1 0%;
  1244 +}
  1245 +
  1246 +.flex-shrink {
  1247 + flex-shrink: 1;
  1248 +}
  1249 +
  1250 +.flex-grow-0 {
  1251 + flex-grow: 0;
  1252 +}
  1253 +
  1254 +.border-collapse {
  1255 + border-collapse: collapse;
  1256 +}
  1257 +
  1258 +.translate-x-1\/2 {
  1259 + --tw-translate-x: 50%;
  1260 + transform: var(--tw-transform);
  1261 +}
  1262 +
  1263 +.cursor-pointer {
  1264 + cursor: pointer;
  1265 +}
  1266 +
  1267 +.cursor-not-allowed {
  1268 + cursor: not-allowed;
  1269 +}
  1270 +
  1271 +.resize {
  1272 + resize: both;
  1273 +}
  1274 +
  1275 +.flex-col {
  1276 + flex-direction: column;
  1277 +}
  1278 +
  1279 +.flex-wrap {
  1280 + flex-wrap: wrap;
  1281 +}
  1282 +
  1283 +.items-center {
  1284 + align-items: center;
  1285 +}
  1286 +
  1287 +.justify-end {
  1288 + justify-content: flex-end;
  1289 +}
  1290 +
  1291 +.justify-center {
  1292 + justify-content: center;
  1293 +}
  1294 +
  1295 +.justify-between {
  1296 + justify-content: space-between;
  1297 +}
  1298 +
  1299 +.justify-around {
  1300 + justify-content: space-around;
  1301 +}
  1302 +
  1303 +.justify-evenly {
  1304 + justify-content: space-evenly;
  1305 +}
  1306 +
  1307 +.overflow-auto {
  1308 + overflow: auto;
  1309 +}
  1310 +
  1311 +.overflow-hidden {
  1312 + overflow: hidden;
  1313 +}
  1314 +
  1315 +.truncate {
  1316 + overflow: hidden;
  1317 + text-overflow: ellipsis;
  1318 + white-space: nowrap;
  1319 +}
  1320 +
  1321 +.rounded-md {
  1322 + border-radius: 0.375rem;
  1323 +}
  1324 +
  1325 +.border {
  1326 + border-width: 1px;
  1327 +}
  1328 +
  1329 +.\!border {
  1330 + border-width: 1px !important;
  1331 +}
  1332 +
  1333 +.border-t-0 {
  1334 + border-top-width: 0px;
  1335 +}
  1336 +
  1337 +.border-solid {
  1338 + border-style: solid;
  1339 +}
  1340 +
  1341 +.border-primary {
  1342 + --tw-border-opacity: 1;
  1343 + border-color: rgba(9, 96, 189, var(--tw-border-opacity));
  1344 +}
  1345 +
  1346 +.bg-black {
  1347 + --tw-bg-opacity: 1;
  1348 + background-color: rgba(0, 0, 0, var(--tw-bg-opacity));
  1349 +}
  1350 +
  1351 +.bg-gray-700 {
  1352 + --tw-bg-opacity: 1;
  1353 + background-color: rgba(63, 63, 70, var(--tw-bg-opacity));
  1354 +}
  1355 +
  1356 +.bg-white {
  1357 + --tw-bg-opacity: 1;
  1358 + background-color: rgba(255, 255, 255, var(--tw-bg-opacity));
  1359 +}
  1360 +
  1361 +.p-2 {
  1362 + padding: 0.5rem;
  1363 +}
  1364 +
  1365 +.p-5 {
  1366 + padding: 1.25rem;
  1367 +}
  1368 +
  1369 +.p-4 {
  1370 + padding: 1rem;
  1371 +}
  1372 +
  1373 +.p-1 {
  1374 + padding: 0.25rem;
  1375 +}
  1376 +
  1377 +.p-3 {
  1378 + padding: 0.75rem;
  1379 +}
  1380 +
  1381 +.p-10 {
  1382 + padding: 2.5rem;
  1383 +}
  1384 +
  1385 +.px-4 {
  1386 + padding-left: 1rem;
  1387 + padding-right: 1rem;
  1388 +}
  1389 +
  1390 +.px-2 {
  1391 + padding-left: 0.5rem;
  1392 + padding-right: 0.5rem;
  1393 +}
  1394 +
  1395 +.py-1 {
  1396 + padding-top: 0.25rem;
  1397 + padding-bottom: 0.25rem;
  1398 +}
  1399 +
  1400 +.py-2 {
  1401 + padding-top: 0.5rem;
  1402 + padding-bottom: 0.5rem;
  1403 +}
  1404 +
  1405 +.py-1\.5 {
  1406 + padding-top: 0.375rem;
  1407 + padding-bottom: 0.375rem;
  1408 +}
  1409 +
  1410 +.py-5 {
  1411 + padding-top: 1.25rem;
  1412 + padding-bottom: 1.25rem;
  1413 +}
  1414 +
  1415 +.px-5 {
  1416 + padding-left: 1.25rem;
  1417 + padding-right: 1.25rem;
  1418 +}
  1419 +
  1420 +.py-8 {
  1421 + padding-top: 2rem;
  1422 + padding-bottom: 2rem;
  1423 +}
  1424 +
  1425 +.py-4 {
  1426 + padding-top: 1rem;
  1427 + padding-bottom: 1rem;
  1428 +}
  1429 +
  1430 +.pl-2 {
  1431 + padding-left: 0.5rem;
  1432 +}
  1433 +
  1434 +.pt-5 {
  1435 + padding-top: 1.25rem;
  1436 +}
  1437 +
  1438 +.pl-4 {
  1439 + padding-left: 1rem;
  1440 +}
  1441 +
  1442 +.pt-4 {
  1443 + padding-top: 1rem;
  1444 +}
  1445 +
  1446 +.text-center {
  1447 + text-align: center;
  1448 +}
  1449 +
  1450 +.text-right {
  1451 + text-align: right;
  1452 +}
  1453 +
  1454 +.text-4xl {
  1455 + font-size: 2.25rem;
  1456 + line-height: 2.5rem;
  1457 +}
  1458 +
  1459 +.text-5xl {
  1460 + font-size: 3rem;
  1461 + line-height: 1;
  1462 +}
  1463 +
  1464 +.text-3xl {
  1465 + font-size: 1.875rem;
  1466 + line-height: 2.25rem;
  1467 +}
  1468 +
  1469 +.text-2xl {
  1470 + font-size: 1.5rem;
  1471 + line-height: 2rem;
  1472 +}
  1473 +
  1474 +.text-lg {
  1475 + font-size: 1.125rem;
  1476 + line-height: 1.75rem;
  1477 +}
  1478 +
  1479 +.font-medium {
  1480 + font-weight: 500;
  1481 +}
  1482 +
  1483 +.font-normal {
  1484 + font-weight: 400;
  1485 +}
  1486 +
  1487 +.font-bold {
  1488 + font-weight: 700;
  1489 +}
  1490 +
  1491 +.uppercase {
  1492 + text-transform: uppercase;
  1493 +}
  1494 +
  1495 +.italic {
  1496 + font-style: italic;
  1497 +}
  1498 +
  1499 +.text-white {
  1500 + --tw-text-opacity: 1;
  1501 + color: rgba(255, 255, 255, var(--tw-text-opacity));
  1502 +}
  1503 +
  1504 +.text-gray-300 {
  1505 + --tw-text-opacity: 1;
  1506 + color: rgba(212, 212, 216, var(--tw-text-opacity));
  1507 +}
  1508 +
  1509 +.text-primary {
  1510 + --tw-text-opacity: 1;
  1511 + color: rgba(9, 96, 189, var(--tw-text-opacity));
  1512 +}
  1513 +
  1514 +.underline {
  1515 + text-decoration: underline;
  1516 +}
  1517 +
  1518 +.shadow {
  1519 + --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
  1520 + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000),
  1521 + var(--tw-shadow);
  1522 +}
  1523 +
  1524 +.shadow-md {
  1525 + --tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
  1526 + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000),
  1527 + var(--tw-shadow);
  1528 +}
  1529 +
  1530 +.blur {
  1531 + --tw-blur: blur(8px);
  1532 + filter: var(--tw-filter);
  1533 +}
  1534 +
  1535 +.transition {
  1536 + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow,
  1537 + transform, filter, -webkit-backdrop-filter;
  1538 + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow,
  1539 + transform, filter, backdrop-filter;
  1540 + transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow,
  1541 + transform, filter, backdrop-filter, -webkit-backdrop-filter;
  1542 + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  1543 + transition-duration: 150ms;
  1544 +}
  1545 +
  1546 +.hover\:border-primary:hover {
  1547 + --tw-border-opacity: 1;
  1548 + border-color: rgba(9, 96, 189, var(--tw-border-opacity));
  1549 +}
  1550 +
  1551 +@media (min-width: 576px) {
  1552 + .sm\:w-3\/4 {
  1553 + width: 75%;
  1554 + }
  1555 +
  1556 + .sm\:px-10 {
  1557 + padding-left: 2.5rem;
  1558 + padding-right: 2.5rem;
  1559 + }
  1560 +
  1561 + .sm\:px-8 {
  1562 + padding-left: 2rem;
  1563 + padding-right: 2rem;
  1564 + }
  1565 +}
  1566 +
  1567 +@media (min-width: 768px) {
  1568 + .md\:\!mx-4 {
  1569 + margin-left: 1rem !important;
  1570 + margin-right: 1rem !important;
  1571 + }
  1572 +
  1573 + .md\:\!my-0 {
  1574 + margin-top: 0px !important;
  1575 + margin-bottom: 0px !important;
  1576 + }
  1577 +
  1578 + .md\:mx-2 {
  1579 + margin-left: 0.5rem;
  1580 + margin-right: 0.5rem;
  1581 + }
  1582 +
  1583 + .md\:mx-16 {
  1584 + margin-left: 4rem;
  1585 + margin-right: 4rem;
  1586 + }
  1587 +
  1588 + .md\:mr-20 {
  1589 + margin-right: 5rem;
  1590 + }
  1591 +
  1592 + .md\:\!mt-0 {
  1593 + margin-top: 0px !important;
  1594 + }
  1595 +
  1596 + .md\:\!mr-4 {
  1597 + margin-right: 1rem !important;
  1598 + }
  1599 +
  1600 + .md\:ml-6 {
  1601 + margin-left: 1.5rem;
  1602 + }
  1603 +
  1604 + .md\:mt-0 {
  1605 + margin-top: 0px;
  1606 + }
  1607 +
  1608 + .md\:mr-10 {
  1609 + margin-right: 2.5rem;
  1610 + }
  1611 +
  1612 + .md\:block {
  1613 + display: block;
  1614 + }
  1615 +
  1616 + .md\:flex {
  1617 + display: flex;
  1618 + }
  1619 +
  1620 + .md\:h-4\/5 {
  1621 + height: 80%;
  1622 + }
  1623 +
  1624 + .md\:w-1\/3 {
  1625 + width: 33.333333%;
  1626 + }
  1627 +
  1628 + .md\:w-1\/4 {
  1629 + width: 25%;
  1630 + }
  1631 +
  1632 + .md\:\!w-1\/3 {
  1633 + width: 33.333333% !important;
  1634 + }
  1635 +
  1636 + .md\:text-lg {
  1637 + font-size: 1.125rem;
  1638 + line-height: 1.75rem;
  1639 + }
  1640 +
  1641 + .md\:opacity-100 {
  1642 + opacity: 1;
  1643 + }
  1644 +}
  1645 +
  1646 +@media (min-width: 992px) {
  1647 + .lg\:flex {
  1648 + display: flex;
  1649 + }
  1650 +
  1651 + .lg\:w-2\/4 {
  1652 + width: 50%;
  1653 + }
  1654 +}
  1655 +
  1656 +@media (min-width: 1200px) {
  1657 + .xl\:my-0 {
  1658 + margin-top: 0px;
  1659 + margin-bottom: 0px;
  1660 + }
  1661 +
  1662 + .xl\:ml-20 {
  1663 + margin-left: 5rem;
  1664 + }
  1665 +
  1666 + .xl\:flex {
  1667 + display: flex;
  1668 + }
  1669 +
  1670 + .xl\:hidden {
  1671 + display: none;
  1672 + }
  1673 +
  1674 + .xl\:h-auto {
  1675 + height: auto;
  1676 + }
  1677 +
  1678 + .xl\:w-6\/12 {
  1679 + width: 50%;
  1680 + }
  1681 +
  1682 + .xl\:w-auto {
  1683 + width: auto;
  1684 + }
  1685 +
  1686 + .xl\:w-1\/5 {
  1687 + width: 20%;
  1688 + }
  1689 +
  1690 + .xl\:w-4\/5 {
  1691 + width: 80%;
  1692 + }
  1693 +
  1694 + .xl\:flex-col {
  1695 + flex-direction: column;
  1696 + }
  1697 +
  1698 + .xl\:justify-start {
  1699 + justify-content: flex-start;
  1700 + }
  1701 +
  1702 + .xl\:p-4 {
  1703 + padding: 1rem;
  1704 + }
  1705 +
  1706 + .xl\:py-0 {
  1707 + padding-top: 0px;
  1708 + padding-bottom: 0px;
  1709 + }
  1710 +
  1711 + .xl\:text-left {
  1712 + text-align: left;
  1713 + }
  1714 +
  1715 + .xl\:text-xl {
  1716 + font-size: 1.25rem;
  1717 + line-height: 1.75rem;
  1718 + }
  1719 +
  1720 + .xl\:text-3xl {
  1721 + font-size: 1.875rem;
  1722 + line-height: 2.25rem;
  1723 + }
  1724 +
  1725 + .xl\:text-gray-600 {
  1726 + --tw-text-opacity: 1;
  1727 + color: rgba(82, 82, 91, var(--tw-text-opacity));
  1728 + }
  1729 +
  1730 + .xl\:shadow-none {
  1731 + --tw-shadow: 0 0 #0000;
  1732 + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000),
  1733 + var(--tw-shadow);
  1734 + }
  1735 +}
  1736 +
  1737 +@media (min-width: 1600px) {
  1738 + .\32xl\:text-3xl {
  1739 + font-size: 1.875rem;
  1740 + line-height: 2.25rem;
  1741 + }
  1742 +}
... ...
src/main.ts
1 1 import '/@/design/index.less';
  2 +import '/@/design/tailwind.css';
2 3  
3   -// Register windi
4   -import 'virtual:windi.css';
5 4 // Register icon sprite
6 5 import 'virtual:svg-icons-register';
7 6  
... ...
src/utils/mitt.ts
... ... @@ -27,6 +27,7 @@ export interface Emitter {
27 27  
28 28 emit<T = any>(type: EventType, event?: T): void;
29 29 emit(type: '*', event?: any): void;
  30 + clear(): void;
30 31 }
31 32  
32 33 /**
... ... @@ -88,5 +89,12 @@ export default function mitt(all?: EventHandlerMap): Emitter {
88 89 handler(type, evt);
89 90 });
90 91 },
  92 +
  93 + /**
  94 + * Clear all
  95 + */
  96 + clear() {
  97 + this.all.clear();
  98 + },
91 99 };
92 100 }
... ...
src/views/dashboard/analysis/components/GrowCard.vue
... ... @@ -5,8 +5,8 @@
5 5 size="small"
6 6 :loading="$attrs.loading"
7 7 :title="item.title"
8   - class="md:w-1/4 w-full !md:mt-0 !mt-4"
9   - :class="[index + 1 < 4 && '!md:mr-4']"
  8 + class="md:w-1/4 w-full md:!mt-0 !mt-4"
  9 + :class="[index + 1 < 4 && 'md:!mr-4']"
10 10 :canExpan="false"
11 11 >
12 12 <template #extra>
... ...
src/views/dashboard/analysis/index.vue
... ... @@ -6,7 +6,7 @@
6 6 <div class="md:flex enter-y">
7 7 <VisitRadar class="md:w-1/3 w-full" :loading="loading" />
8 8  
9   - <VisitSource class="md:w-1/3 !md:mx-4 !md:my-0 !my-4 w-full" :loading="loading" />
  9 + <VisitSource class="md:w-1/3 md:!mx-4 md:!my-0 !my-4 w-full" :loading="loading" />
10 10 <SalesProductPie class="md:w-1/3 w-full" :loading="loading" />
11 11 </div>
12 12 </div>
... ...
src/views/dashboard/workbench/components/ProjectCard.vue
... ... @@ -5,7 +5,7 @@
5 5 </template>
6 6  
7 7 <template v-for="item in items" :key="item">
8   - <CardGrid class="!md:w-1/3 !w-full">
  8 + <CardGrid class="md:!w-1/3 !w-full">
9 9 <span class="flex">
10 10 <Icon :icon="item.icon" :color="item.color" size="30" />
11 11 <span class="text-lg ml-4">{{ item.title }}</span>
... ...
src/views/dashboard/workbench/index.vue
... ... @@ -10,7 +10,11 @@
10 10 <QuickNav :loading="loading" class="enter-y" />
11 11  
12 12 <Card class="!my-4 enter-y" :loading="loading">
13   - <img class="xl:h-50 h-30 mx-auto" src="../../../assets/svg/illustration.svg" />
  13 + <img
  14 + style="height: 216px"
  15 + class="h-20 mx-auto"
  16 + src="../../../assets/svg/illustration.svg"
  17 + />
14 18 </Card>
15 19  
16 20 <SaleRadar :loading="loading" class="enter-y" />
... ...
src/views/sys/login/LoginForm.vue
... ... @@ -53,7 +53,7 @@
53 53 {{ t('sys.login.mobileSignInFormTitle') }}
54 54 </Button>
55 55 </ACol>
56   - <ACol :md="8" :xs="24" class="!my-2 !md:my-0 xs:mx-0 md:mx-2">
  56 + <ACol :md="8" :xs="24" class="!my-2 md:!my-0 xs:mx-0 md:mx-2">
57 57 <Button block @click="setLoginState(LoginStateEnum.QR_CODE)">
58 58 {{ t('sys.login.qrSignInFormTitle') }}
59 59 </Button>
... ...
stylelint.config.js
... ... @@ -18,7 +18,18 @@ module.exports = {
18 18 'at-rule-no-unknown': [
19 19 true,
20 20 {
21   - ignoreAtRules: ['function', 'if', 'each', 'include', 'mixin'],
  21 + ignoreAtRules: [
  22 + 'tailwind',
  23 + 'apply',
  24 + 'variants',
  25 + 'responsive',
  26 + 'screen',
  27 + 'function',
  28 + 'if',
  29 + 'each',
  30 + 'include',
  31 + 'mixin',
  32 + ],
22 33 },
23 34 ],
24 35 'no-empty-source': null,
... ...
windi.config.ts renamed to tailwind.config.js
1   -import lineClamp from 'windicss/plugin/line-clamp';
2   -import colors from 'windicss/colors';
  1 +const colors = require('tailwindcss/colors');
3 2  
4   -import { defineConfig } from 'vite-plugin-windicss';
5   -import { primaryColor } from './build/config/themeConfig';
6   -
7   -export default defineConfig({
8   - darkMode: 'class',
9   - plugins: [lineClamp, createEnterPlugin()],
  3 +module.exports = {
  4 + mode: 'jit',
  5 + // darkMode: 'class',
  6 + plugins: [createEnterPlugin()],
  7 + purge: {
  8 + enabled: false,
  9 + content: ['./index.html', './src/**/*.{vue,ts,tsx}'],
  10 + },
10 11 theme: {
11 12 extend: {
12   - colors: {
13   - ...colors,
14   - primary: primaryColor,
  13 + zIndex: {
  14 + '-1': '-1',
15 15 },
16   - screens: {
17   - sm: '576px',
18   - md: '768px',
19   - lg: '992px',
20   - xl: '1200px',
21   - '2xl': '1600px',
  16 + },
  17 + colors: {
  18 + ...colors,
  19 + primary: {
  20 + DEFAULT: '#0960bd',
  21 + // dark: primaryColorDark,
22 22 },
23 23 },
  24 + screens: {
  25 + sm: '576px',
  26 + md: '768px',
  27 + lg: '992px',
  28 + xl: '1200px',
  29 + '2xl': '1600px',
  30 + },
24 31 },
25   -});
26   -
  32 +};
27 33 /**
28 34 * Used for animation when the element is displayed
29 35 * @param maxOutput The larger the maxOutput output, the larger the generated css volume
30 36 */
31   -function createEnterPlugin(maxOutput = 10) {
32   - const createCss = (index: number, d = 'x') => {
  37 +function createEnterPlugin(maxOutput = 6) {
  38 + const createCss = (index, d = 'x') => {
33 39 const upd = d.toUpperCase();
34 40 return {
35 41 [`*> .enter-${d}:nth-child(${index})`]: {
... ...