diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..4cb4f4f --- /dev/null +++ b/.eslintrc @@ -0,0 +1,50 @@ +{ + "plugins": [ + "react", + "import" + ], + "extends": [ + "airbnb-typescript", + "plugin:react/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "./tsconfig.json", + "sourceType": "module", + "createDefaultProgram": true + }, + "rules": { + "linebreak-style": [ + "error", + "unix" + ], + "react/jsx-sort-props": [ + "error", + { + "noSortAlphabetically": true, + "ignoreCase": true, + "callbacksLast": true, + "shorthandLast": false, + "reservedFirst": [ + "key" + ] + } + ], + "react/jsx-max-props-per-line": [ + "error", + { + "maximum": 1, + "when": "always" + } + ], + "react/jsx-pascal-case": [ + "error" + ] + }, + "ignorePatterns": [ + "ext/**", + "node_modules/**", + "src/**/*.cjs", + "src/setupProxy.js" + ] +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4564075 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# dependencies +/node_modules +/.vscode +/.pnp +/.idea + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/.stylelintrc.json b/.stylelintrc.json new file mode 100644 index 0000000..ff75d29 --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,219 @@ +{ + "plugins": [ + "stylelint-order", + "stylelint-group-selectors", + "stylelint-force-selector-name-prefix" + ], + "rules": { + "selector-id-pattern": [ + "^[a-z0-9-]+$", + { + "resolveNestedSelectors": true + } + ], + "selector-class-pattern": [ + "^[a-z0-9-_]+$", + { + "resolveNestedSelectors": true + } + ], + "value-keyword-case": "lower", + "string-quotes": "single", + "selector-max-compound-selectors": 1, + "selector-max-attribute": 1, + "selector-max-class": 2, + "comment-no-empty": true, + "block-no-empty": true, + "no-empty-first-line": true, + "selector-attribute-quotes": "always", + "block-opening-brace-space-before": "always", + "declaration-block-semicolon-newline-after": "always", + "selector-no-qualifying-type": true, + "selector-no-vendor-prefix": true, + "declaration-block-single-line-max-declarations": 1, + "declaration-block-no-duplicate-properties": true, + "shorthand-property-no-redundant-values": true, + "color-no-invalid-hex": true, + "unit-no-unknown": true, + "length-zero-no-unit": true, + "value-no-vendor-prefix": true, + "number-max-precision": 2, + "function-name-case": "lower", + "color-hex-case": "upper", + "color-hex-length": "long", + "font-family-name-quotes": "always-unless-keyword", + "plugin/stylelint-group-selectors": true, + "plugin/stylelint-force-selector-name-prefix": { + "afterPath": "pages", + "separator": "kebab-case" + }, + "order/order": [ + [ + "custom-properties", + "declarations" + ], + { + "severity": "warning" + } + ], + "order/properties-order": [ + [ + "content", + "position", + "top", + "right", + "bottom", + "left", + "z-index", + "font", + "font-family", + "font-weight", + "font-style", + "font-variant", + "font-size-adjust", + "font-stretch", + "font-size", + "display", + "flex", + "flex-grow", + "flex-shrink", + "flex-basis", + "flex-direction", + "flex-flow", + "flex-wrap", + "grid", + "grid-area", + "grid-template", + "grid-template-areas", + "grid-template-rows", + "grid-template-columns", + "grid-row", + "grid-row-start", + "grid-row-end", + "grid-column", + "grid-column-start", + "grid-column-end", + "grid-auto-rows", + "grid-auto-columns", + "grid-auto-flow", + "grid-gap", + "grid-row-gap", + "grid-column-gap", + "gap", + "row-gap", + "column-gap", + "align-content", + "align-items", + "align-self", + "justify-content", + "justify-items", + "justify-self", + "order", + "float", + "clear", + "object-fit", + "overflow", + "overflow-x", + "overflow-y", + "overflow-scrolling", + "clip", + "width", + "min-width", + "max-width", + "height", + "min-height", + "max-height", + "padding", + "padding-top", + "padding-right", + "padding-bottom", + "padding-left", + "margin", + "margin-top", + "margin-right", + "margin-bottom", + "margin-left", + "box-sizing", + "vertical-align", + "box-decoration-break", + "box-shadow", + "outline", + "outline-width", + "outline-style", + "outline-color", + "outline-offset", + "table-layout", + "caption-side", + "empty-cells", + "list-style", + "list-style-position", + "list-style-type", + "list-style-image", + "color", + "background-color", + "border", + "border-spacing", + "border-collapse", + "border-width", + "border-style", + "border-color", + "border-top", + "border-top-width", + "border-top-style", + "border-top-color", + "border-right", + "border-right-width", + "border-right-style", + "border-right-color", + "border-bottom", + "border-bottom-width", + "border-bottom-style", + "border-bottom-color", + "border-left", + "border-left-width", + "border-left-style", + "border-left-color", + "border-radius", + "border-top-left-radius", + "border-top-right-radius", + "border-bottom-right-radius", + "border-bottom-left-radius", + "border-image", + "border-image-source", + "border-image-slice", + "border-image-width", + "border-image-outset", + "border-image-repeat", + "border-top-image", + "border-right-image", + "border-bottom-image", + "border-left-image", + "border-corner-image", + "border-top-left-image", + "border-top-right-image", + "border-bottom-right-image", + "border-bottom-left-image", + "transition", + "transition-delay", + "transition-timing-function", + "transition-duration", + "transition-property", + "transform", + "transform-origin", + "animation", + "animation-name", + "animation-duration", + "animation-play-state", + "animation-timing-function", + "animation-delay", + "animation-iteration-count", + "animation-direction", + "animation-fill-mode" + ], + { + "unspecified": "bottom", + "severity": "warning" + } + ] + } +} \ No newline at end of file