F: Add StyleLint tooling and fix some CSS issues

This commit is contained in:
Ivan 2025-03-19 15:12:02 +03:00
parent 84ba39ea68
commit 9f2a8d8431
11 changed files with 999 additions and 124 deletions

View File

@ -21,6 +21,7 @@
"changeProcessCWD": true "changeProcessCWD": true
} }
], ],
"stylelint.enable": true,
"autopep8.args": [ "autopep8.args": [
"--max-line-length", "--max-line-length",
"120", "120",

View File

@ -71,6 +71,10 @@ This readme file is used mostly to document project dependencies and conventions
- vite - vite
- jest - jest
- ts-jest - ts-jest
- stylelint
- stylelint-config-recommended
- stylelint-config-standard
- stylelint-config-tailwindcss
- @vitejs/plugin-react - @vitejs/plugin-react
- @types/jest - @types/jest
- @lezer/generator - @lezer/generator

View File

@ -0,0 +1,22 @@
{
"extends": ["stylelint-config-recommended", "stylelint-config-standard", "stylelint-config-tailwindcss"],
"rules": {
"color-no-invalid-hex": true,
"font-family-no-missing-generic-family-keyword": true,
"unit-no-unknown": true,
"block-no-empty": true,
"selector-pseudo-element-no-unknown": true,
"property-no-unknown": true,
"declaration-block-no-duplicate-properties": true,
"no-duplicate-selectors": true,
"no-empty-source": true,
"import-notation": null,
"at-rule-empty-line-before": null,
"declaration-empty-line-before": null,
"at-rule-no-unknown": null,
"comment-no-empty": null,
"comment-empty-line-before": null,
"custom-property-empty-line-before": null
}
}

File diff suppressed because it is too large Load Diff

View File

@ -9,7 +9,7 @@
"test:e2e": "playwright test", "test:e2e": "playwright test",
"dev": "vite --host", "dev": "vite --host",
"build": "tsc && vite build", "build": "tsc && vite build",
"lint": "eslint . --report-unused-disable-directives --max-warnings 0", "lint": "stylelint \"src/**/*.css\" && eslint . --report-unused-disable-directives --max-warnings 0",
"lintFix": "eslint . --report-unused-disable-directives --max-warnings 0 --fix", "lintFix": "eslint . --report-unused-disable-directives --max-warnings 0 --fix",
"preview": "vite preview --port 3000" "preview": "vite preview --port 3000"
}, },
@ -66,6 +66,10 @@
"eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-simple-import-sort": "^12.1.1",
"globals": "^16.0.0", "globals": "^16.0.0",
"jest": "^29.7.0", "jest": "^29.7.0",
"stylelint": "^16.16.0",
"stylelint-config-recommended": "^15.0.0",
"stylelint-config-standard": "^37.0.0",
"stylelint-config-tailwindcss": "^1.0.0",
"tailwindcss": "^4.0.7", "tailwindcss": "^4.0.7",
"ts-jest": "^29.2.6", "ts-jest": "^29.2.6",
"typescript": "^5.8.2", "typescript": "^5.8.2",

View File

