refactor: rename and fix styling`

This commit is contained in:
zernonia 2024-10-22 00:19:47 +02:00
parent af35560b87
commit 65f3f24547
10 changed files with 42 additions and 25 deletions

View File

@ -3,20 +3,24 @@ import type { HTMLAttributes } from 'vue'
import Sheet from '@/lib/registry/default/ui/sheet/Sheet.vue' import Sheet from '@/lib/registry/default/ui/sheet/Sheet.vue'
import SheetContent from '@/lib/registry/default/ui/sheet/SheetContent.vue' import SheetContent from '@/lib/registry/default/ui/sheet/SheetContent.vue'
import { cn } from '@/lib/utils' import { cn } from '@/lib/utils'
import { injectSidebarContext, SIDEBAR_WIDTH_MOBILE } from './utils' import { SIDEBAR_WIDTH_MOBILE, useSidebar } from './utils'
defineOptions({ defineOptions({
inheritAttrs: false, inheritAttrs: false,
}) })
const props = defineProps<{ const props = withDefaults(defineProps<{
side?: 'left' | 'right' side?: 'left' | 'right'
variant?: 'sidebar' | 'floating' | 'inset' variant?: 'sidebar' | 'floating' | 'inset'
collapsible?: 'offcanvas' | 'icon' | 'none' collapsible?: 'offcanvas' | 'icon' | 'none'
class?: HTMLAttributes['class'] class?: HTMLAttributes['class']
}>() }>(), {
side: 'left',
variant: 'sidebar',
collapsible: 'offcanvas',
})
const { isMobile, state, openMobile, setOpenMobile } = injectSidebarContext() const { isMobile, state, openMobile, setOpenMobile } = useSidebar()
</script> </script>
<template> <template>

View File

@ -8,7 +8,7 @@ const props = defineProps<{
</script> </script>
<template> <template>
<button <main
:class="cn( :class="cn(
'relative flex min-h-svh flex-1 flex-col bg-background', 'relative flex min-h-svh flex-1 flex-col bg-background',
'peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow', 'peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow',
@ -16,5 +16,5 @@ const props = defineProps<{
)" )"
> >
<slot /> <slot />
</button> </main>
</template> </template>

View File

@ -4,7 +4,7 @@ import TooltipContent from '@/lib/registry/default/ui/tooltip/TooltipContent.vue
import TooltipTrigger from '@/lib/registry/default/ui/tooltip/TooltipTrigger.vue' import TooltipTrigger from '@/lib/registry/default/ui/tooltip/TooltipTrigger.vue'
import { type Component, computed } from 'vue' import { type Component, computed } from 'vue'
import SidebarMenuButtonChild, { type SidebarMenuButtonProps } from './SidebarMenuButtonChild.vue' import SidebarMenuButtonChild, { type SidebarMenuButtonProps } from './SidebarMenuButtonChild.vue'
import { injectSidebarContext } from './utils' import { useSidebar } from './utils'
defineOptions({ defineOptions({
inheritAttrs: false, inheritAttrs: false,
@ -18,7 +18,7 @@ const props = withDefaults(defineProps<SidebarMenuButtonProps & {
size: 'default', size: 'default',
}) })
const { isMobile, state } = injectSidebarContext() const { isMobile, state } = useSidebar()
const delegatedProps = computed(() => { const delegatedProps = computed(() => {
const { tooltip, ...delegated } = props const { tooltip, ...delegated } = props
@ -27,11 +27,15 @@ const delegatedProps = computed(() => {
</script> </script>
<template> <template>
<SidebarMenuButtonChild v-if="!tooltip" v-bind="delegatedProps" /> <SidebarMenuButtonChild v-if="!tooltip" v-bind="{ ...delegatedProps, ...$attrs }">
<slot />
</SidebarMenuButtonChild>
<Tooltip v-else> <Tooltip v-else>
<TooltipTrigger as-child> <TooltipTrigger as-child>
<SidebarMenuButtonChild v-bind="delegatedProps" /> <SidebarMenuButtonChild v-bind="{ ...delegatedProps, ...$attrs }">
<slot />
</SidebarMenuButtonChild>
</TooltipTrigger> </TooltipTrigger>
<TooltipContent <TooltipContent
side="right" side="right"

View File

@ -1,11 +1,12 @@
<script setup lang="ts"> <script setup lang="ts">
import type { VariantProps } from 'class-variance-authority'
import type { HTMLAttributes } from 'vue' import type { HTMLAttributes } from 'vue'
import { cn } from '@/lib/utils' import { cn } from '@/lib/utils'
import { Primitive, type PrimitiveProps } from 'radix-vue' import { Primitive, type PrimitiveProps } from 'radix-vue'
import { sidebarMenuButtonVariants } from '.' import { type SidebarMenuButtonVariants, sidebarMenuButtonVariants } from '.'
export interface SidebarMenuButtonProps extends PrimitiveProps, VariantProps<typeof sidebarMenuButtonVariants> { export interface SidebarMenuButtonProps extends PrimitiveProps {
variant?: SidebarMenuButtonVariants['variant']
size?: SidebarMenuButtonVariants['size']
isActive?: boolean isActive?: boolean
class?: HTMLAttributes['class'] class?: HTMLAttributes['class']
} }

View File

@ -10,12 +10,15 @@ const props = withDefaults(defineProps<PrimitiveProps & {
class?: HTMLAttributes['class'] class?: HTMLAttributes['class']
}>(), { }>(), {
as: 'a', as: 'a',
size: 'md',
}) })
</script> </script>
<template> <template>
<Primitive <Primitive
data-sidebar="menu-sub-button" data-sidebar="menu-sub-button"
:as="as"
:as-child="asChild"
:data-size="size" :data-size="size"
:data-active="isActive" :data-active="isActive"
:class="cn( :class="cn(

View File

@ -2,14 +2,17 @@
import { cn } from '@/lib/utils' import { cn } from '@/lib/utils'
import { useEventListener, useVModel } from '@vueuse/core' import { useEventListener, useVModel } from '@vueuse/core'
import { TooltipProvider } from 'radix-vue' import { TooltipProvider } from 'radix-vue'
import { computed, type HTMLAttributes, ref } from 'vue' import { computed, type HTMLAttributes, type Ref, ref } from 'vue'
import { provideSidebarContext, SIDEBAR_COOKIE_MAX_AGE, SIDEBAR_COOKIE_NAME, SIDEBAR_KEYBOARD_SHORTCUT, SIDEBAR_WIDTH, SIDEBAR_WIDTH_ICON } from './utils' import { provideSidebarContext, SIDEBAR_COOKIE_MAX_AGE, SIDEBAR_COOKIE_NAME, SIDEBAR_KEYBOARD_SHORTCUT, SIDEBAR_WIDTH, SIDEBAR_WIDTH_ICON } from './utils'
const props = defineProps<{ const props = withDefaults(defineProps<{
defaultOpen?: boolean defaultOpen?: boolean
open?: boolean open?: boolean
class?: HTMLAttributes['class'] class?: HTMLAttributes['class']
}>() }>(), {
defaultOpen: true,
open: undefined,
})
const emits = defineEmits<{ const emits = defineEmits<{
'update:open': [open: boolean] 'update:open': [open: boolean]
@ -19,9 +22,9 @@ const isMobile = ref(false) // useIsMobile()
const openMobile = ref(false) const openMobile = ref(false)
const open = useVModel(props, 'open', emits, { const open = useVModel(props, 'open', emits, {
defaultValue: props.defaultOpen, defaultValue: props.defaultOpen ?? false,
passive: (props.open === undefined) as false, passive: (props.open === undefined) as false,
}) }) as Ref<boolean>
function setOpen(value: boolean) { function setOpen(value: boolean) {
open.value = value // emits('update:open', value) open.value = value // emits('update:open', value)

View File

@ -1,13 +1,13 @@
<script setup lang="ts"> <script setup lang="ts">
import type { HTMLAttributes } from 'vue' import type { HTMLAttributes } from 'vue'
import { cn } from '@/lib/utils' import { cn } from '@/lib/utils'
import { injectSidebarContext } from './utils' import { useSidebar } from './utils'
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes['class'] class?: HTMLAttributes['class']
}>() }>()
const { toggleSidebar } = injectSidebarContext() const { toggleSidebar } = useSidebar()
</script> </script>
<template> <template>

View File

@ -3,13 +3,13 @@ import type { HTMLAttributes } from 'vue'
import Button from '@/lib/registry/default/ui/button/Button.vue' import Button from '@/lib/registry/default/ui/button/Button.vue'
import { cn } from '@/lib/utils' import { cn } from '@/lib/utils'
import { PanelLeft } from 'lucide-vue-next' import { PanelLeft } from 'lucide-vue-next'
import { injectSidebarContext } from './utils' import { useSidebar } from './utils'
const props = defineProps<{ const props = defineProps<{
class?: HTMLAttributes['class'] class?: HTMLAttributes['class']
}>() }>()
const { toggleSidebar } = injectSidebarContext() const { toggleSidebar } = useSidebar()
</script> </script>
<template> <template>

View File

@ -1,4 +1,4 @@
import { cva } from 'class-variance-authority' import { cva, type VariantProps } from 'class-variance-authority'
export { default as Sidebar } from './Sidebar.vue' export { default as Sidebar } from './Sidebar.vue'
export { default as SidebarContent } from './SidebarContent.vue' export { default as SidebarContent } from './SidebarContent.vue'
@ -24,7 +24,7 @@ export { default as SidebarRail } from './SidebarRail.vue'
export { default as SidebarSeparator } from './SidebarSeparator.vue' export { default as SidebarSeparator } from './SidebarSeparator.vue'
export { default as SidebarTrigger } from './SidebarTrigger.vue' export { default as SidebarTrigger } from './SidebarTrigger.vue'
export { injectSidebarContext } from './utils' export { useSidebar } from './utils'
export const sidebarMenuButtonVariants = cva( export const sidebarMenuButtonVariants = cva(
'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0', 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',
@ -47,3 +47,5 @@ export const sidebarMenuButtonVariants = cva(
}, },
}, },
) )
export type SidebarMenuButtonVariants = VariantProps<typeof sidebarMenuButtonVariants>

View File

@ -8,7 +8,7 @@ export const SIDEBAR_WIDTH_MOBILE = '18rem'
export const SIDEBAR_WIDTH_ICON = '3rem' export const SIDEBAR_WIDTH_ICON = '3rem'
export const SIDEBAR_KEYBOARD_SHORTCUT = 'b' export const SIDEBAR_KEYBOARD_SHORTCUT = 'b'
export const [injectSidebarContext, provideSidebarContext] = createContext<{ export const [useSidebar, provideSidebarContext] = createContext<{
state: ComputedRef<'expanded' | 'collapsed'> state: ComputedRef<'expanded' | 'collapsed'>
open: Ref<boolean> open: Ref<boolean>
setOpen: (value: boolean) => void setOpen: (value: boolean) => void