# core/predicates/css.predicate.ts

> 25 lines of code and 5 definitions.

Tree: GovLab Quality
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/quality#file-quality-core-predicates-css-predicate-ts
Source text: https://banes-lab.com/source/quality/core/predicates/css.predicate.ts.txt

Listed in [core/predicates](https://banes-lab.com/api/source/quality/core/predicates.md), after [core/predicates/coverage.predicate.ts](https://banes-lab.com/source/quality/core/predicates/coverage.predicate.ts.md) and before [core/predicates/eslint.predicate.ts](https://banes-lab.com/source/quality/core/predicates/eslint.predicate.ts.md).

## Definitions

- `atRuleAncestor` (lexical_declaration, line 16)
- `hasPxUnit` (lexical_declaration, line 4, exported)
- `insideAtRule` (lexical_declaration, line 27, exported)
- `customPropertyStartsWith` (lexical_declaration, line 8, exported)
- `{ parent }` (lexical_declaration, line 17)

## Contained in

- [core/predicates](https://banes-lab.com/anatomy/quality/folder-quality-core-predicates.md)

## Uses

- [core/parsers/css.parser.ts](https://banes-lab.com/source/quality/core/parsers/css.parser.ts.md)

## Linked from

- [core/parsers](https://banes-lab.com/anatomy/quality/folder-quality-core-parsers.md)
- [core/predicates](https://banes-lab.com/anatomy/quality/folder-quality-core-predicates.md)

## Source

```typescript
import type { CssNode } from "#types/css.types";
import { valueUnits } from "#core/parsers/css.parser";

export const hasPxUnit = function hasPxUnit(value: string): boolean {
    return valueUnits(value).some((token) => token.unit === "px");
};

export const customPropertyStartsWith = function customPropertyStartsWith(
    name: string,
    prefix: string,
    excludes: readonly string[] = [],
): boolean {
    return name.startsWith(prefix) && !excludes.some((exclude) => name.includes(exclude));
};

const atRuleAncestor = function atRuleAncestor(node: CssNode, names: Set<string>): boolean {
    const { parent } = node;
    if (!parent) {
        return false;
    }
    if (parent.type === "atrule" && names.has(parent.name ?? "")) {
        return true;
    }
    return atRuleAncestor(parent, names);
};

export const insideAtRule = function insideAtRule(node: CssNode | undefined, names: Set<string>): boolean {
    return node ? atRuleAncestor(node, names) : false;
};
```