@ -8,9 +8,9 @@
@custom-variant dark (&:is(.dark *)); @custom-variant dark (&:is(.dark *));
@theme { @theme {
/* stylelint-disable-next-line custom-property-pattern */
--color-*: initial; --color-*: initial;
--color-transparent: transparent; --color-transparent: transparent;
--color-current: currentColor;
--color-inherit: inherit; --color-inherit: inherit;
--color-prim-0: var(--clr-prim-0); --color-prim-0: var(--clr-prim-0);
@ -35,6 +35,7 @@
--color-ok-600: var(--clr-ok-600); --color-ok-600: var(--clr-ok-600);
/* stylelint-disable-next-line custom-property-pattern */
--z-index-*: initial; --z-index-*: initial;
--z-index-bottom: 0; --z-index-bottom: 0;
--z-index-topmost: 99; --z-index-topmost: 99;
@ -44,6 +45,7 @@
--z-index-navigation: 50; --z-index-navigation: 50;
--z-index-modal: 60; --z-index-modal: 60;
/* stylelint-disable-next-line custom-property-pattern */
--breakpoint-*: initial; --breakpoint-*: initial;
--breakpoint-xs: 475px; --breakpoint-xs: 475px;
--breakpoint-sm: 640px; --breakpoint-sm: 640px;

View File

@ -49,11 +49,12 @@
padding: 0.5rem; padding: 0.5rem;
font-size: var(--text-xs); font-size: var(--text-xs);
/* stylelint-disable-next-line custom-property-pattern */
line-height: var(--tw-leading, var(--text-xs--line-height)); line-height: var(--tw-leading, var(--text-xs--line-height));
font-weight: 500; font-weight: 500;
white-space: nowrap; white-space: nowrap;
-webkit-user-select: none;
user-select: none; user-select: none;
} }
@ -140,14 +141,13 @@
} }
@utility cc-view-hidden-item { @utility cc-view-hidden-item {
outline-width: 0px; outline-width: 0;
outline-color: transparent; outline-color: transparent;
&.selected { &.selected {
outline-width: 2px; outline: 2px solid var(--clr-prim-999);
outline-color: var(--clr-prim-999);
outline-style: solid;
} }
&.inherited { &.inherited {
outline-style: dashed; outline-style: dashed;
} }
@ -184,7 +184,7 @@
clip-path: inset(0% 0% 0% 0%); clip-path: inset(0% 0% 0% 0%);
height: 4.5rem; height: 4.5rem;
margin-top: 0.75rem; margin-top: 0.75rem;
padding: 0.25rem 0.5rem 0.25rem 0.5rem; padding: 0.25rem 0.5rem;
} }
} }

View File

