-
-
Notifications
You must be signed in to change notification settings - Fork 976
Fix declaration-block-no-duplicate-properties
false negatives for named colors with ignore: ['consecutive-duplicates-with-different-syntaxes']
#8665
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
🦋 Changeset detectedLatest commit: 874bed3 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
…cate detection; added comprehensive tests for named color scenarios
0cc8154
to
0514f8a
Compare
This PR is packaged and the instant preview is available (874bed3). View the demo website. Install it locally: npm i -D https://pkg.pr.new/stylelint@874bed3 |
lib/rules/declaration-block-no-duplicate-properties/__tests__/index.mjs
Outdated
Show resolved
Hide resolved
Hello @sw1tch3roo, Thanks for your first contribution. Check my comment above. You should also filter out the properties using our p {
animation-name: red;
animation-name: black;
} |
…es only, preventing false negatives for properties like scrollbar-color, border-color, and animation-name
…olors' into fix-duplicate-properties-named-colors
Thank u for the review @Mouvedia!! I've implemented the fix by restricting named color equivalence to only properties in the All the test cases you mentioned now pass correctly =) |
If the goal of the PR is to only target color properties then you have to restrict it to
a {
border-color: red yellow;
border-color: green;
} won't produce an error in the demo; is it by design?
Is the number of values considered a different "type"? |
Honestly, I was a bit confused by all the edge cases at first, but after going through everything again I think we got it right now =D After that confusion earlier, I kept the named color logic but refined it to only apply to actual color properties and respect that different value counts = different syntaxes. So a {
border-color: red yellow;
border-color: green;
} correctly doesn't error since they have different structures |
As I asked before, is that the expected behaviour? ref In particular
seems to indicate that it should error out? |
@Mouvedia yep, this is expected behavior
I think so. So this case has different structures: a {
border-color: red yellow;
border-color: green;
} So we treat them as different syntaxes - no error with the ignore option. Our named color logic only kicks in when values have the same structure (like We're being smarter about it - instead of just comparing keywords, we look at the whole value syntax. This catches real duplicates while allowing legitimate fallback patterns, which is what @romainmenke wanted |
@Mouvedia @romainmenke guys, what do you think about the above? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for your efforts working through the edge cases of this pull request.
I've made one minor request. Otherwise, it LGTM.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thank you.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks 👍
| datasource | package | from | to | | ---------- | --------- | ------- | ------- | | npm | stylelint | 16.20.0 | 16.23.0 | ## [v16.23.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16230---2025-07-29) It adds 5 new rules, 1 option to a rule and fixes 3 bugs. We've turned on the new rules in our [standard config](https://www.npmjs.com/package/stylelint-config-standard). - Added: `block-no-redundant-nested-style-rules` rule ([#8684](stylelint/stylelint#8684)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `media-type-no-deprecated` rule ([#8668](stylelint/stylelint#8668)) ([@immitsu](https://github.com/immitsu)). - Added: `nesting-selector-no-missing-scoping-root` rule ([#8674](stylelint/stylelint#8674)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `no-invalid-position-declaration` rule ([#8669](stylelint/stylelint#8669)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `property-no-deprecated` rule ([#8682](stylelint/stylelint#8682)) ([@immitsu](https://github.com/immitsu)). - Added: `except: ["exact-value"]` to `media-feature-range-notation` ([#8675](stylelint/stylelint#8675)) ([@immitsu](https://github.com/immitsu)). - Fixed: `declaration-block-no-duplicate-properties` false negatives for named colors with `ignore: ['consecutive-duplicates-with-different-syntaxes']` ([#8665](stylelint/stylelint#8665)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Fixed: `function-no-unknown` false positives ([#8677](stylelint/stylelint#8677)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `no-irregular-whitespace` false positives for strings ([#8667](stylelint/stylelint#8667)) ([@immitsu](https://github.com/immitsu)). ## [v16.22.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16220---2025-07-18) It adds 3 rule features and fixes 2 bugs. - Added: `messageArgs` to `color-named` ([#8663](stylelint/stylelint#8663)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `messageArgs` to `declaration-property-value-keyword-no-deprecated` ([#8654](stylelint/stylelint#8654)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `no-descending-specificity` report message includes line number of the anchoring selector ([#8666](stylelint/stylelint#8666)) ([@immitsu](https://github.com/immitsu)). - Fixed: `at-rule-no-deprecated` false positives for `@apply` ([#8630](stylelint/stylelint#8630)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `lightness-notation` crash with `"number"` option and single-digit percentage ([#8661](stylelint/stylelint#8661)) ([@ybiquitous](https://github.com/ybiquitous)). ## [v16.21.1](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16211---2025-07-03) It fixes 3 bugs. - Fixed: unexpected change of syntax in computed `EditInfo` ([#8638](stylelint/stylelint#8638)) ([@romainmenke](https://github.com/romainmenke)). - Fixed: `function-linear-gradient-no-nonstandard-direction` false positives for CSS variables' names containing a direction substring ([#8643](stylelint/stylelint#8643)) ([@Solomon-mithra](https://github.com/Solomon-mithra)). - Fixed: `media-feature-range-notation` autofix for exact values ([#8651](stylelint/stylelint#8651)) ([@romainmenke](https://github.com/romainmenke)). ## [v16.21.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16210---2025-06-19) It rounds out the `message` secondary option and marks it as stable, adds 1 new option to a rule, and fixes 4 bugs. - Added: non-experimental support for functional `message` secondary option ([#8595](stylelint/stylelint#8595)) ([@ybiquitous](https://github.com/ybiquitous)). - Added: `ignore: ["after-custom-property"]` to `custom-property-empty-line-before` ([#8627](stylelint/stylelint#8627)) ([@imkesin](https://github.com/imkesin)). - Fixed: `cache` configuration property not being respected ([#8599](stylelint/stylelint#8599)) ([@ybiquitous](https://github.com/ybiquitous)). - Fixed: `fastest-levenshtein` import when bundling ([#8621](stylelint/stylelint#8621)) ([@onigoetz](https://github.com/onigoetz)). - Fixed: `named-grid-areas-no-invalid` false positives for interpolated grid-template-areas in CSS-in-JS ([#8606](stylelint/stylelint#8606)) ([@shahana308](https://github.com/shahana308)). - Fixed: `selector-pseudo-*-no-unknown` false positives for the missing form control styling selectors ([#8623](stylelint/stylelint#8623)) ([@tyrann0us](https://github.com/tyrann0us)).
| datasource | package | from | to | | ---------- | --------- | ------- | ------- | | npm | stylelint | 16.20.0 | 16.23.0 | ## [v16.23.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16230---2025-07-29) It adds 5 new rules, 1 option to a rule and fixes 3 bugs. We've turned on the new rules in our [standard config](https://www.npmjs.com/package/stylelint-config-standard). - Added: `block-no-redundant-nested-style-rules` rule ([#8684](stylelint/stylelint#8684)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `media-type-no-deprecated` rule ([#8668](stylelint/stylelint#8668)) ([@immitsu](https://github.com/immitsu)). - Added: `nesting-selector-no-missing-scoping-root` rule ([#8674](stylelint/stylelint#8674)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `no-invalid-position-declaration` rule ([#8669](stylelint/stylelint#8669)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `property-no-deprecated` rule ([#8682](stylelint/stylelint#8682)) ([@immitsu](https://github.com/immitsu)). - Added: `except: ["exact-value"]` to `media-feature-range-notation` ([#8675](stylelint/stylelint#8675)) ([@immitsu](https://github.com/immitsu)). - Fixed: `declaration-block-no-duplicate-properties` false negatives for named colors with `ignore: ['consecutive-duplicates-with-different-syntaxes']` ([#8665](stylelint/stylelint#8665)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Fixed: `function-no-unknown` false positives ([#8677](stylelint/stylelint#8677)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `no-irregular-whitespace` false positives for strings ([#8667](stylelint/stylelint#8667)) ([@immitsu](https://github.com/immitsu)). ## [v16.22.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16220---2025-07-18) It adds 3 rule features and fixes 2 bugs. - Added: `messageArgs` to `color-named` ([#8663](stylelint/stylelint#8663)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `messageArgs` to `declaration-property-value-keyword-no-deprecated` ([#8654](stylelint/stylelint#8654)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `no-descending-specificity` report message includes line number of the anchoring selector ([#8666](stylelint/stylelint#8666)) ([@immitsu](https://github.com/immitsu)). - Fixed: `at-rule-no-deprecated` false positives for `@apply` ([#8630](stylelint/stylelint#8630)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `lightness-notation` crash with `"number"` option and single-digit percentage ([#8661](stylelint/stylelint#8661)) ([@ybiquitous](https://github.com/ybiquitous)). ## [v16.21.1](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16211---2025-07-03) It fixes 3 bugs. - Fixed: unexpected change of syntax in computed `EditInfo` ([#8638](stylelint/stylelint#8638)) ([@romainmenke](https://github.com/romainmenke)). - Fixed: `function-linear-gradient-no-nonstandard-direction` false positives for CSS variables' names containing a direction substring ([#8643](stylelint/stylelint#8643)) ([@Solomon-mithra](https://github.com/Solomon-mithra)). - Fixed: `media-feature-range-notation` autofix for exact values ([#8651](stylelint/stylelint#8651)) ([@romainmenke](https://github.com/romainmenke)). ## [v16.21.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16210---2025-06-19) It rounds out the `message` secondary option and marks it as stable, adds 1 new option to a rule, and fixes 4 bugs. - Added: non-experimental support for functional `message` secondary option ([#8595](stylelint/stylelint#8595)) ([@ybiquitous](https://github.com/ybiquitous)). - Added: `ignore: ["after-custom-property"]` to `custom-property-empty-line-before` ([#8627](stylelint/stylelint#8627)) ([@imkesin](https://github.com/imkesin)). - Fixed: `cache` configuration property not being respected ([#8599](stylelint/stylelint#8599)) ([@ybiquitous](https://github.com/ybiquitous)). - Fixed: `fastest-levenshtein` import when bundling ([#8621](stylelint/stylelint#8621)) ([@onigoetz](https://github.com/onigoetz)). - Fixed: `named-grid-areas-no-invalid` false positives for interpolated grid-template-areas in CSS-in-JS ([#8606](stylelint/stylelint#8606)) ([@shahana308](https://github.com/shahana308)). - Fixed: `selector-pseudo-*-no-unknown` false positives for the missing form control styling selectors ([#8623](stylelint/stylelint#8623)) ([@tyrann0us](https://github.com/tyrann0us)).
| datasource | package | from | to | | ---------- | --------- | ------- | ------- | | npm | stylelint | 16.20.0 | 16.23.0 | ## [v16.23.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16230---2025-07-29) It adds 5 new rules, 1 option to a rule and fixes 3 bugs. We've turned on the new rules in our [standard config](https://www.npmjs.com/package/stylelint-config-standard). - Added: `block-no-redundant-nested-style-rules` rule ([#8684](stylelint/stylelint#8684)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `media-type-no-deprecated` rule ([#8668](stylelint/stylelint#8668)) ([@immitsu](https://github.com/immitsu)). - Added: `nesting-selector-no-missing-scoping-root` rule ([#8674](stylelint/stylelint#8674)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `no-invalid-position-declaration` rule ([#8669](stylelint/stylelint#8669)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `property-no-deprecated` rule ([#8682](stylelint/stylelint#8682)) ([@immitsu](https://github.com/immitsu)). - Added: `except: ["exact-value"]` to `media-feature-range-notation` ([#8675](stylelint/stylelint#8675)) ([@immitsu](https://github.com/immitsu)). - Fixed: `declaration-block-no-duplicate-properties` false negatives for named colors with `ignore: ['consecutive-duplicates-with-different-syntaxes']` ([#8665](stylelint/stylelint#8665)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Fixed: `function-no-unknown` false positives ([#8677](stylelint/stylelint#8677)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `no-irregular-whitespace` false positives for strings ([#8667](stylelint/stylelint#8667)) ([@immitsu](https://github.com/immitsu)). ## [v16.22.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16220---2025-07-18) It adds 3 rule features and fixes 2 bugs. - Added: `messageArgs` to `color-named` ([#8663](stylelint/stylelint#8663)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `messageArgs` to `declaration-property-value-keyword-no-deprecated` ([#8654](stylelint/stylelint#8654)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `no-descending-specificity` report message includes line number of the anchoring selector ([#8666](stylelint/stylelint#8666)) ([@immitsu](https://github.com/immitsu)). - Fixed: `at-rule-no-deprecated` false positives for `@apply` ([#8630](stylelint/stylelint#8630)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `lightness-notation` crash with `"number"` option and single-digit percentage ([#8661](stylelint/stylelint#8661)) ([@ybiquitous](https://github.com/ybiquitous)). ## [v16.21.1](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16211---2025-07-03) It fixes 3 bugs. - Fixed: unexpected change of syntax in computed `EditInfo` ([#8638](stylelint/stylelint#8638)) ([@romainmenke](https://github.com/romainmenke)). - Fixed: `function-linear-gradient-no-nonstandard-direction` false positives for CSS variables' names containing a direction substring ([#8643](stylelint/stylelint#8643)) ([@Solomon-mithra](https://github.com/Solomon-mithra)). - Fixed: `media-feature-range-notation` autofix for exact values ([#8651](stylelint/stylelint#8651)) ([@romainmenke](https://github.com/romainmenke)). ## [v16.21.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16210---2025-06-19) It rounds out the `message` secondary option and marks it as stable, adds 1 new option to a rule, and fixes 4 bugs. - Added: non-experimental support for functional `message` secondary option ([#8595](stylelint/stylelint#8595)) ([@ybiquitous](https://github.com/ybiquitous)). - Added: `ignore: ["after-custom-property"]` to `custom-property-empty-line-before` ([#8627](stylelint/stylelint#8627)) ([@imkesin](https://github.com/imkesin)). - Fixed: `cache` configuration property not being respected ([#8599](stylelint/stylelint#8599)) ([@ybiquitous](https://github.com/ybiquitous)). - Fixed: `fastest-levenshtein` import when bundling ([#8621](stylelint/stylelint#8621)) ([@onigoetz](https://github.com/onigoetz)). - Fixed: `named-grid-areas-no-invalid` false positives for interpolated grid-template-areas in CSS-in-JS ([#8606](stylelint/stylelint#8606)) ([@shahana308](https://github.com/shahana308)). - Fixed: `selector-pseudo-*-no-unknown` false positives for the missing form control styling selectors ([#8623](stylelint/stylelint#8623)) ([@tyrann0us](https://github.com/tyrann0us)).
| datasource | package | from | to | | ---------- | --------- | ------- | ------- | | npm | stylelint | 16.20.0 | 16.23.1 | ## [v16.23.1](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16231---2025-08-07) It fixes 7 bugs. - Fixed: `no-invalid-position-declaration` false positives for embedded styles ([#8701](stylelint/stylelint#8701)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Fixed: `property-no-deprecated` erroneously autofixing `clip` ([#8699](stylelint/stylelint#8699)) ([@immitsu](https://github.com/immitsu)). - Fixed: `property-no-deprecated` false positives for `-webkit-box-orient: vertical;` ([#8699](stylelint/stylelint#8699)) ([@immitsu](https://github.com/immitsu)). - Fixed: `selector-pseudo-*-no-unknown` false positives for some meter pseudo classes/elements ([#8708](stylelint/stylelint#8708)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `selector-pseudo-class-no-unknown` false positives for `:unchecked` ([#8705](stylelint/stylelint#8705)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `selector-pseudo-element-no-unknown` false positives for `::search-text` ([#8707](stylelint/stylelint#8707)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `selector-type-no-unknown` false positives for `selectedcontent` ([#8716](stylelint/stylelint#8716)) ([@Mouvedia](https://github.com/Mouvedia)). ## [v16.23.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16230---2025-07-29) It adds 5 new rules, 1 option to a rule and fixes 3 bugs. We've turned on the new rules in our [standard config](https://www.npmjs.com/package/stylelint-config-standard). - Added: `block-no-redundant-nested-style-rules` rule ([#8684](stylelint/stylelint#8684)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `media-type-no-deprecated` rule ([#8668](stylelint/stylelint#8668)) ([@immitsu](https://github.com/immitsu)). - Added: `nesting-selector-no-missing-scoping-root` rule ([#8674](stylelint/stylelint#8674)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `no-invalid-position-declaration` rule ([#8669](stylelint/stylelint#8669)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `property-no-deprecated` rule ([#8682](stylelint/stylelint#8682)) ([@immitsu](https://github.com/immitsu)). - Added: `except: ["exact-value"]` to `media-feature-range-notation` ([#8675](stylelint/stylelint#8675)) ([@immitsu](https://github.com/immitsu)). - Fixed: `declaration-block-no-duplicate-properties` false negatives for named colors with `ignore: ['consecutive-duplicates-with-different-syntaxes']` ([#8665](stylelint/stylelint#8665)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Fixed: `function-no-unknown` false positives ([#8677](stylelint/stylelint#8677)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `no-irregular-whitespace` false positives for strings ([#8667](stylelint/stylelint#8667)) ([@immitsu](https://github.com/immitsu)). ## [v16.22.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16220---2025-07-18) It adds 3 rule features and fixes 2 bugs. - Added: `messageArgs` to `color-named` ([#8663](stylelint/stylelint#8663)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `messageArgs` to `declaration-property-value-keyword-no-deprecated` ([#8654](stylelint/stylelint#8654)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `no-descending-specificity` report message includes line number of the anchoring selector ([#8666](stylelint/stylelint#8666)) ([@immitsu](https://github.com/immitsu)). - Fixed: `at-rule-no-deprecated` false positives for `@apply` ([#8630](stylelint/stylelint#8630)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `lightness-notation` crash with `"number"` option and single-digit percentage ([#8661](stylelint/stylelint#8661)) ([@ybiquitous](https://github.com/ybiquitous)). ## [v16.21.1](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16211---2025-07-03) It fixes 3 bugs. - Fixed: unexpected change of syntax in computed `EditInfo` ([#8638](stylelint/stylelint#8638)) ([@romainmenke](https://github.com/romainmenke)). - Fixed: `function-linear-gradient-no-nonstandard-direction` false positives for CSS variables' names containing a direction substring ([#8643](stylelint/stylelint#8643)) ([@Solomon-mithra](https://github.com/Solomon-mithra)). - Fixed: `media-feature-range-notation` autofix for exact values ([#8651](stylelint/stylelint#8651)) ([@romainmenke](https://github.com/romainmenke)). ## [v16.21.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16210---2025-06-19) It rounds out the `message` secondary option and marks it as stable, adds 1 new option to a rule, and fixes 4 bugs. - Added: non-experimental support for functional `message` secondary option ([#8595](stylelint/stylelint#8595)) ([@ybiquitous](https://github.com/ybiquitous)). - Added: `ignore: ["after-custom-property"]` to `custom-property-empty-line-before` ([#8627](stylelint/stylelint#8627)) ([@imkesin](https://github.com/imkesin)). - Fixed: `cache` configuration property not being respected ([#8599](stylelint/stylelint#8599)) ([@ybiquitous](https://github.com/ybiquitous)). - Fixed: `fastest-levenshtein` import when bundling ([#8621](stylelint/stylelint#8621)) ([@onigoetz](https://github.com/onigoetz)). - Fixed: `named-grid-areas-no-invalid` false positives for interpolated grid-template-areas in CSS-in-JS ([#8606](stylelint/stylelint#8606)) ([@shahana308](https://github.com/shahana308)). - Fixed: `selector-pseudo-*-no-unknown` false positives for the missing form control styling selectors ([#8623](stylelint/stylelint#8623)) ([@tyrann0us](https://github.com/tyrann0us)).
Closes #8535
This PR fixes a false negative where duplicate named colors were not being flagged when using
ignore: ['consecutive-duplicates-with-different-syntaxes']
.The Problem:
Previously, this would not trigger a warning with ignore:
['consecutive-duplicates-with-different-syntaxes']
because the rule incorrectly treated red and blue as having different syntaxes.The Solution:
Changes:
The fix ensures consistency with how other color formats are handled and prevents unintentional duplicate declarations.