Skip to content

Commit 25b2ab1

Browse files
fix(kumo): replace cn implementation with cnfast (#597)
1 parent 6232d34 commit 25b2ab1

7 files changed

Lines changed: 46 additions & 18 deletions

File tree

.changeset/fast-clouds-merge.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@cloudflare/kumo": patch
3+
---
4+
5+
Replace the internal class merging implementation with cnfast.

packages/kumo/package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -472,11 +472,10 @@
472472
"@base-ui/react": "^1.6.0",
473473
"@shikijs/langs": "^4.0.0",
474474
"@shikijs/themes": "^4.0.0",
475-
"clsx": "^2.1.1",
475+
"cnfast": "^0.0.8",
476476
"motion": "^12.34.1",
477477
"react-day-picker": "^9.13.2",
478-
"shiki": "^4.0.0",
479-
"tailwind-merge": "^3.4.0"
478+
"shiki": "^4.0.0"
480479
},
481480
"devDependencies": {
482481
"@tailwindcss/cli": "catalog:",

packages/kumo/src/components/tooltip/tooltip.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ export function Tooltip({
169169
className={cn(
170170
// Defensive resets when rendering as button wrapper (not render/asChild)
171171
// These prevent global button styles from polluting the trigger
172-
// Consumer styles passed via className will override these (tailwind-merge)
172+
// Consumer styles passed via className will override these.
173173
!shouldUseRender &&
174174
"inline-flex items-center bg-transparent border-none shadow-none p-0 m-0 h-auto min-h-0 leading-[0]",
175175
// Tooltip triggers are disclosure elements, not actions — override

packages/kumo/src/utils/cn.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { describe, expect, it } from "vitest";
2+
3+
import { cn } from "./cn";
4+
5+
describe("cn", () => {
6+
it.each([
7+
[["p-2", "p-4"], "p-4"],
8+
[["px-2 py-1", "px-4"], "py-1 px-4"],
9+
[["text-kumo-default", "text-kumo-subtle"], "text-kumo-subtle"],
10+
[["bg-kumo-base", "bg-kumo-elevated"], "bg-kumo-elevated"],
11+
[["border-kumo-line", "border-kumo-strong"], "border-kumo-strong"],
12+
[["hover:bg-kumo-base", "hover:bg-kumo-elevated"], "hover:bg-kumo-elevated"],
13+
[["sm:p-2", "sm:p-4", "md:p-6"], "sm:p-4 md:p-6"],
14+
[
15+
["data-[state=open]:bg-kumo-base", "data-[state=open]:bg-kumo-elevated"],
16+
"data-[state=open]:bg-kumo-elevated",
17+
],
18+
[["rounded-[10px]", "rounded-[12px]"], "rounded-[12px]"],
19+
[["!p-2", "p-4"], "!p-2 p-4"],
20+
[["p-2", "!p-4"], "p-2 !p-4"],
21+
[["base", false, null, undefined, { active: true, disabled: false }], "base active"],
22+
[[["flex", ["gap-2", "gap-4"]]], "flex gap-4"],
23+
])("merges classes without changing expected output for case %#", (inputs, expected) => {
24+
expect(cn(...inputs)).toBe(expected);
25+
});
26+
});

packages/kumo/src/utils/cn.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
import { clsx, type ClassValue } from "clsx";
2-
import { twMerge } from "tailwind-merge";
3-
4-
export function cn(...inputs: ClassValue[]) {
5-
return twMerge(clsx(inputs));
6-
}
1+
export { cn } from "cnfast";
72

83
const toHex = (n: number) => n.toString(16).padStart(2, "0");
94

packages/kumo/vite.config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,8 @@ export default defineConfig(({ mode }) => {
301301
manualChunks: (id) => {
302302
// Vendor chunks for large dependencies
303303
if (id.includes("node_modules")) {
304-
// clsx + tailwind-merge utilities
305-
if (id.includes("clsx") || id.includes("tailwind-merge")) {
304+
// Class merging utilities
305+
if (id.includes("cnfast")) {
306306
return "vendor-styling";
307307
}
308308
// Floating UI positioning libraries

pnpm-lock.yaml

Lines changed: 9 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)