((props, forwardedRef) =
let animationFrame
const observer = new ResizeObserver(() => {
animationFrame = requestAnimationFrame(() => {
- const height = el.getBoundingClientRect().height
+ const height = el.offsetHeight
wrapper.style.setProperty(`--cmdk-list-height`, height.toFixed(1) + 'px')
})
})
@@ -794,6 +804,17 @@ const List = React.forwardRef
((props, forwardedRef) =
)
})
+const DialogPortal = ({ overlayClassName, contentClassName, container, label, ref, ...etc }: DialogPortalProps) => {
+ return (
+
+
+
+
+
+
+ )
+}
+
/**
* Renders the command menu in a Radix Dialog.
*/
@@ -801,16 +822,19 @@ const Dialog = React.forwardRef((props, forwardedRe
const { open, onOpenChange, overlayClassName, contentClassName, container, ...etc } = props
return (
-
-
-
-
-
-
+
)
})
+/**
+ * Renders the command menu in a Radix Dialog without the root element
+ */
+const DialogPortalWrapper = React.forwardRef((props, forwardedRef) => {
+ const { overlayClassName, contentClassName, container, ...etc } = props
+ return
+})
+
/**
* Automatically renders when there are no results for the search query.
*/
@@ -855,6 +879,7 @@ const pkg = Object.assign(Command, {
Group,
Separator,
Dialog,
+ DialogPortal: DialogPortalWrapper,
Empty,
Loading,
})
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 324b651..870b215 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -18,10 +18,8 @@ importers:
specifiers:
'@radix-ui/react-dialog': 1.0.0
'@types/react': 18.0.15
- command-score: 0.1.2
dependencies:
'@radix-ui/react-dialog': 1.0.0_@types+react@18.0.15
- command-score: 0.1.2
devDependencies:
'@types/react': 18.0.15
@@ -1440,10 +1438,6 @@ packages:
resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==}
dev: true
- /command-score/0.1.2:
- resolution: {integrity: sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==}
- dev: false
-
/commander/4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
diff --git a/test/numeric.test.ts b/test/numeric.test.ts
new file mode 100644
index 0000000..28a0a10
--- /dev/null
+++ b/test/numeric.test.ts
@@ -0,0 +1,25 @@
+import { expect, test } from '@playwright/test'
+
+test.describe('behavior for numeric values', async () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/numeric')
+ })
+
+ test('items filter correctly on numeric inputs', async ({ page }) => {
+ const input = page.locator(`[cmdk-input]`)
+ await input.type('112')
+ const removed = page.locator(`[cmdk-item][data-value="removed"]`)
+ const remains = page.locator(`[cmdk-item][data-value="foo.bar112.value"]`)
+ await expect(removed).toHaveCount(0)
+ await expect(remains).toHaveCount(1)
+ })
+
+ test('items filter correctly on non-numeric inputs', async ({ page }) => {
+ const input = page.locator(`[cmdk-input]`)
+ await input.type('bar')
+ const removed = page.locator(`[cmdk-item][data-value="removed"]`)
+ const remains = page.locator(`[cmdk-item][data-value="foo.bar112.value"]`)
+ await expect(removed).toHaveCount(0)
+ await expect(remains).toHaveCount(1)
+ })
+})
diff --git a/test/pages/numeric.tsx b/test/pages/numeric.tsx
new file mode 100644
index 0000000..e05ad7e
--- /dev/null
+++ b/test/pages/numeric.tsx
@@ -0,0 +1,22 @@
+import { Command } from 'cmdk'
+
+const Page = () => {
+ return (
+
+
+
+
+ No results.
+
+ To be removed
+
+
+ Not to be removed
+
+
+
+
+ )
+}
+
+export default Page
diff --git a/website/styles/cmdk/framer.scss b/website/styles/cmdk/framer.scss
index 687306c..639007c 100644
--- a/website/styles/cmdk/framer.scss
+++ b/website/styles/cmdk/framer.scss
@@ -63,7 +63,7 @@
transition: all 150ms ease;
transition-property: none;
- &[aria-selected='true'] {
+ &[data-selected='true'] {
background: var(--blue9);
color: #ffffff;
@@ -72,7 +72,7 @@
}
}
- &[aria-disabled='true'] {
+ &[data-disabled='true'] {
color: var(--gray8);
cursor: not-allowed;
}
diff --git a/website/styles/cmdk/linear.scss b/website/styles/cmdk/linear.scss
index 89493df..f344f87 100644
--- a/website/styles/cmdk/linear.scss
+++ b/website/styles/cmdk/linear.scss
@@ -75,7 +75,7 @@
transition-property: none;
position: relative;
- &[aria-selected='true'] {
+ &[data-selected='true'] {
background: var(--gray3);
svg {
@@ -93,7 +93,7 @@
}
}
- &[aria-disabled='true'] {
+ &[data-disabled='true'] {
color: var(--gray8);
cursor: not-allowed;
}
diff --git a/website/styles/cmdk/raycast.scss b/website/styles/cmdk/raycast.scss
index 07283f5..b69a411 100644
--- a/website/styles/cmdk/raycast.scss
+++ b/website/styles/cmdk/raycast.scss
@@ -148,12 +148,12 @@
transition: all 150ms ease;
transition-property: none;
- &[aria-selected='true'] {
+ &[data-selected='true'] {
background: var(--gray4);
color: var(--gray12);
}
- &[aria-disabled='true'] {
+ &[data-disabled='true'] {
color: var(--gray8);
cursor: not-allowed;
}
diff --git a/website/styles/cmdk/vercel.scss b/website/styles/cmdk/vercel.scss
index 9d3e55e..78baf0f 100644
--- a/website/styles/cmdk/vercel.scss
+++ b/website/styles/cmdk/vercel.scss
@@ -66,12 +66,12 @@
transition: all 150ms ease;
transition-property: none;
- &[aria-selected='true'] {
+ &[data-selected='true'] {
background: var(--grayA3);
color: var(--gray12);
}
- &[aria-disabled='true'] {
+ &[data-disabled='true'] {
color: var(--gray8);
cursor: not-allowed;
}