Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
c61ee3b
feat(css): support SCSS qualified names in values and function calls
denbezrukov Feb 13, 2026
29676fc
Revert "feat(css): support SCSS qualified names in values and functio…
denbezrukov Feb 16, 2026
11784e5
feat(css): support SCSS qualified names in values and function calls …
denbezrukov Feb 17, 2026
a1976dd
feat(css): add unary expression parsing (#9093)
denbezrukov Feb 17, 2026
4f85adb
Merge remote-tracking branch 'origin/main' into next
ematipico Feb 18, 2026
7a36937
feat(css): support scss nesting declarations in declaration lists (#9…
denbezrukov Feb 18, 2026
9f744da
feat(css): allow scss declarations in @page blocks (#9139)
denbezrukov Feb 18, 2026
7eb5e81
feat(css): allow delimiters in bracketed value lists (#9145)
denbezrukov Feb 19, 2026
3bcae80
feat(css): enhance SCSS qualified name detection and refine error mes…
denbezrukov Feb 13, 2026
c166df3
Revert "feat(css): enhance SCSS qualified name detection and refine e…
denbezrukov Feb 19, 2026
2a43488
feat(analyze/json): useSortedPackageJson (#9134)
ematipico Feb 24, 2026
9ec8500
feat: two new cross language rules (#9152)
ematipico Feb 27, 2026
8cd3da1
feat(js-api): add spanInBytesToSpanInCodeUnits helper function (#8944)
ash1day Feb 27, 2026
b805cd2
feat: collect local and global styles for `noUndeclearedClasses` (#9297)
ematipico Mar 2, 2026
016a71d
Merge remote-tracking branch 'origin/main' into next
ematipico Mar 5, 2026
271a437
fix format and snapshots
ematipico Mar 5, 2026
f4c9edc
feat(organizeImports): add `sortBareImports` option (#9384)
Conaclos Mar 8, 2026
da32c0d
Merge branch 'main' into next
ematipico Mar 9, 2026
a814342
rebase with main
ematipico Mar 9, 2026
8574432
chore: merge main to next (#9443)
ematipico Mar 11, 2026
7b424d3
Merge remote-tracking branch 'origin/main' into next
ematipico Mar 15, 2026
8f47f06
fix codegen
ematipico Mar 15, 2026
ce65710
feat(linter): add includes option for plugin file scoping (#9171)
chocky335 Mar 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 17 additions & 0 deletions .changeset/add-no-undeclared-styles.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
"@biomejs/biome": minor
---

Added new nursery lint rule [`noUndeclaredClasses`](https://biomejs.dev/linter/rules/no-undeclared-classes/) for HTML, JSX, and SFC files (Vue, Astro, Svelte). The rule detects CSS class names used in `class="..."` (or `className`) attributes that are not defined in any `<style>` block or linked stylesheet reachable from the file.

```html
<!-- .typo is used but never defined -->
<html>
<head>
<style>.button { color: blue; }</style>
</head>
<body>
<div class="button typo"></div>
</body>
</html>
```
17 changes: 17 additions & 0 deletions .changeset/add-no-unused-styles.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
"@biomejs/biome": minor
---

Added new nursery lint rule [`noUnusedClasses`](https://biomejs.dev/linter/rules/no-unused-classes/) for CSS. The rule detects CSS class selectors that are never referenced in any HTML or JSX file that imports the stylesheet. This is a project-domain rule that requires the module graph.

```css
/* styles.css — .ghost is never used in any importing file */
.button { color: blue; }
.ghost { color: red; }
```

```jsx
/* App.jsx */
import "./styles.css";
export default () => <div className="button" />;
```
17 changes: 17 additions & 0 deletions .changeset/add-span-conversion-helper.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
"@biomejs/js-api": minor
---

Added a new `spanInBytesToSpanInCodeUnits` helper function to convert byte-based spans from Biome diagnostics to UTF-16 code unit spans.

Biome internally uses UTF-8 byte offsets for spans, but JavaScript strings use UTF-16 code units. This causes incorrect text extraction when using `string.slice()` with non-ASCII content. The new helper function correctly handles this conversion, including surrogate pairs and unpaired surrogates.

```js
import { spanInBytesToSpanInCodeUnits } from "@biomejs/js-api";

const [start, end] = spanInBytesToSpanInCodeUnits(
diagnostic.location.span,
content
);
const text = content.slice(start, end); // Correctly extracts the text
```
11 changes: 11 additions & 0 deletions .changeset/add-use-baseline-css-rule.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"@biomejs/biome": patch
---

Added new nursery lint rule `useBaseline` for CSS. The rule reports when CSS properties, property values, at-rules, media conditions, functions, or pseudo-selectors are not part of the configured [Baseline](https://developer.mozilla.org/en-US/docs/Glossary/Baseline/Compatibility) tier.

For example, *at the time of writing*, the rule will trigger for the use of `accent-color` because it has limited availability:

```css
a { accent-color: bar; }
```
17 changes: 17 additions & 0 deletions .changeset/add-use-imports-first.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
"@biomejs/biome": patch
---

Added the nursery rule [`useImportsFirst`](https://biomejs.dev/linter/rules/use-imports-first/) that enforces all import statements appear before any non-import statements in a module. Inspired by the eslint-plugin-import [`import/first`](https://github.com/import-js/eslint-plugin-import/blob/HEAD/docs/rules/first.md) rule.

```js
// Invalid
import { foo } from "foo";
const bar = 1;
import { baz } from "baz"; // ← flagged

// Valid
import { foo } from "foo";
import { baz } from "baz";
const bar = 1;
```
7 changes: 7 additions & 0 deletions .changeset/cool-rice-change.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@biomejs/biome": minor
---

Added the assist action [`organizePackageJson`](https://biomejs.dev/assist/actions/organize-package-json/).

This action organizes package.json fields according to the same conventions as the popular [sort-package-json](https://github.com/keithamus/sort-package-json) tool.
5 changes: 5 additions & 0 deletions .changeset/curly-games-follow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@biomejs/biome": patch
---

Fixed [#9432](https://github.com/biomejs/biome/issues/9432): Values referenced as a JSX element in Astro/Vue/Svelte templates are now correctly detected; `noUnusedImports` and `useImportType` rules no longer reports these values as false positives.
5 changes: 5 additions & 0 deletions .changeset/fix-css-unicode-escape-in-string.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@biomejs/biome": patch
---

Fixed [#9385](https://github.com/biomejs/biome/issues/9385): [`noUselessEscapeInString`](https://biomejs.dev/linter/rules/no-useless-escape-in-string/) no longer incorrectly flags valid CSS hex escapes (e.g. `\e7bb`) as useless. The rule now recognizes all hex digits (`0-9`, `a-f`, `A-F`) as valid escape characters in CSS strings.
5 changes: 5 additions & 0 deletions .changeset/fix-embedded-template-crash.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@biomejs/biome": patch
---

Fixed [#9131](https://github.com/biomejs/biome/issues/9131), [#9112](https://github.com/biomejs/biome/issues/9112), [#9166](https://github.com/biomejs/biome/issues/9166): the formatter no longer crashes or produces corrupt output when a JS file with `experimentalEmbeddedSnippetsEnabled` contains non-embedded template literals alongside embedded ones (e.g. `console.log(\`test\`)` next to `graphql(\`...\`)`).
5 changes: 5 additions & 0 deletions .changeset/fix-tailwind-utility-slash.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@biomejs/biome": patch
---

Fixed [#8897](https://github.com/biomejs/biome/issues/8897): Biome now parses `@utility` names containing `/` when Tailwind directives are enabled.
5 changes: 5 additions & 0 deletions .changeset/fix-use-semantic-elements-base-concepts.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@biomejs/biome": patch
---

Fixed [#9245](https://github.com/biomejs/biome/issues/9245): the [`useSemanticElements`](https://biomejs.dev/linter/rules/use-semantic-elements/) rule no longer suggests `<output>` for `role="status"` and `role="alert"`. The `<output>` element is only a `relatedConcept` of these roles, not a direct semantic equivalent. These roles are now excluded from suggestions, aligning with the intended behavior of the upstream `prefer-tag-over-role` rule.
31 changes: 31 additions & 0 deletions .changeset/flat-beers-battle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
---
"@biomejs/biome": minor
---

Added the `sortBareImports` option to [`organizeImports`](https://biomejs.dev/assist/actions/organize-imports/),
which allows bare imports to be sorted within other imports when set to `false`.

```json
{
"assist": {
"actions": {
"source": {
"organizeImports": {
"level": "on",
"options": { "sortBareImports": true }
}
}
}
}
}
```

```diff
- import "b";
import "a";
+ import "b";
import { A } from "a";
+ import "./file";
import { Local } from "./file";
- import "./file";
```
5 changes: 5 additions & 0 deletions .changeset/lovely-clouds-change.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@biomejs/biome": patch
---

Fixed [#9433](https://github.com/biomejs/biome/issues/9433): [`noBlankTarget`](https://biomejs.dev/linter/rules/no-blank-target/) now correctly handles dynamic href attributes, such as `<a href={company?.website} target="_blank">`.
14 changes: 14 additions & 0 deletions .changeset/plugin-file-scoping.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
"@biomejs/biome": minor
---

Added `includes` option for plugin file scoping. Plugins can now be configured with glob patterns to restrict which files they run on. Use negated globs for exclusions.

```json
{
"plugins": [
"global-plugin.grit",
{ "path": "scoped-plugin.grit", "includes": ["src/**/*.ts", "!**/*.test.ts"] }
]
}
```
5 changes: 5 additions & 0 deletions .changeset/resolve-record-type.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@biomejs/biome": patch
---

Fixed [#6606](https://github.com/biomejs/biome/issues/6606): The type inference engine now resolves `Record<K, V>` types, synthesizing them as object types with index signatures. This improves accuracy for type-aware lint rules such as `noFloatingPromises`, `noMisusedPromises`, `useAwaitThenable`, and `useArraySortCompare` when operating on Record-typed values.
16 changes: 16 additions & 0 deletions .claude/skills/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,22 @@ This directory contains specialized skills for AI coding assistants working on B

Skills complement the specialized **agents** in `.claude/agents/` - agents are personas that do the work, skills are the procedural knowledge they reference.

## Universal Coding Standards

**CRITICAL: No Emojis Policy**

Emojis are BANNED in all code contributions and documentation:
- NO emojis in source code
- NO emojis in comments (code comments, rustdoc, etc.)
- NO emojis in diagnostic messages
- NO emojis in test files
- NO emojis in commit messages
- NO emojis in PR descriptions
- NO emojis in skill documents or agent instructions
- NO emojis in any generated code or text

This applies to all agents, all skills, and all contributions. Keep code and documentation professional and emoji-free.

## Available Skills

### Core Development Skills
Expand Down
Loading