@ -20,93 +20,93 @@
/* Light Theme */ /* Light Theme */
/* prettier-ignore */ /* prettier-ignore */
:not(.dark):root { :not(.dark):root {
--clr-prim-0: hsl(000, 000%, 100%); --clr-prim-0: hsl(000deg 000% 100%);
--clr-prim-100: hsl(000, 000%, 098%); --clr-prim-100: hsl(000deg 000% 098%);
--clr-prim-200: hsl(000, 000%, 094%); --clr-prim-200: hsl(000deg 000% 094%);
--clr-prim-300: hsl(000, 000%, 091%); --clr-prim-300: hsl(000deg 000% 091%);
--clr-prim-400: hsl(000, 000%, 080%); --clr-prim-400: hsl(000deg 000% 080%);
--clr-prim-600: hsl(000, 000%, 065%); --clr-prim-600: hsl(000deg 000% 065%);
--clr-prim-800: hsl(000, 000%, 047%); --clr-prim-800: hsl(000deg 000% 047%);
--clr-prim-999: hsl(000, 000%, 000%); --clr-prim-999: hsl(000deg 000% 000%);
--clr-sec-0: hsl(000, 000%, 100%); --clr-sec-0: hsl(000deg 000% 100%);
--clr-sec-100: hsl(190, 080%, 094%); --clr-sec-100: hsl(190deg 080% 094%);
--clr-sec-200: hsl(220, 080%, 092%); --clr-sec-200: hsl(220deg 080% 092%);
--clr-sec-300: hsl(220, 100%, 080%); --clr-sec-300: hsl(220deg 100%080%);
--clr-sec-400: hsl(220, 100%, 070%); --clr-sec-400: hsl(220deg 100% 070%);
--clr-sec-600: hsl(220, 100%, 060%); --clr-sec-600: hsl(220deg 100% 060%);
--clr-sec-800: hsl(220, 100%, 050%); --clr-sec-800: hsl(220deg 100% 050%);
--clr-warn-100: hsl(000, 100%, 095%); --clr-warn-100: hsl(000deg 100% 095%);
--clr-warn-600: hsl(000, 072%, 051%); --clr-warn-600: hsl(000deg 072% 051%);
--clr-ok-600: hsl(120, 080%, 37%); --clr-ok-600: hsl(120deg 080% 37%);
--clr-select-node: hsl(162, 082%, 051%); --clr-select-node: hsl(162deg 082% 051%);
/* Highlight accents */ /* Highlight accents */
--acc-bg-red: hsl(000, 100%, 089%); --acc-bg-red: hsl(000deg 100% 089%);
--acc-bg-green: hsl(100, 100%, 075%); --acc-bg-green: hsl(100deg 100% 075%);
--acc-bg-blue: hsl(235, 080%, 087%); --acc-bg-blue: hsl(235deg 080% 087%);
--acc-bg-purple: hsl(274, 089%, 081%); --acc-bg-purple: hsl(274deg 089% 081%);
--acc-bg-teal: hsl(192, 089%, 081%); --acc-bg-teal: hsl(192deg 089% 081%);
--acc-bg-orange: hsl(028, 100%, 075%); --acc-bg-orange: hsl(028deg 100% 075%);
--acc-bg-green25: hsl(100, 100%, 096%); --acc-bg-green25: hsl(100deg 100% 096%);
--acc-bg-green50: hsl(100, 100%, 090%); --acc-bg-green50: hsl(100deg 100% 090%);
--acc-bg-orange50: hsl(028, 100%, 090%); --acc-bg-orange50: hsl(028deg 100% 090%);
--acc-fg-red: hsl(000, 090%, 045%); --acc-fg-red: hsl(000deg 090% 045%);
--acc-fg-green: hsl(100, 090%, 035%); --acc-fg-green: hsl(100deg 090% 035%);
--acc-fg-blue: hsl(235, 100%, 050%); --acc-fg-blue: hsl(235deg 100% 050%);
--acc-fg-purple: hsl(270, 100%, 055%); --acc-fg-purple: hsl(270deg 100% 055%);
--acc-fg-teal: hsl(200, 080%, 050%); --acc-fg-teal: hsl(200deg 080% 050%);
--acc-fg-orange: hsl(028, 100%, 050%); --acc-fg-orange: hsl(028deg 100% 050%);
} }
/* Dark Theme */ /* Dark Theme */
/* prettier-ignore */ /* prettier-ignore */
.dark:root { .dark:root {
--clr-prim-0: hsl(000, 000%, 005%); --clr-prim-0: hsl(000deg 000% 005%);
--clr-prim-100: hsl(000, 000%, 009%); --clr-prim-100: hsl(000deg 000% 009%);
--clr-prim-200: hsl(000, 000%, 015%); --clr-prim-200: hsl(000deg 000% 015%);
--clr-prim-300: hsl(000, 000%, 022%); --clr-prim-300: hsl(000deg 000% 022%);
--clr-prim-400: hsl(000, 000%, 035%); --clr-prim-400: hsl(000deg 000% 035%);
--clr-prim-600: hsl(000, 000%, 055%); --clr-prim-600: hsl(000deg 000% 055%);
--clr-prim-800: hsl(000, 000%, 080%); --clr-prim-800: hsl(000deg 000% 080%);
--clr-prim-999: hsl(000, 000%, 093%); --clr-prim-999: hsl(000deg 000% 093%);
--clr-sec-800: hsl(267, 070%, 070%); --clr-sec-800: hsl(267deg 070% 070%);
--clr-sec-600: hsl(267, 050%, 060%); --clr-sec-600: hsl(267deg 050% 060%);
--clr-sec-400: hsl(267, 050%, 050%); --clr-sec-400: hsl(267deg 050% 050%);
--clr-sec-300: hsl(267, 050%, 040%); --clr-sec-300: hsl(267deg 050% 040%);
--clr-sec-200: hsl(267, 050%, 032%); --clr-sec-200: hsl(267deg 050% 032%);
--clr-sec-100: hsl(269, 030%, 028%); --clr-sec-100: hsl(269deg 030% 028%);
--clr-sec-0: hsl(000, 000%, 100%); --clr-sec-0: hsl(000deg 000% 100%);
--clr-warn-100: hsl(000, 100%, 015%); --clr-warn-100: hsl(000deg 100% 015%);
--clr-warn-600: hsl(000, 080%, 055%); --clr-warn-600: hsl(000deg 080% 055%);
--clr-ok-600: hsl(120, 080%, 042%); --clr-ok-600: hsl(120deg 080% 042%);
--clr-select-node: hsl(162, 082%, 041%); --clr-select-node: hsl(162deg 082% 041%);
/* Highlight accents */ /* Highlight accents */
--acc-bg-red: hsl(000, 080%, 037%); --acc-bg-red: hsl(000deg 080% 037%);
--acc-bg-green: hsl(100, 080%, 025%); --acc-bg-green: hsl(100deg 080% 025%);
--acc-bg-blue: hsl(235, 054%, 049%); --acc-bg-blue: hsl(235deg 054% 049%);
--acc-bg-purple: hsl(270, 080%, 050%); --acc-bg-purple: hsl(270deg 080% 050%);
--acc-bg-teal: hsl(192, 080%, 030%); --acc-bg-teal: hsl(192deg 080% 030%);
--acc-bg-orange: hsl(035, 100%, 035%); --acc-bg-orange: hsl(035deg 100% 035%);
--acc-bg-green25: hsl(100, 080%, 009%); --acc-bg-green25: hsl(100deg 080% 009%);
--acc-bg-green50: hsl(100, 080%, 017%); --acc-bg-green50: hsl(100deg 080% 017%);
--acc-bg-orange50: hsl(035, 100%, 016%); --acc-bg-orange50: hsl(035deg 100% 016%);
--acc-fg-red: hsl(000, 080%, 045%); --acc-fg-red: hsl(000deg 080% 045%);
--acc-fg-green: hsl(100, 080%, 035%); --acc-fg-green: hsl(100deg 080% 035%);
--acc-fg-blue: hsl(235, 100%, 080%); --acc-fg-blue: hsl(235deg 100% 080%);
--acc-fg-purple: hsl(270, 100%, 080%); --acc-fg-purple: hsl(270deg 100% 080%);
--acc-fg-teal: hsl(192, 100%, 045%); --acc-fg-teal: hsl(192deg 100% 045%);
--acc-fg-orange: hsl(035, 100%, 050%); --acc-fg-orange: hsl(035deg 100% 050%);
} }

