diff --git a/playground/app/pages/context-menu.vue b/playground/app/pages/context-menu.vue
index de240517..1e9be18f 100644
--- a/playground/app/pages/context-menu.vue
+++ b/playground/app/pages/context-menu.vue
@@ -1,5 +1,13 @@
-
-
- Right click here
-
-
+
+
+
+
+ Right click here
+
+
+
diff --git a/src/runtime/components/ContextMenu.vue b/src/runtime/components/ContextMenu.vue
index 50b49dd4..935f9385 100644
--- a/src/runtime/components/ContextMenu.vue
+++ b/src/runtime/components/ContextMenu.vue
@@ -1,5 +1,5 @@
diff --git a/src/runtime/components/ContextMenuContent.vue b/src/runtime/components/ContextMenuContent.vue
index 506a8d25..983edc50 100644
--- a/src/runtime/components/ContextMenuContent.vue
+++ b/src/runtime/components/ContextMenuContent.vue
@@ -2,7 +2,7 @@
import { tv } from 'tailwind-variants'
import type { ContextMenuContentProps as RadixContextMenuContentProps, ContextMenuContentEmits as RadixContextMenuContentEmits } from 'radix-vue'
import theme from '#build/ui/context-menu'
-import type { ContextMenuItem, ContextMenuSlots } from '../types'
+import type { KbdProps, AvatarProps, ContextMenuItem, ContextMenuSlots } from '../types'
const contextMenu = tv(theme)()
@@ -44,7 +44,7 @@ const groups = computed(() => props.items?.length ? (Array.isArray(props.items[0
-
+
@@ -60,7 +60,7 @@ const groups = computed(() => props.items?.length ? (Array.isArray(props.items[0
-
+
diff --git a/src/theme/context-menu.ts b/src/theme/context-menu.ts
index 2b4cb405..e6c4f3b2 100644
--- a/src/theme/context-menu.ts
+++ b/src/theme/context-menu.ts
@@ -4,14 +4,16 @@ export default (options: Required) => ({
slots: {
content: 'min-w-32 bg-white dark:bg-gray-900 shadow-lg rounded-md ring ring-gray-200 dark:ring-gray-800 divide-y divide-gray-200 dark:divide-gray-800 overflow-y-auto scroll-py-1 data-[state=open]:animate-[scale-in_100ms_ease-out] data-[state=closed]:animate-[scale-out_100ms_ease-in]',
group: 'p-1 isolate',
- label: 'w-full flex items-center gap-1.5 p-1.5 text-sm font-semibold text-gray-900 dark:text-white',
+ label: 'w-full flex items-center font-semibold text-gray-900 dark:text-white',
separator: '-mx-1 my-1 h-px bg-gray-200 dark:bg-gray-800',
- item: 'group relative w-full flex items-center gap-1.5 p-1.5 text-sm select-none outline-none before:absolute before:z-[-1] before:inset-px before:rounded-md data-disabled:cursor-not-allowed data-disabled:opacity-75',
- itemLeadingIcon: 'shrink-0 size-5',
+ item: 'group relative w-full flex items-center select-none outline-none before:absolute before:z-[-1] before:inset-px before:rounded-md data-disabled:cursor-not-allowed data-disabled:opacity-75',
+ itemLeadingIcon: 'shrink-0',
itemLeadingAvatar: 'shrink-0',
+ itemLeadingAvatarSize: '',
itemTrailing: 'ms-auto inline-flex',
- itemTrailingIcon: 'shrink-0 size-5',
- itemTrailingKbds: 'hidden lg:inline-flex items-center shrink-0 gap-0.5',
+ itemTrailingIcon: 'shrink-0',
+ itemTrailingKbds: 'hidden lg:inline-flex items-center shrink-0',
+ itemTrailingKbdsSize: '',
itemLabel: 'truncate',
itemLabelExternalIcon: 'size-3 align-top text-gray-400 dark:text-gray-500'
},
@@ -25,6 +27,56 @@ export default (options: Required) => ({
item: ['text-gray-700 dark:text-gray-200 data-highlighted:text-gray-900 dark:data-highlighted:text-white data-[state=open]:text-gray-900 dark:data-[state=open]:text-white data-highlighted:before:bg-gray-50 dark:data-highlighted:before:bg-gray-800/50 data-[state=open]:before:bg-gray-50 dark:data-[state=open]:before:bg-gray-800/50', options.transitions && 'transition-colors before:transition-colors'],
itemLeadingIcon: ['text-gray-400 dark:text-gray-500 group-data-highlighted:text-gray-700 dark:group-data-highlighted:text-gray-200 group-data-[state=open]:text-gray-700 dark:group-data-[state=open]:text-gray-200', options.transitions && 'transition-colors']
}
+ },
+ size: {
+ xs: {
+ label: 'gap-1 p-1 text-xs',
+ item: 'gap-1 p-1 text-xs',
+ itemLeadingIcon: 'size-4',
+ itemLeadingAvatarSize: '3xs',
+ itemTrailingIcon: 'size-4',
+ itemTrailingKbds: 'gap-0.5',
+ itemTrailingKbdsSize: 'sm'
+ },
+ sm: {
+ label: 'gap-1.5 p-1.5 text-xs',
+ item: 'gap-1.5 p-1.5 text-xs',
+ itemLeadingIcon: 'size-4',
+ itemLeadingAvatarSize: '3xs',
+ itemTrailingIcon: 'size-4',
+ itemTrailingKbds: 'gap-0.5',
+ itemTrailingKbdsSize: 'sm'
+ },
+ md: {
+ label: 'gap-1.5 p-1.5 text-sm',
+ item: 'gap-1.5 p-1.5 text-sm',
+ itemLeadingIcon: 'size-5',
+ itemLeadingAvatarSize: '2xs',
+ itemTrailingIcon: 'size-5',
+ itemTrailingKbds: 'gap-0.5',
+ itemTrailingKbdsSize: 'md'
+ },
+ lg: {
+ label: 'gap-2 p-2 text-sm',
+ item: 'gap-2 p-2 text-sm',
+ itemLeadingIcon: 'size-5',
+ itemLeadingAvatarSize: '2xs',
+ itemTrailingIcon: 'size-5',
+ itemTrailingKbds: 'gap-1',
+ itemTrailingKbdsSize: 'md'
+ },
+ xl: {
+ label: 'gap-2 p-2 text-base',
+ item: 'gap-2 p-2 text-base',
+ itemLeadingIcon: 'size-6',
+ itemLeadingAvatarSize: 'xs',
+ itemTrailingIcon: 'size-6',
+ itemTrailingKbds: 'gap-1',
+ itemTrailingKbdsSize: 'lg'
+ }
}
+ },
+ defaultVariants: {
+ size: 'md'
}
})
diff --git a/test/components/ContextMenu.spec.ts b/test/components/ContextMenu.spec.ts
index 4ba81ee2..73648411 100644
--- a/test/components/ContextMenu.spec.ts
+++ b/test/components/ContextMenu.spec.ts
@@ -1,9 +1,12 @@
import { describe, it, expect } from 'vitest'
import ContextMenu, { type ContextMenuProps, type ContextMenuSlots } from '../../src/runtime/components/ContextMenu.vue'
import ComponentRender from '../component-render'
+import theme from '#build/ui/context-menu'
// FIXME: Can't force open state
describe('ContextMenu', () => {
+ const sizes = Object.keys(theme.variants.size as any)
+
const items = [
[{
label: 'Appearance',
@@ -78,6 +81,7 @@ describe('ContextMenu', () => {
// Props
['with items', { props }],
['with disabled', { props: { ...props, disabled: true } }],
+ ...sizes.map((size: string) => [`with size ${size}`, { props: { ...props, size } }]),
['with class', { props: { ...props, class: 'min-w-96' } }],
['with ui', { props: { ...props, ui: { itemLeadingIcon: 'size-4' } } }],
// Slots
diff --git a/test/components/__snapshots__/ContextMenu.spec.ts.snap b/test/components/__snapshots__/ContextMenu.spec.ts.snap
index e7117188..99aebe51 100644
--- a/test/components/__snapshots__/ContextMenu.spec.ts.snap
+++ b/test/components/__snapshots__/ContextMenu.spec.ts.snap
@@ -114,6 +114,71 @@ exports[`ContextMenu > renders with items correctly 1`] = `
+"
+`;
+
+exports[`ContextMenu > renders with size lg correctly 1`] = `
+"
+
+
+
+
+
+
+
+
+"
+`;
+
+exports[`ContextMenu > renders with size md correctly 1`] = `
+"
+
+
+
+
+
+
+
+
+"
+`;
+
+exports[`ContextMenu > renders with size sm correctly 1`] = `
+"
+
+
+
+
+
+
+
+
+"
+`;
+
+exports[`ContextMenu > renders with size xl correctly 1`] = `
+"
+
+
+
+
+
+
+
+
+"
+`;
+
+exports[`ContextMenu > renders with size xs correctly 1`] = `
+"
+
+
+
+
+
+
+
+
"
`;