diff --git a/package.json b/package.json index 24ae5aa..55c7044 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "node": ">=20" }, "scripts": { - "clear": "del './packages/*/dist' ./coverage ./node_modules/.cache", + "clear": "del './packages/*/package' ./coverage ./node_modules/.cache", "lint:package-json": "lint-package-json --monorepo", "lint": "eslint --flag v10_config_lookup_from_file", "test:unit": "vitest run", diff --git a/packages/stylelint-config/README.md b/packages/stylelint-config/README.md new file mode 100644 index 0000000..5fcced1 --- /dev/null +++ b/packages/stylelint-config/README.md @@ -0,0 +1,68 @@ +# @trigen/stylelint-config + +[![NPM version][npm]][npm-url] +[![Node version][node]][node-url] +[![Dependencies status][deps]][deps-url] +[![Install size][size]][size-url] +[![Build status][build]][build-url] + +[npm]: https://img.shields.io/npm/v/%40trigen/stylelint-config.svg +[npm-url]: https://www.npmjs.com/package/@trigen/stylelint-config + +[node]: https://img.shields.io/node/v/%40trigen/stylelint-config.svg +[node-url]: https://nodejs.org + +[deps]: https://img.shields.io/librariesio/release/npm/@trigen/stylelint-config +[deps-url]: https://libraries.io/npm/@trigen%2Fstylelint-config/tree + +[size]: https://packagephobia.com/badge?p=@trigen/stylelint-config +[size-url]: https://packagephobia.com/result?p=@trigen/stylelint-config + +[build]: https://img.shields.io/github/actions/workflow/status/TrigenSoftware/scripts/tests.yml?branch=main +[build-url]: https://github.com/TrigenSoftware/scripts/actions + +Trigen's Stylelint config. + +## Install + +```bash +pnpm add -D @trigen/stylelint-config +# or +yarn add -D @trigen/stylelint-config +# or +npm i -D @trigen/stylelint-config +``` + +## Configure + +Create `stylelint.config.js` with next content: + +```js +export default { + extends: ['@trigen/stylelint-config'] +} +``` + +### Additional configs + +There are additional configs for specific language features and strict mode: + +| Config | Description | +|--------|-------------| +| @trigen/stylelint-config/scss | Rules for SCSS code. | +| @trigen/stylelint-config/logical | Rules with CSS logical properties support. | +| @trigen/stylelint-config/strict | Strict rules for enhanced code quality. | + +Example: + +`stylelint.config.js`: + +```js +export default { + extends: [ + '@trigen/stylelint-config', + '@trigen/stylelint-config/scss', + '@trigen/stylelint-config/logical' + ] +} +``` diff --git a/packages/stylelint-config/eslint.config.js b/packages/stylelint-config/eslint.config.js new file mode 100644 index 0000000..dd9a6c2 --- /dev/null +++ b/packages/stylelint-config/eslint.config.js @@ -0,0 +1,14 @@ +import moduleConfig from '@trigen/eslint-config/module' +import rootConfig from '../../eslint.config.js' + +export default [ + ...rootConfig, + ...moduleConfig, + { + rules: { + 'no-magic-numbers': 'off', + 'import/no-default-export': 'off', + 'import/no-anonymous-default-export': 'off' + } + } +] diff --git a/packages/stylelint-config/package.json b/packages/stylelint-config/package.json new file mode 100644 index 0000000..2872af9 --- /dev/null +++ b/packages/stylelint-config/package.json @@ -0,0 +1,56 @@ +{ + "name": "@trigen/stylelint-config", + "type": "module", + "version": "8.0.0-alpha.33", + "description": "Trigen's Stylelint config.", + "author": "dangreen", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TrigenSoftware/scripts.git", + "directory": "packages/stylelint-config" + }, + "bugs": { + "url": "https://github.com/TrigenSoftware/scripts/issues" + }, + "keywords": [ + "stylelint", + "stylelint-config", + "css", + "scss" + ], + "engines": { + "node": ">=20" + }, + "exports": { + ".": "./src/index.js", + "./*": "./src/*.js" + }, + "publishConfig": { + "access": "public", + "directory": "package", + "linkDirectory": false + }, + "scripts": { + "prepublishOnly": "del ./package && clean-publish", + "postpublish": "del ./package" + }, + "peerDependencies": { + "stylelint": ">=12.0.0" + }, + "dependencies": { + "@stylistic/stylelint-plugin": "^3.1.3", + "postcss-scss": "^4.0.9", + "stylelint-csstree-validator": "^3.0.0", + "stylelint-declaration-strict-value": "^1.1.3", + "stylelint-gamut": "^1.3.4", + "stylelint-high-performance-animation": "^1.5.1", + "stylelint-order": "^7.0.0", + "stylelint-plugin-a11y": "^1.0.1", + "stylelint-plugin-logical-css": "^1.2.3", + "stylelint-scss": "^6.12.1" + }, + "devDependencies": { + "stylelint": "^16.21.1" + } +} diff --git a/packages/stylelint-config/src/index.js b/packages/stylelint-config/src/index.js new file mode 100644 index 0000000..7c4fd8e --- /dev/null +++ b/packages/stylelint-config/src/index.js @@ -0,0 +1,5 @@ +/** + * Export common subconfig + */ + +export { default } from './subconfigs/common.js' diff --git a/packages/stylelint-config/src/logical.js b/packages/stylelint-config/src/logical.js new file mode 100644 index 0000000..95d810c --- /dev/null +++ b/packages/stylelint-config/src/logical.js @@ -0,0 +1,5 @@ +/** + * Export logical subconfig + */ + +export { default } from './subconfigs/logical.js' diff --git a/packages/stylelint-config/src/scss.js b/packages/stylelint-config/src/scss.js new file mode 100644 index 0000000..62eb292 --- /dev/null +++ b/packages/stylelint-config/src/scss.js @@ -0,0 +1,14 @@ +/** + * Export SCSS subconfig + */ + +import scssConfig from './subconfigs/scss.js' + +export default { + overrides: [ + { + files: ['**/*.scss'], + ...scssConfig + } + ] +} diff --git a/packages/stylelint-config/src/strict.js b/packages/stylelint-config/src/strict.js new file mode 100644 index 0000000..8f6fd5e --- /dev/null +++ b/packages/stylelint-config/src/strict.js @@ -0,0 +1,5 @@ +/** + * Export strict subconfig + */ + +export { default } from './subconfigs/strict.js' diff --git a/packages/stylelint-config/src/subconfigs/common.js b/packages/stylelint-config/src/subconfigs/common.js new file mode 100644 index 0000000..7ed609a --- /dev/null +++ b/packages/stylelint-config/src/subconfigs/common.js @@ -0,0 +1,336 @@ +/** + * Common config + */ + +import concentricCss from './concentric-css.js' +import { + pascalCaseMatcher, + camelCaseMatcher +} from './matchers.js' + +export default { + plugins: [ + '@stylistic/stylelint-plugin', + 'stylelint-order', + 'stylelint-plugin-a11y', + 'stylelint-high-performance-animation', + 'stylelint-gamut' + ], + rules: { + // Plugins + // Order + 'order/order': [ + 'dollar-variables', + 'custom-properties', + 'declarations', + 'rules', + 'at-rules' + ], + 'order/properties-order': [ + concentricCss.map(properties => ({ + emptyLineBefore: 'never', + properties + })), + { + unspecified: 'bottom' + } + ], + // A11y + 'a11y/font-size-is-readable': true, + 'a11y/media-prefers-reduced-motion': true, + 'a11y/no-obsolete-attribute': true, + 'a11y/no-obsolete-element': true, + 'a11y/no-outline-none': true, + 'a11y/no-text-align-justify': true, + 'a11y/selector-pseudo-class-focus': true, + // High performance animation + 'plugin/no-low-performance-animation-properties': [ + true, + { + ignore: 'paint-properties' + } + ], + // Gamut + 'gamut/color-no-out-gamut-range': true, + + // Possible errors + // Colors + 'color-no-invalid-hex': true, + // Font family + 'font-family-no-duplicate-names': true, + 'font-family-no-missing-generic-family-keyword': true, + // Function + 'function-calc-no-unspaced-operator': true, + 'function-linear-gradient-no-nonstandard-direction': true, + // String + 'string-no-newline': true, + // Unit + 'unit-no-unknown': true, + // Property + 'property-no-unknown': [ + true, + { + ignoreProperties: ['composes'] + } + ], + // Keyframe declaration + 'keyframe-declaration-no-important': true, + // Declaration block + 'declaration-block-no-duplicate-properties': [ + true, + { + ignore: ['consecutive-duplicates-with-different-values'] + } + ], + 'declaration-block-no-shorthand-property-overrides': true, + // Block + 'block-no-empty': true, + // Selector + 'selector-pseudo-class-no-unknown': true, + 'selector-pseudo-element-no-unknown': true, + 'selector-type-no-unknown': true, + // Media feature + 'media-feature-name-no-unknown': true, + // At-rule + 'at-rule-no-unknown': [ + true, + { + ignoreAtRules: ['value'] + } + ], + // Comment + 'comment-no-empty': true, + // General / Sheet + 'no-descending-specificity': true, + 'no-duplicate-at-import-rules': true, + 'no-duplicate-selectors': true, + 'no-empty-source': true, + '@stylistic/no-extra-semicolons': true, + 'no-invalid-double-slash-comments': true, + + // Limit language features + // Alpha-value + 'alpha-value-notation': 'number', + // Hue + 'hue-degree-notation': 'angle', + // Color + 'color-function-notation': 'legacy', + 'color-named': 'always-where-possible', + // Length + 'length-zero-no-unit': true, + // Font weight + 'font-weight-notation': 'named-where-possible', + // Function + 'function-url-no-scheme-relative': true, + 'function-url-scheme-allowed-list': ['data', 'https'], + // Keyframes + 'keyframes-name-pattern': [ + pascalCaseMatcher, + { + message: 'Expected keyframe name to be in PascalCase (e.g. "FadeIn", "SlideUp")' + } + ], + // Number + 'number-max-precision': 3, + // Time + 'time-min-milliseconds': [ + 100, + { + ignore: ['delay'] + } + ], + // Shorthand property + 'shorthand-property-no-redundant-values': true, + // Value + 'value-no-vendor-prefix': true, + // Custom property + 'custom-property-pattern': [ + camelCaseMatcher, + { + message: 'Expected custom property name to be in camelCase (e.g. "--colorPrimary", "--sizeFont")' + } + ], + // Property + 'property-no-vendor-prefix': true, + // Declaration + 'declaration-block-no-redundant-longhand-properties': true, + // Declaration block + 'declaration-block-single-line-max-declarations': 0, + // Selector + 'selector-class-pattern': [ + camelCaseMatcher, + { + resolveNestedSelectors: true, + message: 'Expected class selector to be in camelCase (e.g. ".button", ".navMenu")' + } + ], + 'selector-max-compound-selectors': 4, + 'selector-max-universal': 1, + '@stylistic/selector-max-empty-lines': 0, + 'selector-no-qualifying-type': [ + true, + { + ignore: ['attribute'] + } + ], + 'selector-no-vendor-prefix': true, + 'selector-pseudo-element-colon-notation': 'double', + // Media feature + 'media-feature-name-no-vendor-prefix': true, + // Custom media + 'custom-media-pattern': [ + camelCaseMatcher, + { + message: 'Expected custom media query name to be in camelCase (e.g. "--mediaSmallScreen", "--mediaTabletAndUp")' + } + ], + // At-rule + 'at-rule-no-vendor-prefix': true, + 'at-rule-property-required-list': { + 'font-face': [ + 'font-display', + 'font-family', + 'font-style', + 'font-weight', + 'src' + ] + }, + // General / Sheet + 'no-unknown-animations': true, + + // Stylistic issues + // Color + '@stylistic/color-hex-case': 'lower', + 'color-hex-length': 'short', + // Font family + 'font-family-name-quotes': 'always-where-recommended', + // Function + '@stylistic/function-comma-newline-after': 'always-multi-line', + '@stylistic/function-comma-newline-before': 'never-multi-line', + '@stylistic/function-comma-space-after': 'always-single-line', + '@stylistic/function-comma-space-before': 'never', + '@stylistic/function-max-empty-lines': 0, + 'function-name-case': 'lower', + '@stylistic/function-parentheses-newline-inside': 'always-multi-line', + '@stylistic/function-parentheses-space-inside': 'never-single-line', + 'function-url-quotes': [ + 'always', + { + except: ['empty'] + } + ], + '@stylistic/function-whitespace-after': 'always', + // Number + '@stylistic/number-leading-zero': 'never', + '@stylistic/number-no-trailing-zeros': true, + // String + '@stylistic/string-quotes': 'single', + // Unit + '@stylistic/unit-case': 'lower', + // Value + 'value-keyword-case': 'lower', + // Value list + '@stylistic/value-list-comma-newline-after': 'always-multi-line', + '@stylistic/value-list-comma-newline-before': 'never-multi-line', + '@stylistic/value-list-comma-space-after': 'always-single-line', + '@stylistic/value-list-comma-space-before': 'never', + '@stylistic/value-list-max-empty-lines': 0, + // Custom property + 'custom-property-empty-line-before': 'never', + // Property + '@stylistic/property-case': 'lower', + // Declaration + '@stylistic/declaration-bang-space-after': 'never', + '@stylistic/declaration-bang-space-before': 'always', + '@stylistic/declaration-colon-newline-after': 'always-multi-line', + '@stylistic/declaration-colon-space-after': 'always-single-line', + '@stylistic/declaration-colon-space-before': 'never', + // Declaration block + '@stylistic/declaration-block-semicolon-newline-after': 'always', + '@stylistic/declaration-block-semicolon-newline-before': 'never-multi-line', + '@stylistic/declaration-block-semicolon-space-after': 'always-single-line', + '@stylistic/declaration-block-semicolon-space-before': 'never', + '@stylistic/declaration-block-trailing-semicolon': 'always', + // Block + '@stylistic/block-closing-brace-empty-line-before': 'never', + '@stylistic/block-closing-brace-newline-after': 'always', + '@stylistic/block-closing-brace-newline-before': 'always', + '@stylistic/block-closing-brace-space-after': 'always-single-line', + '@stylistic/block-closing-brace-space-before': 'always-single-line', + '@stylistic/block-opening-brace-newline-after': 'always', + '@stylistic/block-opening-brace-newline-before': 'never-single-line', + '@stylistic/block-opening-brace-space-after': 'always-single-line', + '@stylistic/block-opening-brace-space-before': 'always', + // Selector + '@stylistic/selector-attribute-brackets-space-inside': 'never', + '@stylistic/selector-attribute-operator-space-after': 'never', + '@stylistic/selector-attribute-operator-space-before': 'never', + 'selector-attribute-quotes': 'never', + '@stylistic/selector-combinator-space-after': 'always', + '@stylistic/selector-combinator-space-before': 'always', + '@stylistic/selector-descendant-combinator-no-non-space': true, + '@stylistic/selector-pseudo-class-case': 'lower', + '@stylistic/selector-pseudo-class-parentheses-space-inside': 'never', + '@stylistic/selector-pseudo-element-case': 'lower', + 'selector-type-case': 'lower', + // Selector list + '@stylistic/selector-list-comma-newline-after': 'always-multi-line', + '@stylistic/selector-list-comma-newline-before': 'never-multi-line', + '@stylistic/selector-list-comma-space-after': 'always-single-line', + '@stylistic/selector-list-comma-space-before': 'never', + // Rule + 'rule-empty-line-before': [ + 'always', + { + except: ['first-nested', 'after-single-line-comment'] + } + ], + // Media feature + '@stylistic/media-feature-colon-space-after': 'always', + '@stylistic/media-feature-colon-space-before': 'never', + '@stylistic/media-feature-name-case': 'lower', + '@stylistic/media-feature-parentheses-space-inside': 'never', + '@stylistic/media-feature-range-operator-space-after': 'always', + '@stylistic/media-feature-range-operator-space-before': 'always', + // Media query list + '@stylistic/media-query-list-comma-newline-after': 'always-multi-line', + '@stylistic/media-query-list-comma-newline-before': 'never-multi-line', + '@stylistic/media-query-list-comma-space-after': 'always-single-line', + '@stylistic/media-query-list-comma-space-before': 'never', + // At-rule + 'at-rule-empty-line-before': [ + 'always', + { + except: ['blockless-after-same-name-blockless', 'first-nested'], + ignore: ['after-comment'] + } + ], + '@stylistic/at-rule-name-case': 'lower', + '@stylistic/at-rule-name-newline-after': 'always-multi-line', + '@stylistic/at-rule-name-space-after': 'always-single-line', + '@stylistic/at-rule-semicolon-newline-after': 'always', + '@stylistic/at-rule-semicolon-space-before': 'never', + // Comment + 'comment-empty-line-before': [ + 'always', + { + except: ['first-nested'], + ignore: ['after-comment', 'stylelint-commands'] + } + ], + 'comment-whitespace-inside': 'always', + // General / Sheet + '@stylistic/indentation': [ + 2, + { + indentClosingBrace: false + } + ], + '@stylistic/linebreaks': 'unix', + '@stylistic/max-empty-lines': 1, + '@stylistic/no-eol-whitespace': true, + '@stylistic/no-missing-end-of-source-newline': true, + '@stylistic/no-empty-first-line': true, + '@stylistic/unicode-bom': 'never' + } +} diff --git a/packages/stylelint-config/src/subconfigs/concentric-css.js b/packages/stylelint-config/src/subconfigs/concentric-css.js new file mode 100644 index 0000000..c20bdb3 --- /dev/null +++ b/packages/stylelint-config/src/subconfigs/concentric-css.js @@ -0,0 +1,353 @@ +/** + * Our variation of Concentric CSS + * http://rhodesmill.org/brandon/2011/concentric-css/ + */ + +export default [ + // CSS Modules + ['composes'], + + // `all` property + ['all'], + + // Pointer + ['pointer-events', 'touch-action'], + + // Placement + [ + 'display', + 'position', + 'top', + 'right', + 'bottom', + 'left', + 'inset', + 'inset-block', + 'inset-block-start', + 'inset-block-end', + 'inset-inline', + 'inset-inline-start', + 'inset-inline-end', + 'z-index', + 'flex', + 'flex-basis', + 'flex-direction', + 'flex-flow', + 'flex-grow', + 'flex-shrink', + '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', + 'place-content', + 'place-items', + 'place-self', + 'order', + 'columns', + 'column-fill', + 'column-rule', + 'column-rule-width', + 'column-rule-style', + 'column-rule-color', + 'column-span', + 'column-count', + 'column-width', + 'float', + 'clear', + 'transform', + 'transform-origin', + 'transform-style', + 'perspective', + 'perspective-origin', + 'backface-visibility' + ], + + // Animation + [ + 'will-change', + 'transition', + 'transition-property', + 'transition-duration', + 'transition-timing-function', + 'transition-delay', + 'animation', + 'animation-name', + 'animation-duration', + 'animation-timing-function', + 'animation-delay', + 'animation-iteration-count', + 'animation-direction', + 'animation-fill-mode', + 'animation-play-state' + ], + + // Visibility + [ + 'visibility', + 'appearance', + 'opacity', + 'filter', + 'backdrop-filter', + 'mix-blend-mode', + 'isolation', + 'clip-path', + 'mask', + 'mask-clip', + 'mask-composite', + 'mask-image', + 'mask-mode', + 'mask-origin', + 'mask-position', + 'mask-repeat', + 'mask-size' + ], + + // Container Queries + [ + 'container', + 'container-name', + 'container-type' + ], + + // Box + [ + 'margin', + 'margin-top', + 'margin-right', + 'margin-bottom', + 'margin-left', + 'margin-block', + 'margin-block-start', + 'margin-block-end', + 'margin-inline', + 'margin-inline-start', + 'margin-inline-end', + 'box-shadow', + 'box-sizing', + 'outline', + 'outline-offset', + 'outline-width', + 'outline-style', + 'outline-color', + 'border', + 'border-top', + 'border-right', + 'border-bottom', + 'border-left', + 'border-block', + 'border-block-start', + 'border-block-end', + 'border-inline', + 'border-inline-start', + 'border-inline-end', + 'border-width', + 'border-top-width', + 'border-right-width', + 'border-bottom-width', + 'border-left-width', + 'border-block-width', + 'border-block-start-width', + 'border-block-end-width', + 'border-inline-width', + 'border-inline-start-width', + 'border-inline-end-width', + 'border-style', + 'border-top-style', + 'border-right-style', + 'border-bottom-style', + 'border-left-style', + 'border-block-style', + 'border-block-start-style', + 'border-block-end-style', + 'border-inline-style', + 'border-inline-start-style', + 'border-inline-end-style', + 'border-radius', + 'border-top-left-radius', + 'border-top-right-radius', + 'border-bottom-left-radius', + 'border-bottom-right-radius', + 'border-start-start-radius', + 'border-start-end-radius', + 'border-end-start-radius', + 'border-end-end-radius', + 'border-color', + 'border-top-color', + 'border-right-color', + 'border-bottom-color', + 'border-left-color', + 'border-block-color', + 'border-block-start-color', + 'border-block-end-color', + 'border-inline-color', + 'border-inline-start-color', + 'border-inline-end-color', + 'border-image', + 'border-image-source', + 'border-image-slice', + 'border-image-width', + 'border-image-outset', + 'border-image-repeat', + 'background', + 'background-attachment', + 'background-clip', + 'background-color', + 'background-image', + 'background-origin', + 'background-repeat', + 'background-position', + 'background-position-x', + 'background-position-y', + 'background-size', + 'background-blend-mode', + 'cursor', + 'padding', + 'padding-top', + 'padding-right', + 'padding-bottom', + 'padding-left', + 'padding-block', + 'padding-block-start', + 'padding-block-end', + 'padding-inline', + 'padding-inline-start', + 'padding-inline-end' + ], + + // Dimensions + [ + 'aspect-ratio', + 'width', + 'min-width', + 'max-width', + 'height', + 'min-height', + 'max-height', + 'block-size', + 'min-block-size', + 'max-block-size', + 'inline-size', + 'min-inline-size', + 'max-inline-size', + 'overflow', + 'overflow-x', + 'overflow-y', + 'overflow-anchor', + 'overflow-wrap', + 'resize', + 'object-fit', + 'object-position', + 'list-style', + 'list-style-type', + 'list-style-position', + 'list-style-image', + 'caption-side', + 'table-layout', + 'border-collapse', + 'border-spacing', + 'empty-cells' + ], + + // Scroll + [ + 'scroll-behavior', + 'scroll-margin', + 'scroll-margin-top', + 'scroll-margin-right', + 'scroll-margin-bottom', + 'scroll-margin-left', + 'scroll-padding', + 'scroll-padding-top', + 'scroll-padding-right', + 'scroll-padding-bottom', + 'scroll-padding-left', + 'scroll-snap-type', + 'scroll-snap-align', + 'scroll-snap-stop', + 'scrollbar-width', + 'scrollbar-color', + 'overscroll-behavior', + 'overscroll-behavior-x', + 'overscroll-behavior-y' + ], + + // Text + [ + 'vertical-align', + 'text-align', + 'text-align-last', + 'text-indent', + 'text-transform', + 'text-decoration', + 'text-decoration-line', + 'text-decoration-color', + 'text-decoration-style', + 'text-decoration-thickness', + 'text-underline-offset', + 'text-underline-position', + 'text-rendering', + 'text-shadow', + 'text-overflow', + 'text-emphasis', + 'text-emphasis-color', + 'text-emphasis-style', + 'text-emphasis-position', + 'line-height', + 'word-break', + 'word-wrap', + 'word-spacing', + 'letter-spacing', + 'white-space', + 'tab-size', + 'hyphens', + 'writing-mode', + 'direction', + 'unicode-bidi', + 'text-orientation', + 'text-combine-upright', + 'user-select', + 'color', + 'font', + 'font-family', + 'font-size', + 'font-weight', + 'font-smoothing', + 'font-style', + 'font-variant', + 'font-variant-caps', + 'font-variant-numeric', + 'font-variant-ligatures', + 'font-stretch', + 'font-display', + 'font-feature-settings', + 'font-variation-settings', + 'content', + 'quotes', + 'counter-reset', + 'counter-increment' + ] +] diff --git a/packages/stylelint-config/src/subconfigs/logical.js b/packages/stylelint-config/src/subconfigs/logical.js new file mode 100644 index 0000000..3917ef7 --- /dev/null +++ b/packages/stylelint-config/src/subconfigs/logical.js @@ -0,0 +1,21 @@ +/** + * Logical config + */ + +export default { + plugins: ['stylelint-plugin-logical-css'], + rules: { + 'plugin/use-logical-properties-and-values': [ + true, + { + severity: 'warning' + } + ], + 'plugin/use-logical-units': [ + true, + { + severity: 'warning' + } + ] + } +} diff --git a/packages/stylelint-config/src/subconfigs/matchers.js b/packages/stylelint-config/src/subconfigs/matchers.js new file mode 100644 index 0000000..ba027da --- /dev/null +++ b/packages/stylelint-config/src/subconfigs/matchers.js @@ -0,0 +1,11 @@ +/** + * Identifiers cases matchers + */ + +export const pascalCaseMatcher = /^([A-Z][a-z\d]*)+$/ + +export const camelCaseMatcher = /^[a-z\d]+([A-Z][a-z\d]*)*$/ + +export const strictMediaQueryMatcher = /^media([A-Z][a-z\d]*)+$/ + +export const strictCustomPropertyMatcher = /^(size|color|duration|shadow|opacity|zIndex|font|animation)([A-Z][a-z\d]*)+$/ diff --git a/packages/stylelint-config/src/subconfigs/scss.js b/packages/stylelint-config/src/subconfigs/scss.js new file mode 100644 index 0000000..7b0bcf8 --- /dev/null +++ b/packages/stylelint-config/src/subconfigs/scss.js @@ -0,0 +1,107 @@ +/** + * SCSS config + */ + +import scss from 'postcss-scss' +import commonConfig from './common.js' +import { camelCaseMatcher } from './matchers.js' + +const { rules: commonRules } = commonConfig + +export default { + plugins: ['stylelint-scss'], + customSyntax: scss, + rules: { + // @ + 'scss/at-each-key-value-single-line': true, + 'scss/at-else-closing-brace-newline-after': 'always-last-in-chain', + 'scss/at-else-closing-brace-space-after': 'always-intermediate', + 'scss/at-else-empty-line-before': 'never', + 'at-rule-empty-line-before': [ + commonRules['at-rule-empty-line-before'][0], + { + ...commonRules['at-rule-empty-line-before'][1], + ignoreAtRules: ['else'] + } + ], + 'scss/at-else-if-parentheses-space-before': 'always', + 'scss/at-extend-no-missing-placeholder': true, + 'scss/at-function-parentheses-space-before': 'never', + 'scss/at-function-pattern': [ + camelCaseMatcher, + { + message: 'Expected SCSS function name to be in camelCase (e.g. "calculateWidth", "getColor")' + } + ], + 'function-name-case': [ + commonRules['function-name-case'], + { + ignoreFunctions: [camelCaseMatcher] + } + ], + 'scss/at-if-closing-brace-newline-after': 'always-last-in-chain', + 'scss/at-if-closing-brace-space-after': 'always-intermediate', + '@stylistic/block-closing-brace-newline-after': [ + commonRules['@stylistic/block-closing-brace-newline-after'], + { + ignoreAtRules: ['if', 'else'] + } + ], + 'scss/at-if-no-null': true, + 'scss/load-no-partial-leading-underscore': true, + 'scss/load-partial-extension': 'never', + 'scss/at-mixin-argumentless-call-parentheses': 'never', + 'scss/at-mixin-parentheses-space-before': 'never', + 'scss/at-mixin-pattern': [ + camelCaseMatcher, + { + message: 'Expected SCSS mixin name to be in camelCase (e.g. "buttonStyle", "flexCenter")' + } + ], + 'scss/at-rule-conditional-no-parentheses': true, + 'at-rule-no-unknown': null, + 'scss/at-rule-no-unknown': commonRules['at-rule-no-unknown'], + // $ + 'scss/dollar-variable-colon-newline-after': 'always-multi-line', + 'scss/dollar-variable-colon-space-after': 'always-single-line', + 'scss/dollar-variable-colon-space-before': 'never', + 'scss/dollar-variable-no-missing-interpolation': true, + 'scss/dollar-variable-pattern': [ + camelCaseMatcher, + { + message: 'Expected SCSS variable name to be in camelCase (e.g. "$primaryColor", "$fontSize")' + } + ], + // % + 'scss/percent-placeholder-pattern': [ + camelCaseMatcher, + { + message: 'Expected SCSS placeholder name to be in camelCase (e.g. "%buttonBase", "%clearfix")' + } + ], + // // + 'scss/double-slash-comment-whitespace-inside': 'always', + // Comment + 'scss/comment-no-empty': true, + // Declaration + 'scss/declaration-nested-properties': 'never', + 'scss/declaration-nested-properties-no-divided-groups': true, + // Dimension + 'scss/dimension-no-non-numeric-values': true, + // Function + 'scss/function-quote-no-quoted-strings-inside': true, + 'scss/function-unquote-no-unquoted-strings-inside': true, + // Operator + 'scss/operator-no-newline-after': true, + 'scss/operator-no-newline-before': true, + 'scss/operator-no-unspaced': true, + // Partial + 'scss/partial-no-import': true, + // Selector + 'scss/selector-no-redundant-nesting-selector': true, + // General / Sheet + 'scss/no-duplicate-dollar-variables': true, + 'scss/no-duplicate-mixins': true, + 'scss/no-global-function-names': true + } +} diff --git a/packages/stylelint-config/src/subconfigs/strict.js b/packages/stylelint-config/src/subconfigs/strict.js new file mode 100644 index 0000000..df5c6ae --- /dev/null +++ b/packages/stylelint-config/src/subconfigs/strict.js @@ -0,0 +1,43 @@ +/** + * Strict config + */ + +import { + strictCustomPropertyMatcher, + strictMediaQueryMatcher +} from './matchers.js' + +export default { + plugins: ['stylelint-declaration-strict-value', 'stylelint-plugin-a11y'], + rules: { + 'scale-unlimited/declaration-strict-value': [ + ['font-family', '/color([^A-Z]|$)/'], + { + disableFix: true, + ignoreKeywords: [ + 'currentColor', + 'transparent', + 'inherit' + ] + } + ], + 'a11y/line-height-is-vertical-rhythmed': [ + true, + { + severity: 'warning' + } + ], + 'custom-property-pattern': [ + strictCustomPropertyMatcher, + { + message: 'Expected custom property name to be in camelCase (e.g. "--colorPrimary", "--sizeFont")' + } + ], + 'custom-media-pattern': [ + strictMediaQueryMatcher, + { + message: 'Expected custom media query name to be in camelCase (e.g. "--mediaSmallScreen", "--mediaTabletAndUp")' + } + ] + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8be086..e3821d0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -164,6 +164,44 @@ importers: version: 5.0.0 publishDirectory: package + packages/stylelint-config: + dependencies: + '@stylistic/stylelint-plugin': + specifier: ^3.1.3 + version: 3.1.3(stylelint@16.21.1(typescript@5.8.3)) + postcss-scss: + specifier: ^4.0.9 + version: 4.0.9(postcss@8.5.6) + stylelint-csstree-validator: + specifier: ^3.0.0 + version: 3.0.0(stylelint@16.21.1(typescript@5.8.3)) + stylelint-declaration-strict-value: + specifier: ^1.1.3 + version: 1.10.11(stylelint@16.21.1(typescript@5.8.3)) + stylelint-gamut: + specifier: ^1.3.4 + version: 1.3.4(stylelint@16.21.1(typescript@5.8.3)) + stylelint-high-performance-animation: + specifier: ^1.5.1 + version: 1.11.0(stylelint@16.21.1(typescript@5.8.3)) + stylelint-order: + specifier: ^7.0.0 + version: 7.0.0(stylelint@16.21.1(typescript@5.8.3)) + stylelint-plugin-a11y: + specifier: ^1.0.1 + version: 1.0.1(stylelint@16.21.1(typescript@5.8.3)) + stylelint-plugin-logical-css: + specifier: ^1.2.3 + version: 1.2.3(stylelint@16.21.1(typescript@5.8.3)) + stylelint-scss: + specifier: ^6.12.1 + version: 6.12.1(stylelint@16.21.1(typescript@5.8.3)) + devDependencies: + stylelint: + specifier: ^16.21.1 + version: 16.21.1(typescript@5.8.3) + publishDirectory: package + packages: '@aashutoshrathi/word-wrap@1.2.6': @@ -266,6 +304,39 @@ packages: resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==} engines: {node: '>=v18'} + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@csstools/media-query-list-parser@3.0.1': + resolution: {integrity: sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.1 + '@csstools/css-tokenizer': ^3.0.1 + + '@csstools/media-query-list-parser@4.0.3': + resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/selector-specificity@5.0.0': + resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + + '@dual-bundle/import-meta-resolve@4.1.0': + resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} + '@es-joy/jsdoccomment@0.52.0': resolution: {integrity: sha512-BXuN7BII+8AyNtn57euU2Yxo9yA/KUDNzrpXyi3pfqKmBhhysR6ZWOebFh3vyPoqA3/j1SOvGgucElMGwlXing==} engines: {node: '>=20.11.0'} @@ -493,6 +564,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.4': resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@keyv/serialize@1.0.3': + resolution: {integrity: sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -734,6 +808,12 @@ packages: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} + '@stylistic/stylelint-plugin@3.1.3': + resolution: {integrity: sha512-85fsmzgsIVmyG3/GFrjuYj6Cz8rAM7IZiPiXCMiSMfoDOC1lOrzrXPDk24WqviAghnPqGpx8b0caK2PuewWGFg==} + engines: {node: ^18.12 || >=20.9} + peerDependencies: + stylelint: ^16.8.0 + '@swc/core-darwin-arm64@1.12.9': resolution: {integrity: sha512-GACFEp4nD6V+TZNR2JwbMZRHB+Yyvp14FrcmB6UCUYmhuNWjkxi+CLnEvdbuiKyQYv0zA+TRpCHZ+whEs6gwfA==} engines: {node: '>=10'} @@ -1032,6 +1112,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} @@ -1043,6 +1127,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1069,6 +1156,9 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} @@ -1076,6 +1166,9 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cacheable@1.10.1: + resolution: {integrity: sha512-Fa2BZY0CS9F0PFc/6aVA6tgpOdw+hmv9dkZOlHXII5v5Hw+meJBIWDcPrG9q/dXxGcNbym5t77fzmawrBQfTmQ==} + cachedir@2.3.0: resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} engines: {node: '>=6'} @@ -1172,6 +1265,12 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorjs.io@0.4.5: + resolution: {integrity: sha512-yCtUNCmge7llyfd/Wou19PMAcf5yC3XXhgFoAh6zsO2pGswhUPBaaUh8jzgHnXtXuZyFKzXZNAnyF5i+apICow==} + comment-parser@1.4.1: resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} engines: {node: '>= 12.0.0'} @@ -1237,6 +1336,23 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + css-functions-list@3.2.3: + resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} + engines: {node: '>=12 || >=16'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + cz-conventional-changelog@3.3.0: resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} @@ -1576,6 +1692,10 @@ packages: fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -1591,6 +1711,9 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} + file-entry-cache@10.1.1: + resolution: {integrity: sha512-zcmsHjg2B2zjuBgjdnB+9q0+cWcgWfykIcsDkWDB4GTPtl1eXUA+gTI6sO0u01AqK3cliHryTU55/b2Ow1hfZg==} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1633,6 +1756,9 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} + flat-cache@6.1.11: + resolution: {integrity: sha512-zfOAns94mp7bHG/vCn9Ru2eDCmIxVQ5dELUHKjHfDEOJmHNzE+uGa6208kfkgmtym4a0FFjEuFksCXFacbVhSg==} + flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -1718,10 +1844,18 @@ packages: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} engines: {node: '>=0.10.0'} + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + global-prefix@1.0.2: resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} engines: {node: '>=0.10.0'} + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -1742,6 +1876,9 @@ packages: resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} engines: {node: '>=18'} + globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -1812,6 +1949,9 @@ packages: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} + hookified@1.10.0: + resolution: {integrity: sha512-dJw0492Iddsj56U1JsSTm9E/0B/29a1AuoSLRAte8vQg/kaTGF3IgjEWT8c8yG4cC10+HisE1x5QAwR0Xwc+DA==} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -1819,6 +1959,10 @@ packages: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -2129,10 +2273,19 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@5.3.4: + resolution: {integrity: sha512-ypEvQvInNpUe+u+w8BIcPkQvEqXquyyibWE/1NB5T2BTzIpS5cGEV1LZskDzPSTvNAaT4+5FutvzlvnkxOSKlw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} + known-css-properties@0.36.0: + resolution: {integrity: sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==} + + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2187,6 +2340,9 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} @@ -2230,6 +2386,18 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + + mdn-data@2.22.1: + resolution: {integrity: sha512-u9Xnc9zLuF/CL2IHPow7HcXPpb8okQyzYpwL5wFsY//JRedSWYglYRg3PYWoQCu1zO+tBTmWOJN/iM0mPC5CRQ==} + meow@12.1.1: resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} engines: {node: '>=16.10'} @@ -2328,6 +2496,10 @@ packages: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} @@ -2521,6 +2693,40 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + + postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} + + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss-sorting@9.1.0: + resolution: {integrity: sha512-Mn8KJ45HNNG6JBpBizXcyf6LqY/qyqetGcou/nprDnFwBFBLGj0j/sNKV2lj2KMOVOwdXu14aEzqJv8CIV6e8g==} + peerDependencies: + postcss: ^8.4.20 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -2757,6 +2963,10 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + sort-keys@4.2.0: resolution: {integrity: sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==} engines: {node: '>=8'} @@ -2860,6 +3070,61 @@ packages: strip-literal@3.0.0: resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + style-search@0.1.0: + resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} + + stylelint-csstree-validator@3.0.0: + resolution: {integrity: sha512-/CPYhwchWZbyZK2LVGKvt1ivISYZyRSRhrY4cMArlwYh1DxwygubR0nBv+5upuX23j1qBfJWdv6xx9dsUZF+OA==} + engines: {node: ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + peerDependencies: + stylelint: '>=7.0.0 <16.0.0' + + stylelint-declaration-strict-value@1.10.11: + resolution: {integrity: sha512-oVQvhZlFZAiDz9r2BPFZLtTGm1A2JVhdKObKAJoTjFfR4F/NpApC4bMBTxf4sZS76Na3njYKVOaAaKSZ4+FU+g==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: '>=7 <=16' + + stylelint-gamut@1.3.4: + resolution: {integrity: sha512-mN/8BRPNGlKwf/lGrR9JjW9Abm6e7lCn7fiq4M6a4RxDCU/R6lSUI65R6cdo5BV14qf3GmrqNBAjmSujBVrHoA==} + engines: {node: '>=16.0.0'} + peerDependencies: + stylelint: ^14.0.0 || ^15.0.0 || ^16.0.0 + + stylelint-high-performance-animation@1.11.0: + resolution: {integrity: sha512-bo+VfSH5RmjVmu61BZeN4cBK+PGHpG5jfvaUsw0db+1sAqKuEGjzmxEbf271/Jq3HJHj8wyi/rCg1IcxxnIiiQ==} + peerDependencies: + stylelint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + + stylelint-order@7.0.0: + resolution: {integrity: sha512-rSWxx0KscYfxU02wEskKXES9lkRzuuONMMNkZ7SUc6uiF3tDKm7e+sE0Ax/SBlG4TUf1sp1R6f3/SlsPGmzthg==} + engines: {node: '>=20.19.0'} + peerDependencies: + stylelint: ^16.18.0 + + stylelint-plugin-a11y@1.0.1: + resolution: {integrity: sha512-1LZacIJc1nanLQshHxRdTwGeTamUJ8OBS4a1c+0+lnQAyaGFrwg6qr95QQ/fA+BOkbv5C3S0zkQ3/avNtZxs+Q==} + engines: {node: '>=20'} + peerDependencies: + stylelint: '>=16.0.0' + + stylelint-plugin-logical-css@1.2.3: + resolution: {integrity: sha512-yzSDrw4yyZJosgMablqqQzCeJmsPRAK/H7X1XzliQkYvoC/ZHBfHKos27dQEwwSLBUaYg+7nJ1ct7OlST4iqZA==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^14.0.0 || ^15.0.0 || ^16.0.0 + + stylelint-scss@6.12.1: + resolution: {integrity: sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.0.2 + + stylelint@16.21.1: + resolution: {integrity: sha512-WCXdXnYK2tpCbebgMF0Bme3YZH/Rh/UXerj75twYo4uLULlcrLwFVdZTvTEF8idFnAcW21YUDJFyKOfaf6xJRw==} + engines: {node: '>=18.12.0'} + hasBin: true + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -2868,10 +3133,21 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-hyperlinks@3.2.0: + resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} + engines: {node: '>=14.18'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} + engines: {node: '>=10.0.0'} + text-extensions@2.4.0: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} @@ -3346,6 +3622,28 @@ snapshots: '@types/conventional-commits-parser': 5.0.1 chalk: 5.4.1 + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-tokenizer@3.0.4': {} + + '@csstools/media-query-list-parser@3.0.1(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': + dependencies: + postcss-selector-parser: 7.1.0 + + '@dual-bundle/import-meta-resolve@4.1.0': {} + '@es-joy/jsdoccomment@0.52.0': dependencies: '@types/estree': 1.0.8 @@ -3496,6 +3794,10 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.4': {} + '@keyv/serialize@1.0.3': + dependencies: + buffer: 6.0.3 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3753,6 +4055,18 @@ snapshots: '@sindresorhus/merge-streams@2.3.0': {} + '@stylistic/stylelint-plugin@3.1.3(stylelint@16.21.1(typescript@5.8.3))': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/media-query-list-parser': 3.0.1(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + is-plain-object: 5.0.0 + postcss: 8.5.6 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + style-search: 0.1.0 + stylelint: 16.21.1(typescript@5.8.3) + '@swc/core-darwin-arm64@1.12.9': optional: true @@ -4094,6 +4408,8 @@ snapshots: assertion-error@2.0.1: {} + astral-regex@2.0.0: {} + at-least-node@1.0.0: {} available-typed-arrays@1.0.7: @@ -4102,6 +4418,8 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@2.0.0: {} + base64-js@1.5.1: {} before-after-hook@2.2.3: {} @@ -4134,12 +4452,22 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + builtins@5.0.1: dependencies: semver: 7.5.4 cac@6.7.14: {} + cacheable@1.10.1: + dependencies: + hookified: 1.10.0 + keyv: 5.3.4 + cachedir@2.3.0: {} call-bind-apply-helpers@1.0.2: @@ -4236,6 +4564,10 @@ snapshots: color-name@1.1.4: {} + colord@2.9.3: {} + + colorjs.io@0.4.5: {} + comment-parser@1.4.1: {} commitizen@4.3.1(@types/node@20.19.4)(typescript@5.8.3): @@ -4319,6 +4651,20 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-functions-list@3.2.3: {} + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + + cssesc@3.0.0: {} + cz-conventional-changelog@3.3.0(@types/node@20.19.4)(typescript@5.8.3): dependencies: chalk: 2.4.2 @@ -4798,6 +5144,8 @@ snapshots: fast-uri@3.0.6: {} + fastest-levenshtein@1.0.16: {} + fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -4810,6 +5158,10 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 + file-entry-cache@10.1.1: + dependencies: + flat-cache: 6.1.11 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -4859,6 +5211,12 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 + flat-cache@6.1.11: + dependencies: + cacheable: 1.10.1 + flatted: 3.3.3 + hookified: 1.10.0 + flatted@3.3.3: {} for-each@0.3.3: @@ -4971,6 +5329,10 @@ snapshots: is-windows: 1.0.2 resolve-dir: 1.0.1 + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + global-prefix@1.0.2: dependencies: expand-tilde: 2.0.2 @@ -4979,6 +5341,12 @@ snapshots: is-windows: 1.0.2 which: 1.3.1 + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + globals@14.0.0: {} globals@16.3.0: {} @@ -5006,6 +5374,8 @@ snapshots: slash: 5.1.0 unicorn-magic: 0.3.0 + globjoin@0.1.4: {} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.1 @@ -5062,12 +5432,16 @@ snapshots: dependencies: parse-passwd: 1.0.0 + hookified@1.10.0: {} + hosted-git-info@2.8.9: {} hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 + html-tags@3.3.1: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -5360,8 +5734,16 @@ snapshots: dependencies: json-buffer: 3.0.1 + keyv@5.3.4: + dependencies: + '@keyv/serialize': 1.0.3 + kind-of@6.0.3: {} + known-css-properties@0.36.0: {} + + known-css-properties@0.37.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -5403,6 +5785,8 @@ snapshots: lodash.startcase@4.4.0: {} + lodash.truncate@4.4.2: {} + lodash.uniq@4.5.0: {} lodash.upperfirst@4.3.1: {} @@ -5436,6 +5820,14 @@ snapshots: math-intrinsics@1.1.0: {} + mathml-tag-names@2.1.3: {} + + mdn-data@2.0.30: {} + + mdn-data@2.12.2: {} + + mdn-data@2.22.1: {} + meow@12.1.1: {} meow@13.2.0: {} @@ -5529,6 +5921,8 @@ snapshots: semver: 7.5.4 validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} + normalize-url@6.1.0: {} npm-package-json-lint-config-default@6.0.0(npm-package-json-lint@7.1.0(typescript@5.8.3)): @@ -5742,6 +6136,34 @@ snapshots: possible-typed-array-names@1.1.0: {} + postcss-media-query-parser@0.2.3: {} + + postcss-resolve-nested-selector@0.1.6: {} + + postcss-safe-parser@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-scss@4.0.9(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-sorting@9.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-value-parser@4.2.0: {} + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -6028,6 +6450,12 @@ snapshots: slash@5.1.0: {} + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + sort-keys@4.2.0: dependencies: is-plain-obj: 2.1.0 @@ -6146,6 +6574,98 @@ snapshots: dependencies: js-tokens: 9.0.1 + style-search@0.1.0: {} + + stylelint-csstree-validator@3.0.0(stylelint@16.21.1(typescript@5.8.3)): + dependencies: + css-tree: 2.3.1 + stylelint: 16.21.1(typescript@5.8.3) + + stylelint-declaration-strict-value@1.10.11(stylelint@16.21.1(typescript@5.8.3)): + dependencies: + stylelint: 16.21.1(typescript@5.8.3) + + stylelint-gamut@1.3.4(stylelint@16.21.1(typescript@5.8.3)): + dependencies: + colorjs.io: 0.4.5 + stylelint: 16.21.1(typescript@5.8.3) + + stylelint-high-performance-animation@1.11.0(stylelint@16.21.1(typescript@5.8.3)): + dependencies: + postcss-value-parser: 4.2.0 + stylelint: 16.21.1(typescript@5.8.3) + + stylelint-order@7.0.0(stylelint@16.21.1(typescript@5.8.3)): + dependencies: + postcss: 8.5.6 + postcss-sorting: 9.1.0(postcss@8.5.6) + stylelint: 16.21.1(typescript@5.8.3) + + stylelint-plugin-a11y@1.0.1(stylelint@16.21.1(typescript@5.8.3)): + dependencies: + postcss: 8.5.6 + stylelint: 16.21.1(typescript@5.8.3) + + stylelint-plugin-logical-css@1.2.3(stylelint@16.21.1(typescript@5.8.3)): + dependencies: + stylelint: 16.21.1(typescript@5.8.3) + + stylelint-scss@6.12.1(stylelint@16.21.1(typescript@5.8.3)): + dependencies: + css-tree: 3.1.0 + is-plain-object: 5.0.0 + known-css-properties: 0.36.0 + mdn-data: 2.22.1 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.6 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + stylelint: 16.21.1(typescript@5.8.3) + + stylelint@16.21.1(typescript@5.8.3): + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) + '@dual-bundle/import-meta-resolve': 4.1.0 + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 9.0.0(typescript@5.8.3) + css-functions-list: 3.2.3 + css-tree: 3.1.0 + debug: 4.4.1 + fast-glob: 3.3.3 + fastest-levenshtein: 1.0.16 + file-entry-cache: 10.1.1 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 7.0.5 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.37.0 + mathml-tag-names: 2.1.3 + meow: 13.2.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-resolve-nested-selector: 0.1.6 + postcss-safe-parser: 7.0.1(postcss@8.5.6) + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + supports-hyperlinks: 3.2.0 + svg-tags: 1.0.0 + table: 6.9.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + - typescript + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -6154,8 +6674,23 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-hyperlinks@3.2.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + supports-preserve-symlinks-flag@1.0.0: {} + svg-tags@1.0.0: {} + + table@6.9.0: + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + text-extensions@2.4.0: {} through@2.3.8: {}