diff --git a/apps/docs/.storybook/main.js b/apps/docs/.storybook/main.js
index dc2c3e52..21cd4300 100644
--- a/apps/docs/.storybook/main.js
+++ b/apps/docs/.storybook/main.js
@@ -24,6 +24,7 @@ const config = {
'@storybook/addon-designs',
'@chromatic-com/storybook',
'@storybook/addon-vitest',
+ 'storybook-addon-pseudo-states',
],
framework: {
name: '@storybook/react-vite',
diff --git a/apps/docs/.storybook/preview-head.html b/apps/docs/.storybook/preview-head.html
index 8cb4c58b..0aec40a1 100644
--- a/apps/docs/.storybook/preview-head.html
+++ b/apps/docs/.storybook/preview-head.html
@@ -1,3 +1,9 @@
+
+
diff --git a/apps/docs/package.json b/apps/docs/package.json
index 95dec48d..9d4cfab5 100644
--- a/apps/docs/package.json
+++ b/apps/docs/package.json
@@ -46,6 +46,7 @@
"remark-gfm": "^4.0.1",
"serve": "^14.2.1",
"storybook": "^10.4.6",
+ "storybook-addon-pseudo-states": "~10.4.6",
"vite": "8.2.1",
"vitest": "^4.1.11"
}
diff --git a/packages/typescript-config/vite.config.extend.ts b/packages/typescript-config/vite.config.extend.ts
index 709af170..171a5f18 100644
--- a/packages/typescript-config/vite.config.extend.ts
+++ b/packages/typescript-config/vite.config.extend.ts
@@ -28,6 +28,7 @@ export const externalPatterns = [
'@tanstack/react-virtual',
'@tanstack/react-table',
/@radix-ui\/.*$/,
+ /^@base-ui\/react(\/.*)?$/,
/^@signozhq\/.*$/,
'@chenglou/pretext',
'copy-text-to-clipboard',
diff --git a/packages/ui/package.json b/packages/ui/package.json
index dc76691e..5f79df21 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -424,6 +424,7 @@
"type-check": "tsgo --noEmit"
},
"dependencies": {
+ "@base-ui/react": "1.7.0",
"@chenglou/pretext": "^0.0.8",
"@radix-ui/react-checkbox": "^1.3.9",
"@radix-ui/react-dialog": "^1.1.21",
@@ -460,6 +461,7 @@
"@repo/typescript-config": "workspace:*",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.0.1",
+ "@testing-library/user-event": "^14.6.1",
"@types/node": "25.9.4",
"@types/react": "^18.2.61",
"@vitejs/plugin-react": "^6.1.1",
diff --git a/packages/ui/vitest.config.ts b/packages/ui/vitest.config.ts
index 65bfea5b..02ebd1cc 100644
--- a/packages/ui/vitest.config.ts
+++ b/packages/ui/vitest.config.ts
@@ -20,5 +20,10 @@ export default defineConfig({
include: ['src/**/*.test.{ts,tsx}'],
setupFiles: ['./vitest.setup.ts'],
globals: true,
+ typecheck: {
+ enabled: true,
+ include: ['src/**/*.test-d.{ts,tsx}'],
+ tsconfig: './tsconfig.json',
+ },
},
});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 907efb80..1c0e7273 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -205,6 +205,9 @@ importers:
storybook:
specifier: ^10.4.6
version: 10.4.6(@testing-library/dom@10.4.1)(@types/react@18.3.28)(react@18.3.1)
+ storybook-addon-pseudo-states:
+ specifier: ~10.4.6
+ version: 10.4.6(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@18.3.28)(react@18.3.1))
vite:
specifier: 8.2.1
version: 8.2.1(@types/node@25.6.2)(esbuild@0.25.0)(jiti@2.7.0)(sass-embedded@1.97.3)(sass@1.78.0)(yaml@2.9.0)
@@ -248,6 +251,9 @@ importers:
packages/ui:
dependencies:
+ '@base-ui/react':
+ specifier: 1.7.0
+ version: 1.7.0(@date-fns/tz@1.4.1)(@types/react@18.3.28)(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@chenglou/pretext':
specifier: ^0.0.8
version: 0.0.8
@@ -360,6 +366,9 @@ importers:
'@testing-library/react':
specifier: ^16.0.1
version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@testing-library/user-event':
+ specifier: ^14.6.1
+ version: 14.6.1(@testing-library/dom@10.4.1)
'@types/node':
specifier: 25.6.2
version: 25.6.2
@@ -480,6 +489,33 @@ packages:
resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==}
engines: {node: '>=6.9.0'}
+ '@base-ui/react@1.7.0':
+ resolution: {integrity: sha512-j+8QjX44C32jrXD/qyEAGpFr70FRpGL2CY61mQd9nBPWN737CK0xxD1ceJ055rW4RtdvFDT1e7otzdlfxvsYug==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@date-fns/tz': ^1.2.0
+ '@types/react': ^17 || ^18 || ^19
+ date-fns: ^4.0.0
+ react: ^17 || ^18 || ^19
+ react-dom: ^17 || ^18 || ^19
+ peerDependenciesMeta:
+ '@date-fns/tz':
+ optional: true
+ '@types/react':
+ optional: true
+ date-fns:
+ optional: true
+
+ '@base-ui/utils@0.3.2':
+ resolution: {integrity: sha512-oWy1aq/I2GmYjpl4PhEAhzflF8VPGKgZeq0xAWTbfD5KBWyxcN0ZP2+WHSUm/5Z6lVMBDLReLcoXwSYoRc/zNQ==}
+ peerDependencies:
+ '@types/react': ^17 || ^18 || ^19
+ react: ^17 || ^18 || ^19
+ react-dom: ^17 || ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@bcoe/v8-coverage@1.0.2':
resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==}
engines: {node: '>=18'}
@@ -4561,6 +4597,9 @@ packages:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'}
+ reselect@5.3.0:
+ resolution: {integrity: sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg==}
+
resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'}
@@ -4810,6 +4849,11 @@ packages:
std-env@4.1.0:
resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==}
+ storybook-addon-pseudo-states@10.4.6:
+ resolution: {integrity: sha512-yP6GgUTj2uju34ZLKzrFJz9uS+9Nn6uH3Wprei5x/KS6CSbLOuXf3pBhAfi+ur2y4Qm3l/thGyHYVcoACCbgIg==}
+ peerDependencies:
+ storybook: ^10.4.6
+
storybook@10.4.6:
resolution: {integrity: sha512-6wkA6LxfDSSilloITsrFOJfsnw0mDUP2h8Ls+lRt8oRsudtz2RWFhLv+Toiwg6NW7hUpdTDc2hzR7DztJid6+A==}
hasBin: true
@@ -5441,6 +5485,31 @@ snapshots:
'@babel/helper-string-parser': 7.29.7
'@babel/helper-validator-identifier': 7.29.7
+ '@base-ui/react@1.7.0(@date-fns/tz@1.4.1)(@types/react@18.3.28)(date-fns@4.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.29.7
+ '@base-ui/utils': 0.3.2(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@floating-ui/react-dom': 2.1.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@floating-ui/utils': 0.2.12
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ use-sync-external-store: 1.6.0(react@18.3.1)
+ optionalDependencies:
+ '@date-fns/tz': 1.4.1
+ '@types/react': 18.3.28
+ date-fns: 4.1.0
+
+ '@base-ui/utils@0.3.2(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.29.7
+ '@floating-ui/utils': 0.2.12
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ reselect: 5.3.0
+ use-sync-external-store: 1.6.0(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.28
+
'@bcoe/v8-coverage@1.0.2': {}
'@blazediff/core@1.9.1': {}
@@ -9344,6 +9413,8 @@ snapshots:
require-from-string@2.0.2: {}
+ reselect@5.3.0: {}
+
resolve-from@4.0.0: {}
resolve-from@5.0.0: {}
@@ -9581,6 +9652,10 @@ snapshots:
std-env@4.1.0: {}
+ storybook-addon-pseudo-states@10.4.6(storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@18.3.28)(react@18.3.1)):
+ dependencies:
+ storybook: 10.4.6(@testing-library/dom@10.4.1)(@types/react@18.3.28)(react@18.3.1)
+
storybook@10.4.6(@testing-library/dom@10.4.1)(@types/react@18.3.28)(react@18.3.1):
dependencies:
'@storybook/global': 5.0.0