View File

@ -1,9 +1,11 @@
/** /**
* Module: Override imported components CSS styling. * Module: Override imported components CSS styling.
*/ */
@import './constants.css'; @import './constants.css';
@import './imports.css'; @import './imports.css';
/* stylelint-disable selector-class-pattern */
:root { :root {
/* Import overrides */ /* Import overrides */
--toastify-color-dark: var(--clr-prim-300); --toastify-color-dark: var(--clr-prim-300);
@ -37,23 +39,18 @@
border-width: 1px; border-width: 1px;
border-radius: 0.25rem; border-radius: 0.25rem;
padding-left: 0.375rem; padding: 0.15rem 0.375rem;
padding-right: 0.375rem;
padding-top: 0.15rem;
padding-bottom: 0.15rem;
} }
.cm-editor.cm-focused { .cm-editor.cm-focused {
border-color: var(--clr-prim-400); border-color: var(--clr-prim-400);
outline-color: var(--clr-sec-600); outline: 2px solid var(--clr-sec-600);
outline-style: solid;
outline-width: 2px;
} }
.cm-editor .cm-placeholder { .cm-editor .cm-placeholder {
font-family: var(--font-main); font-family: var(--font-main);
color: var(--clr-prim-600); color: var(--clr-prim-600);
user-select: none; user-select: none;
-webkit-user-select: none;
} }
.react-flow__handle { .react-flow__handle {
@ -89,7 +86,6 @@
font-size: 14px; font-size: 14px;
border: 1px solid; border: 1px solid;
background-color: var(--clr-prim-0);
color: var(--clr-prim-999); color: var(--clr-prim-999);
border-color: var(--clr-prim-400); border-color: var(--clr-prim-400);
background-color: var(--clr-prim-0); background-color: var(--clr-prim-0);

View File

@ -33,11 +33,10 @@
::backdrop, ::backdrop,
::file-selector-button { ::file-selector-button {
border-color: var(--clr-prim-400); border-color: var(--clr-prim-400);
accent-color: var(--clr-sec-600);
} }
html { html {
-webkit-text-size-adjust: none;
-moz-text-size-adjust: none;
text-size-adjust: none; text-size-adjust: none;
hanging-punctuation: first last; hanging-punctuation: first last;
@ -47,8 +46,8 @@
} }
body { body {
margin: 0px; margin: 0;
padding: 0px; padding: 0;
overflow-x: hidden; overflow-x: hidden;
} }
@ -80,7 +79,7 @@
background-color: var(--clr-prim-100); background-color: var(--clr-prim-100);
} }
@media only screen and (max-width: 639px) { @media only screen and (width <= 639px) {
:root { :root {
font-size: var(--font-size-sm); font-size: var(--font-size-sm);
} }
@ -89,9 +88,7 @@
:focus, :focus,
:focus-visible, :focus-visible,
:focus-within { :focus-within {
outline-width: 2px; outline: 2px solid transparent;
outline-style: solid;
outline-color: transparent;
} }
::placeholder { ::placeholder {
@ -135,6 +132,7 @@
:not([role='manuals']) & { :not([role='manuals']) & {
margin-top: 0.5rem; margin-top: 0.5rem;
} }
[role='manuals'] & { [role='manuals'] & {
margin-top: 0.75rem; margin-top: 0.75rem;
margin-bottom: 0.5rem; margin-bottom: 0.5rem;

View File

@ -1,5 +1,5 @@
/** /**
* Module: Utility classes for stlye features. * Module: Utility classes for style features.
*/ */
@utility font-main { @utility font-main {
@ -17,6 +17,7 @@
@utility clr-input { @utility clr-input {
background-color: var(--clr-prim-0); background-color: var(--clr-prim-0);
&:disabled { &:disabled {
background-color: var(--clr-prim-100); background-color: var(--clr-prim-100);
} }
@ -51,30 +52,28 @@
background-color: var(--clr-prim-200); background-color: var(--clr-prim-200);
} }
&:hover:not(:disabled), &:focus-visible,
&:focus-visible { .focus-frame:has(:focus-visible) {
color: var(--clr-sec-0); outline: 2px solid var(--clr-sec-600);
background-color: var(--clr-sec-600);
} }
&:focus-visible, &:focus-visible,
.focus-frame:has(:focus-visible) { &:hover:not(:disabled) {
outline-width: 2px; color: var(--clr-sec-0);
outline-style: solid; background-color: var(--clr-sec-600);
outline-color: var(--clr-sec-600);
} }
} }
@utility clr-btn-nav { @utility clr-btn-nav {
color: var(--clr-prim-800); color: var(--clr-prim-800);
&:hover:not(:disabled) {
background-color: var(--clr-sec-100);
}
&:disabled { &:disabled {
color: var(--clr-prim-600); color: var(--clr-prim-600);
} }
&:hover:not(:disabled) {
background-color: var(--clr-sec-100);
}
} }
@utility clr-hover { @utility clr-hover {
@ -86,23 +85,17 @@
@utility clr-outline { @utility clr-outline {
:is(&, .focus-frame):focus-visible { :is(&, .focus-frame):focus-visible {
outline-width: 2px; outline: 2px solid var(--clr-sec-600);
outline-style: solid;
outline-color: var(--clr-sec-600);
} }
} }
@utility focus-frame { @utility focus-frame {
:is(.clr-outline, &):focus-visible { :is(.clr-outline, &):focus-visible {
outline-width: 2px; outline: 2px solid var(--clr-sec-600);
outline-style: solid;
outline-color: var(--clr-sec-600);
} }
&:has(:focus-visible) { &:has(:focus-visible) {
outline-width: 2px; outline: 2px solid var(--clr-sec-600);
outline-style: solid;
outline-color: var(--clr-sec-600);
} }
} }
@ -115,6 +108,7 @@
@utility clr-text-controls { @utility clr-text-controls {
color: var(--clr-prim-800); color: var(--clr-prim-800);
background-color: transparent; background-color: transparent;
&:disabled { &:disabled {
color: var(--clr-prim-600); color: var(--clr-prim-600);
} }
@ -140,10 +134,12 @@
@utility inline-icon { @utility inline-icon {
display: inline-block; display: inline-block;
font-size: 1.25rem;
margin-left: 0.1rem; margin-left: 0.1rem;
margin-right: 0.1rem; margin-right: 0.1rem;
transform: translate(0, -0.2rem); transform: translate(0, -0.2rem);
font-size: 1.25rem;
color: var(--clr-sec-800); color: var(--clr-sec-800);
} }
@ -219,11 +215,5 @@
linear-gradient(to left, transparent, black calc(var(--mask-border-size))), linear-gradient(to left, transparent, black calc(var(--mask-border-size))),
linear-gradient(to right, transparent, black calc(var(--mask-border-size))); linear-gradient(to right, transparent, black calc(var(--mask-border-size)));
-webkit-mask-image: linear-gradient(to top, transparent, black calc(var(--mask-border-size))),
linear-gradient(to bottom, transparent, black calc(var(--mask-border-size))),
linear-gradient(to left, transparent, black calc(var(--mask-border-size))),
linear-gradient(to right, transparent, black calc(var(--mask-border-size)));
mask-composite: intersect; mask-composite: intersect;
-webkit-mask-composite: destination-in;
} }