@devalok/shilp-sutra 0.55.1 → 0.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BREAKING.json +13 -0
- package/MIGRATION.md +56 -0
- package/README.md +16 -1
- package/dist/_chunks/badge-group.js +45 -45
- package/dist/_chunks/emoji-suggestion.js +32 -30
- package/dist/_chunks/emoji-suggestion.js.map +1 -1
- package/dist/_chunks/mention-suggestion.js +35 -34
- package/dist/_chunks/mention-suggestion.js.map +1 -1
- package/dist/_chunks/primitives-internal.js +437 -537
- package/dist/_chunks/primitives-internal.js.map +1 -1
- package/dist/composed/content-card.js +18 -18
- package/dist/composed/extensions/emoji-node.js +8 -7
- package/dist/composed/extensions/emoji-node.js.map +1 -1
- package/dist/composed/rich-chat-input.js +535 -526
- package/dist/composed/rich-chat-input.js.map +1 -1
- package/dist/composed/rich-text-editor.js +201 -193
- package/dist/composed/rich-text-editor.js.map +1 -1
- package/dist/ui/alert.js +29 -29
- package/dist/ui/avatar.js +42 -42
- package/dist/ui/banner.js +25 -25
- package/dist/ui/button.js +31 -31
- package/dist/ui/button.js.map +1 -1
- package/dist/ui/card.js +39 -39
- package/dist/ui/combobox.js +135 -135
- package/dist/ui/combobox.js.map +1 -1
- package/dist/ui/dot.js +13 -13
- package/dist/ui/input.js +25 -25
- package/dist/ui/lib/utils.js +2 -1
- package/dist/ui/lib/utils.js.map +1 -1
- package/dist/ui/number-input.js +36 -36
- package/dist/ui/progress.js +55 -55
- package/dist/ui/select.js +58 -58
- package/dist/ui/sheet.js +46 -46
- package/dist/ui/sidebar.js +128 -128
- package/dist/ui/sidebar.js.map +1 -1
- package/dist/ui/skeleton.js +39 -39
- package/dist/ui/slider.js +18 -18
- package/dist/ui/surface.js +9 -9
- package/dist/ui/tabs.js +47 -47
- package/dist/ui/text.js +8 -8
- package/dist/ui/textarea.js +12 -12
- package/dist/ui/toggle.js +12 -12
- package/docs/recipes/install-astro.md +2 -2
- package/docs/recipes/install-next-app-router.md +2 -2
- package/docs/recipes/install-remix.md +2 -2
- package/docs/recipes/install-tanstack-start.md +2 -2
- package/docs/recipes/install-vite.md +2 -2
- package/docs/recipes/troubleshoot.md +26 -5
- package/llms.txt +1 -1
- package/mcp-manifest.json +24 -3
- package/package.json +38 -11
- package/skill/SKILL.md +1 -1
- package/skill/references/components.md +1 -1
- package/skill/references/setup-astro.md +2 -2
- package/skill/references/setup-next-app-router.md +2 -2
- package/skill/references/setup-remix.md +2 -2
- package/skill/references/setup-tanstack-start.md +2 -2
- package/skill/references/setup-vite.md +2 -2
- package/skill/references/troubleshoot.md +26 -5
- package/dist/_chunks/tiptap.js +0 -18809
- package/dist/_chunks/tiptap.js.map +0 -1
- package/dist/_chunks/vendor-utils.js +0 -1766
- package/dist/_chunks/vendor-utils.js.map +0 -1
- package/scripts/welcome.mjs +0 -312
package/dist/ui/sidebar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar.js","names":[],"sources":["../../src/ui/sidebar.tsx"],"sourcesContent":["'use client'\n\nimport { Slot } from '@primitives/react-slot'\nimport { IconLayoutSidebarLeftCollapse } from '@tabler/icons-react'\nimport { cva,VariantProps } from 'class-variance-authority'\nimport { motion, useReducedMotion } from 'framer-motion'\nimport {\n ComponentProps,\n createContext,\n CSSProperties,\n ElementRef,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { useIsMobile } from '../hooks/use-mobile'\nimport { Button } from './button'\nimport { Icon } from './icon'\nimport { Input } from './input'\nimport { springs } from './lib/motion'\nimport { cn } from './lib/utils'\nimport { Separator } from './separator'\nimport { Sheet, SheetContent } from './sheet'\nimport { Skeleton } from './skeleton'\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from './tooltip'\n\nconst SIDEBAR_COOKIE_NAME = 'sidebar:state'\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = '16rem'\nconst SIDEBAR_WIDTH_MOBILE = '18rem'\nconst SIDEBAR_WIDTH_ICON = '3rem'\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b'\n\ntype SidebarContext = {\n state: 'expanded' | 'collapsed'\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = createContext<SidebarContext | null>(null)\n\nfunction useSidebar() {\n const context = useContext(SidebarContext)\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.')\n }\n\n return context\n}\n\nconst SidebarProvider = forwardRef<\n HTMLDivElement,\n ComponentProps<'div'> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n }\n>(\n (\n {\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n },\n ref,\n ) => {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = useState(false)\n const [_open, _setOpen] = useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n if (typeof document !== 'undefined') {\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n }\n },\n [setOpenProp, open],\n )\n\n const toggleSidebar = useCallback(() => {\n return isMobile\n ? setOpenMobile((open) => !open)\n : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [toggleSidebar])\n const state = open ? 'expanded' : 'collapsed'\n\n const contextValue = useMemo<SidebarContext>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n ],\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as CSSProperties\n }\n className={cn(\n 'group/sidebar-wrapper flex min-h-svh has-[[data-variant=inset]]:bg-surface-sunken',\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n )\n },\n)\nSidebarProvider.displayName = 'SidebarProvider'\n\n// ── SidebarSwipeWrapper (swipe-to-close on mobile) ─────────────────\n\n// TODO: edge-swipe-to-open (swipe from left edge to open sidebar)\n\nfunction SidebarSwipeWrapper({\n side,\n onClose,\n children,\n}: {\n side: 'left' | 'right'\n onClose: () => void\n children: React.ReactNode\n}) {\n const isReduced = useReducedMotion()\n const panelRef = useRef<HTMLDivElement>(null)\n\n // For a left sidebar, user swipes left (negative x) to close.\n // For a right sidebar, user swipes right (positive x) to close.\n const dragAxis = 'x' as const\n const dragConstraints = side === 'left' ? { right: 0 } : { left: 0 }\n\n return (\n <motion.div\n ref={panelRef}\n className=\"h-full w-full\"\n drag={!isReduced ? dragAxis : false}\n dragConstraints={dragConstraints}\n dragElastic={0.2}\n onDragEnd={(\n _: unknown,\n info: { offset: { x: number }; velocity: { x: number } },\n ) => {\n const w = panelRef.current?.getBoundingClientRect().width ?? 280\n if (side === 'left') {\n // Swipe left to close: negative offset\n if (info.offset.x < -(w * 0.3) || info.velocity.x < -500) {\n onClose()\n }\n } else {\n // Swipe right to close: positive offset\n if (info.offset.x > w * 0.3 || info.velocity.x > 500) {\n onClose()\n }\n }\n }}\n >\n {children}\n </motion.div>\n )\n}\n\nconst Sidebar = forwardRef<\n HTMLDivElement,\n ComponentProps<'div'> & {\n side?: 'left' | 'right'\n variant?: 'sidebar' | 'floating' | 'inset'\n collapsible?: 'offcanvas' | 'icon' | 'none'\n }\n>(\n (\n {\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === 'none') {\n return (\n <aside\n aria-label=\"Sidebar\"\n className={cn(\n 'flex h-full w-(--sidebar-width) flex-col bg-surface-chrome text-surface-fg',\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n </aside>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-surface-chrome p-0 text-surface-fg [&>button]:hidden\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n } as CSSProperties\n }\n side={side}\n responsive={false}\n >\n <SidebarSwipeWrapper side={side} onClose={() => setOpenMobile(false)}>\n <aside aria-label=\"Sidebar\" className=\"flex h-full w-full flex-col\">{children}</aside>\n </SidebarSwipeWrapper>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n ref={ref}\n className=\"group peer hidden text-surface-fg md:block\"\n data-state={state}\n data-collapsible={state === 'collapsed' ? collapsible : ''}\n data-variant={variant}\n data-side={side}\n >\n <div\n className={cn(\n 'relative h-svh w-(--sidebar-width) bg-transparent transition-[width] duration-moderate-02 ease-productive-exit',\n 'group-data-[collapsible=offcanvas]:w-0',\n 'group-data-[side=right]:rotate-180',\n variant === 'floating' || variant === 'inset'\n ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_1rem)]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)',\n )}\n />\n <div\n className={cn(\n 'fixed inset-y-0 z-raised hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-moderate-02 ease-productive-exit md:flex',\n side === 'left'\n ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'\n : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',\n variant === 'floating' || variant === 'inset'\n ? 'p-ds-03 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_1rem_+2px)]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',\n className,\n )}\n {...props}\n >\n <aside\n aria-label=\"Sidebar\"\n data-sidebar=\"sidebar\"\n className=\"flex h-full w-full flex-col bg-surface-chrome group-data-[variant=floating]:rounded-surface group-data-[variant=floating]:shadow-raised\"\n >\n {children}\n </aside>\n </div>\n </div>\n )\n },\n)\nSidebar.displayName = 'Sidebar'\n\nconst SidebarTrigger = forwardRef<\n ElementRef<typeof Button>,\n ComponentProps<typeof Button>\n>(({ className, onClick, ...props }, ref) => {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n ref={ref}\n data-sidebar=\"trigger\"\n variant=\"ghost\"\n size=\"icon-md\"\n className={cn('h-ds-xs-plus w-ds-xs-plus', className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <Icon icon={IconLayoutSidebarLeftCollapse} size=\"sm\" />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n})\nSidebarTrigger.displayName = 'SidebarTrigger'\n\nconst SidebarRail = forwardRef<HTMLButtonElement, ComponentProps<'button'>>(\n ({ className, ...props }, ref) => {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n ref={ref}\n data-sidebar=\"rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'hover:after:bg-surface-border-strong absolute inset-y-0 z-raised hidden w-4 -translate-x-1/2 transition-colors ease-productive-standard after:absolute after:inset-y-0 after:left-1/2 after:w-ds-01 group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex',\n '[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize',\n '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\n 'group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-surface-raised-hover',\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n className,\n )}\n {...props}\n />\n )\n },\n)\nSidebarRail.displayName = 'SidebarRail'\n\nconst SidebarInset = forwardRef<HTMLDivElement, ComponentProps<'main'>>(\n ({ className, ...props }, ref) => {\n return (\n <main\n ref={ref}\n className={cn(\n 'relative flex min-h-svh flex-1 flex-col bg-surface-base',\n 'peer-data-[variant=inset]:min-h-[calc(100svh-1rem)] md:peer-data-[variant=inset]:m-ds-03 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-ds-03 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-overlay-lg md:peer-data-[variant=inset]:shadow-raised',\n className,\n )}\n {...props}\n />\n )\n },\n)\nSidebarInset.displayName = 'SidebarInset'\n\nconst SidebarInput = forwardRef<\n ElementRef<typeof Input>,\n ComponentProps<typeof Input>\n>(({ className, wrapperClassName, ...props }, ref) => {\n return (\n <Input\n ref={ref}\n data-sidebar=\"input\"\n size=\"sm\"\n wrapperClassName={cn(\n 'bg-surface-raised shadow-none focus-within:ring-2 focus-within:ring-accent-9',\n wrapperClassName,\n )}\n className={cn('w-full', className)}\n {...props}\n />\n )\n})\nSidebarInput.displayName = 'SidebarInput'\n\nconst SidebarHeader = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"header\"\n className={cn('flex flex-col gap-ds-03 p-ds-03', className)}\n {...props}\n />\n )\n },\n)\nSidebarHeader.displayName = 'SidebarHeader'\n\nconst SidebarFooter = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"footer\"\n className={cn('flex flex-col gap-ds-03 p-ds-03', className)}\n {...props}\n />\n )\n },\n)\nSidebarFooter.displayName = 'SidebarFooter'\n\nconst SidebarSeparator = forwardRef<\n ElementRef<typeof Separator>,\n ComponentProps<typeof Separator>\n>(({ className, ...props }, ref) => {\n return (\n <Separator\n ref={ref}\n data-sidebar=\"separator\"\n className={cn(\n 'bg-surface-border mx-ds-03 w-auto',\n className,\n )}\n {...props}\n />\n )\n})\nSidebarSeparator.displayName = 'SidebarSeparator'\n\nconst SidebarContent = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"content\"\n className={cn(\n 'flex min-h-0 flex-1 flex-col gap-ds-03 overflow-auto group-data-[collapsible=icon]:overflow-hidden',\n className,\n )}\n {...props}\n />\n )\n },\n)\nSidebarContent.displayName = 'SidebarContent'\n\nconst SidebarGroup = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"group\"\n className={cn('relative flex w-full min-w-0 flex-col p-ds-03', className)}\n {...props}\n />\n )\n },\n)\nSidebarGroup.displayName = 'SidebarGroup'\n\nconst SidebarGroupLabel = forwardRef<\n HTMLDivElement,\n ComponentProps<'div'> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'div'\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-label\"\n className={cn(\n 'flex h-ds-sm shrink-0 items-center rounded-control px-ds-03 text-body-sm font-medium text-surface-fg-muted outline-hidden ring-accent-9 transition-[margin,opacity] duration-moderate-02 ease-productive-exit focus-visible:ring-2 [&>svg]:h-ico-sm [&>svg]:w-ico-sm [&>svg]:shrink-0',\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\n className,\n )}\n {...props}\n />\n )\n})\nSidebarGroupLabel.displayName = 'SidebarGroupLabel'\n\nconst SidebarGroupAction = forwardRef<\n HTMLButtonElement,\n ComponentProps<'button'> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-action\"\n className={cn(\n 'hover:bg-surface-raised-hover absolute right-ds-04 top-ds-04 flex aspect-square w-5 items-center justify-center rounded-control p-0 text-surface-fg outline-hidden ring-accent-9 transition-transform hover:text-surface-fg focus-visible:ring-2 [&>svg]:h-ico-sm [&>svg]:w-ico-sm [&>svg]:shrink-0',\n 'after:absolute after:-inset-2 after:md:hidden',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n )\n})\nSidebarGroupAction.displayName = 'SidebarGroupAction'\n\nconst SidebarGroupContent = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-sidebar=\"group-content\"\n className={cn('w-full text-body-md', className)}\n {...props}\n />\n ),\n)\nSidebarGroupContent.displayName = 'SidebarGroupContent'\n\nconst SidebarMenu = forwardRef<HTMLUListElement, ComponentProps<'ul'>>(\n ({ className, ...props }, ref) => (\n <ul\n ref={ref}\n data-sidebar=\"menu\"\n className={cn('flex w-full min-w-0 flex-col gap-ds-02', className)}\n {...props}\n />\n ),\n)\nSidebarMenu.displayName = 'SidebarMenu'\n\nconst SidebarMenuItem = forwardRef<HTMLLIElement, ComponentProps<'li'>>(\n ({ className, ...props }, ref) => (\n <li\n ref={ref}\n data-sidebar=\"menu-item\"\n className={cn('group/menu-item relative', className)}\n {...props}\n />\n ),\n)\nSidebarMenuItem.displayName = 'SidebarMenuItem'\n\nconst sidebarMenuButtonVariants = cva(\n 'peer/menu-button hover:bg-surface-raised-hover active:bg-accent-2 data-[active=true]:bg-accent-2 data-[state=open]:hover:bg-surface-raised-hover flex w-full items-center gap-ds-03 overflow-hidden rounded-control p-ds-03 text-left outline-hidden ring-accent-9 transition-[width,height,padding] hover:text-surface-fg focus-visible:ring-2 active:text-surface-fg disabled:pointer-events-none disabled:opacity-action-disabled group-has-[[data-sidebar=menu-action]]/menu-item:pr-ds-07 aria-disabled:pointer-events-none aria-disabled:opacity-action-disabled data-[active=true]:font-medium data-[active=true]:text-surface-fg data-[state=open]:hover:text-surface-fg group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-ds-03! [&>span:last-child]:truncate [&>svg]:h-ico-sm [&>svg]:w-ico-sm [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n default:\n 'hover:bg-surface-raised-hover hover:text-surface-fg',\n outline:\n 'hover:bg-surface-raised-hover bg-surface-raised shadow-[0_0_0_1px_var(--color-surface-border)] hover:text-surface-fg hover:shadow-[0_0_0_1px_var(--color-surface-border-strong)]',\n },\n size: {\n md: 'h-ds-sm text-body-md',\n sm: 'h-ds-xs-plus text-body-sm',\n lg: 'h-ds-lg text-body-md group-data-[collapsible=icon]:p-0!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n },\n },\n)\n\nconst SidebarMenuButton = forwardRef<\n HTMLButtonElement,\n ComponentProps<'button'> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | ComponentProps<typeof TooltipContent>\n } & VariantProps<typeof sidebarMenuButtonVariants>\n>(\n (\n {\n asChild = false,\n isActive = false,\n variant = 'default',\n size = 'md',\n tooltip,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : 'button'\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n ref={ref}\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), !asChild && 'relative', className)}\n {...props}\n >\n {asChild ? children : (\n <>\n {isActive && (\n <motion.span\n layoutId=\"sidebar-active-indicator\"\n className=\"absolute inset-0 rounded-control bg-accent-2\"\n transition={springs.smooth}\n />\n )}\n <span className=\"relative z-[1] flex w-full items-center gap-[inherit]\">{children}</span>\n </>\n )}\n </Comp>\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === 'string') {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== 'collapsed' || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n },\n)\nSidebarMenuButton.displayName = 'SidebarMenuButton'\n\nconst SidebarMenuAction = forwardRef<\n HTMLButtonElement,\n ComponentProps<'button'> & {\n asChild?: boolean\n showOnHover?: boolean\n }\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-action\"\n className={cn(\n 'hover:bg-surface-raised-hover absolute right-ds-02 top-ds-02b flex aspect-square w-5 items-center justify-center rounded-control p-0 text-surface-fg outline-hidden ring-accent-9 transition-transform hover:text-surface-fg focus-visible:ring-2 peer-hover/menu-button:text-surface-fg [&>svg]:h-ico-sm [&>svg]:w-ico-sm [&>svg]:shrink-0',\n 'after:absolute after:-inset-2 after:md:hidden',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=md]/menu-button:top-ds-02b',\n 'peer-data-[size=lg]/menu-button:top-ds-03',\n 'group-data-[collapsible=icon]:hidden',\n showOnHover &&\n 'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-surface-fg md:opacity-0',\n className,\n )}\n {...props}\n />\n )\n})\nSidebarMenuAction.displayName = 'SidebarMenuAction'\n\nconst SidebarMenuBadge = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-sidebar=\"menu-badge\"\n className={cn(\n 'pointer-events-none absolute right-ds-02 flex h-5 min-w-5 select-none items-center justify-center rounded-control px-ds-02 text-body-sm font-medium tabular-nums text-surface-fg',\n 'peer-hover/menu-button:text-surface-fg peer-data-[active=true]/menu-button:text-surface-fg',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=md]/menu-button:top-ds-02b',\n 'peer-data-[size=lg]/menu-button:top-ds-03',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n ),\n)\nSidebarMenuBadge.displayName = 'SidebarMenuBadge'\n\nconst SidebarMenuSkeleton = forwardRef<\n HTMLDivElement,\n ComponentProps<'div'> & {\n showIcon?: boolean\n }\n>(({ className, showIcon = false, ...props }, ref) => {\n const width = useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n }, [])\n\n return (\n <div\n ref={ref}\n data-sidebar=\"menu-skeleton\"\n className={cn('flex h-ds-sm items-center gap-ds-03 rounded-control px-ds-03', className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"h-ico-sm w-ico-sm rounded-control\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n '--skeleton-width': width,\n } as CSSProperties\n }\n />\n </div>\n )\n})\nSidebarMenuSkeleton.displayName = 'SidebarMenuSkeleton'\n\nconst SidebarMenuSub = forwardRef<HTMLUListElement, ComponentProps<'ul'>>(\n ({ className, ...props }, ref) => (\n <ul\n ref={ref}\n data-sidebar=\"menu-sub\"\n className={cn(\n 'mx-ds-04 flex min-w-0 translate-x-px flex-col gap-ds-02 border-l border-surface-border px-ds-03 py-ds-01',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n ),\n)\nSidebarMenuSub.displayName = 'SidebarMenuSub'\n\nconst SidebarMenuSubItem = forwardRef<HTMLLIElement, ComponentProps<'li'>>(\n ({ ...props }, ref) => <li ref={ref} {...props} />,\n)\nSidebarMenuSubItem.displayName = 'SidebarMenuSubItem'\n\nconst SidebarMenuSubButton = forwardRef<\n HTMLAnchorElement,\n ComponentProps<'a'> & {\n asChild?: boolean\n size?: 'sm' | 'md'\n isActive?: boolean\n }\n>(({ asChild = false, size = 'md', isActive, className, ...props }, ref) => {\n const Comp = asChild ? Slot : 'a'\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n 'hover:bg-surface-raised-hover active:bg-accent-2 flex h-ds-xs-plus min-w-0 -translate-x-px items-center gap-ds-03 overflow-hidden rounded-control px-ds-03 text-surface-fg outline-hidden ring-accent-9 hover:text-surface-fg focus-visible:ring-2 active:text-surface-fg disabled:pointer-events-none disabled:opacity-action-disabled aria-disabled:pointer-events-none aria-disabled:opacity-action-disabled [&>span:last-child]:truncate [&>svg]:h-ico-sm [&>svg]:w-ico-sm [&>svg]:shrink-0 [&>svg]:text-surface-fg',\n 'data-[active=true]:bg-accent-2 data-[active=true]:text-surface-fg',\n size === 'sm' && 'text-body-sm',\n size === 'md' && 'text-body-md',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n )\n})\nSidebarMenuSubButton.displayName = 'SidebarMenuSubButton'\n\nexport type SidebarProps = React.ComponentPropsWithoutRef<'div'> & { side?: 'left' | 'right'; variant?: 'sidebar' | 'floating' | 'inset'; collapsible?: 'offcanvas' | 'icon' | 'none' }\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sidebar.js","names":[],"sources":["../../src/ui/sidebar.tsx"],"sourcesContent":["'use client'\n\nimport { Slot } from '@primitives/react-slot'\nimport { IconLayoutSidebarLeftCollapse } from '@tabler/icons-react'\nimport { cva,VariantProps } from 'class-variance-authority'\nimport { motion, useReducedMotion } from 'framer-motion'\nimport {\n ComponentProps,\n createContext,\n CSSProperties,\n ElementRef,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { useIsMobile } from '../hooks/use-mobile'\nimport { Button } from './button'\nimport { Icon } from './icon'\nimport { Input } from './input'\nimport { springs } from './lib/motion'\nimport { cn } from './lib/utils'\nimport { Separator } from './separator'\nimport { Sheet, SheetContent } from './sheet'\nimport { Skeleton } from './skeleton'\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from './tooltip'\n\nconst SIDEBAR_COOKIE_NAME = 'sidebar:state'\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = '16rem'\nconst SIDEBAR_WIDTH_MOBILE = '18rem'\nconst SIDEBAR_WIDTH_ICON = '3rem'\nconst SIDEBAR_KEYBOARD_SHORTCUT = 'b'\n\ntype SidebarContext = {\n state: 'expanded' | 'collapsed'\n open: boolean\n setOpen: (open: boolean) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n}\n\nconst SidebarContext = createContext<SidebarContext | null>(null)\n\nfunction useSidebar() {\n const context = useContext(SidebarContext)\n if (!context) {\n throw new Error('useSidebar must be used within a SidebarProvider.')\n }\n\n return context\n}\n\nconst SidebarProvider = forwardRef<\n HTMLDivElement,\n ComponentProps<'div'> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n }\n>(\n (\n {\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n },\n ref,\n ) => {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = useState(false)\n const [_open, _setOpen] = useState(defaultOpen)\n const open = openProp ?? _open\n const setOpen = useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === 'function' ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n if (typeof document !== 'undefined') {\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n }\n },\n [setOpenProp, open],\n )\n\n const toggleSidebar = useCallback(() => {\n return isMobile\n ? setOpenMobile((open) => !open)\n : setOpen((open) => !open)\n }, [isMobile, setOpen, setOpenMobile])\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n (event.metaKey || event.ctrlKey)\n ) {\n event.preventDefault()\n toggleSidebar()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [toggleSidebar])\n const state = open ? 'expanded' : 'collapsed'\n\n const contextValue = useMemo<SidebarContext>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n ],\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH,\n '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,\n ...style,\n } as CSSProperties\n }\n className={cn(\n 'group/sidebar-wrapper flex min-h-svh has-[[data-variant=inset]]:bg-surface-sunken',\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n )\n },\n)\nSidebarProvider.displayName = 'SidebarProvider'\n\n// ── SidebarSwipeWrapper (swipe-to-close on mobile) ─────────────────\n\n// TODO: edge-swipe-to-open (swipe from left edge to open sidebar)\n\nfunction SidebarSwipeWrapper({\n side,\n onClose,\n children,\n}: {\n side: 'left' | 'right'\n onClose: () => void\n children: React.ReactNode\n}) {\n const isReduced = useReducedMotion()\n const panelRef = useRef<HTMLDivElement>(null)\n\n // For a left sidebar, user swipes left (negative x) to close.\n // For a right sidebar, user swipes right (positive x) to close.\n const dragAxis = 'x' as const\n const dragConstraints = side === 'left' ? { right: 0 } : { left: 0 }\n\n return (\n <motion.div\n ref={panelRef}\n className=\"h-full w-full\"\n drag={!isReduced ? dragAxis : false}\n dragConstraints={dragConstraints}\n dragElastic={0.2}\n onDragEnd={(\n _: unknown,\n info: { offset: { x: number }; velocity: { x: number } },\n ) => {\n const w = panelRef.current?.getBoundingClientRect().width ?? 280\n if (side === 'left') {\n // Swipe left to close: negative offset\n if (info.offset.x < -(w * 0.3) || info.velocity.x < -500) {\n onClose()\n }\n } else {\n // Swipe right to close: positive offset\n if (info.offset.x > w * 0.3 || info.velocity.x > 500) {\n onClose()\n }\n }\n }}\n >\n {children}\n </motion.div>\n )\n}\n\nconst Sidebar = forwardRef<\n HTMLDivElement,\n ComponentProps<'div'> & {\n side?: 'left' | 'right'\n variant?: 'sidebar' | 'floating' | 'inset'\n collapsible?: 'offcanvas' | 'icon' | 'none'\n }\n>(\n (\n {\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n if (collapsible === 'none') {\n return (\n <aside\n aria-label=\"Sidebar\"\n className={cn(\n 'flex h-full w-(--sidebar-width) flex-col bg-surface-chrome text-surface-fg',\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n </aside>\n )\n }\n\n if (isMobile) {\n return (\n <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-surface-chrome p-0 text-surface-fg [&>button]:hidden\"\n style={\n {\n '--sidebar-width': SIDEBAR_WIDTH_MOBILE,\n } as CSSProperties\n }\n side={side}\n responsive={false}\n >\n <SidebarSwipeWrapper side={side} onClose={() => setOpenMobile(false)}>\n <aside aria-label=\"Sidebar\" className=\"flex h-full w-full flex-col\">{children}</aside>\n </SidebarSwipeWrapper>\n </SheetContent>\n </Sheet>\n )\n }\n\n return (\n <div\n ref={ref}\n className=\"group peer hidden text-surface-fg md:block\"\n data-state={state}\n data-collapsible={state === 'collapsed' ? collapsible : ''}\n data-variant={variant}\n data-side={side}\n >\n <div\n className={cn(\n 'relative h-svh w-(--sidebar-width) bg-transparent transition-[width] duration-moderate-02 ease-productive-exit',\n 'group-data-[collapsible=offcanvas]:w-0',\n 'group-data-[side=right]:rotate-180',\n variant === 'floating' || variant === 'inset'\n ? 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_1rem)]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)',\n )}\n />\n <div\n className={cn(\n 'fixed inset-y-0 z-raised hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-moderate-02 ease-productive-exit md:flex',\n side === 'left'\n ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'\n : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',\n variant === 'floating' || variant === 'inset'\n ? 'p-ds-03 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_1rem_+2px)]'\n : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',\n className,\n )}\n {...props}\n >\n <aside\n aria-label=\"Sidebar\"\n data-sidebar=\"sidebar\"\n className=\"flex h-full w-full flex-col bg-surface-chrome group-data-[variant=floating]:rounded-surface group-data-[variant=floating]:shadow-raised\"\n >\n {children}\n </aside>\n </div>\n </div>\n )\n },\n)\nSidebar.displayName = 'Sidebar'\n\nconst SidebarTrigger = forwardRef<\n ElementRef<typeof Button>,\n ComponentProps<typeof Button>\n>(({ className, onClick, ...props }, ref) => {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n ref={ref}\n data-sidebar=\"trigger\"\n variant=\"ghost\"\n size=\"icon-md\"\n className={cn('h-ds-xs-plus w-ds-xs-plus', className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <Icon icon={IconLayoutSidebarLeftCollapse} size=\"sm\" />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n})\nSidebarTrigger.displayName = 'SidebarTrigger'\n\nconst SidebarRail = forwardRef<HTMLButtonElement, ComponentProps<'button'>>(\n ({ className, ...props }, ref) => {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n ref={ref}\n data-sidebar=\"rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n 'hover:after:bg-surface-border-strong absolute inset-y-0 z-raised hidden w-4 -translate-x-1/2 transition-colors ease-productive-standard after:absolute after:inset-y-0 after:left-1/2 after:w-ds-01 group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex',\n '[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize',\n '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',\n 'group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-surface-raised-hover',\n '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',\n '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',\n className,\n )}\n {...props}\n />\n )\n },\n)\nSidebarRail.displayName = 'SidebarRail'\n\nconst SidebarInset = forwardRef<HTMLDivElement, ComponentProps<'main'>>(\n ({ className, ...props }, ref) => {\n return (\n <main\n ref={ref}\n className={cn(\n 'relative flex min-h-svh flex-1 flex-col bg-surface-base',\n 'peer-data-[variant=inset]:min-h-[calc(100svh-1rem)] md:peer-data-[variant=inset]:m-ds-03 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-ds-03 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-overlay-lg md:peer-data-[variant=inset]:shadow-raised',\n className,\n )}\n {...props}\n />\n )\n },\n)\nSidebarInset.displayName = 'SidebarInset'\n\nconst SidebarInput = forwardRef<\n ElementRef<typeof Input>,\n ComponentProps<typeof Input>\n>(({ className, wrapperClassName, ...props }, ref) => {\n return (\n <Input\n ref={ref}\n data-sidebar=\"input\"\n size=\"sm\"\n wrapperClassName={cn(\n 'bg-surface-raised shadow-none focus-within:ring-2 focus-within:ring-accent-9',\n wrapperClassName,\n )}\n className={cn('w-full', className)}\n {...props}\n />\n )\n})\nSidebarInput.displayName = 'SidebarInput'\n\nconst SidebarHeader = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"header\"\n className={cn('flex flex-col gap-ds-03 p-ds-03', className)}\n {...props}\n />\n )\n },\n)\nSidebarHeader.displayName = 'SidebarHeader'\n\nconst SidebarFooter = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"footer\"\n className={cn('flex flex-col gap-ds-03 p-ds-03', className)}\n {...props}\n />\n )\n },\n)\nSidebarFooter.displayName = 'SidebarFooter'\n\nconst SidebarSeparator = forwardRef<\n ElementRef<typeof Separator>,\n ComponentProps<typeof Separator>\n>(({ className, ...props }, ref) => {\n return (\n <Separator\n ref={ref}\n data-sidebar=\"separator\"\n className={cn(\n 'bg-surface-border mx-ds-03 w-auto',\n className,\n )}\n {...props}\n />\n )\n})\nSidebarSeparator.displayName = 'SidebarSeparator'\n\nconst SidebarContent = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"content\"\n className={cn(\n 'flex min-h-0 flex-1 flex-col gap-ds-03 overflow-auto group-data-[collapsible=icon]:overflow-hidden',\n className,\n )}\n {...props}\n />\n )\n },\n)\nSidebarContent.displayName = 'SidebarContent'\n\nconst SidebarGroup = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"group\"\n className={cn('relative flex w-full min-w-0 flex-col p-ds-03', className)}\n {...props}\n />\n )\n },\n)\nSidebarGroup.displayName = 'SidebarGroup'\n\nconst SidebarGroupLabel = forwardRef<\n HTMLDivElement,\n ComponentProps<'div'> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'div'\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-label\"\n className={cn(\n 'flex h-ds-sm shrink-0 items-center rounded-control px-ds-03 text-body-sm font-medium text-surface-fg-muted outline-hidden ring-accent-9 transition-[margin,opacity] duration-moderate-02 ease-productive-exit focus-visible:ring-2 [&>svg]:h-ico-sm [&>svg]:w-ico-sm [&>svg]:shrink-0',\n 'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',\n className,\n )}\n {...props}\n />\n )\n})\nSidebarGroupLabel.displayName = 'SidebarGroupLabel'\n\nconst SidebarGroupAction = forwardRef<\n HTMLButtonElement,\n ComponentProps<'button'> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-action\"\n className={cn(\n 'hover:bg-surface-raised-hover absolute right-ds-04 top-ds-04 flex aspect-square w-5 items-center justify-center rounded-control p-0 text-surface-fg outline-hidden ring-accent-9 transition-transform hover:text-surface-fg focus-visible:ring-2 [&>svg]:h-ico-sm [&>svg]:w-ico-sm [&>svg]:shrink-0',\n 'after:absolute after:-inset-2 after:md:hidden',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n )\n})\nSidebarGroupAction.displayName = 'SidebarGroupAction'\n\nconst SidebarGroupContent = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-sidebar=\"group-content\"\n className={cn('w-full text-body-md', className)}\n {...props}\n />\n ),\n)\nSidebarGroupContent.displayName = 'SidebarGroupContent'\n\nconst SidebarMenu = forwardRef<HTMLUListElement, ComponentProps<'ul'>>(\n ({ className, ...props }, ref) => (\n <ul\n ref={ref}\n data-sidebar=\"menu\"\n className={cn('flex w-full min-w-0 flex-col gap-ds-02', className)}\n {...props}\n />\n ),\n)\nSidebarMenu.displayName = 'SidebarMenu'\n\nconst SidebarMenuItem = forwardRef<HTMLLIElement, ComponentProps<'li'>>(\n ({ className, ...props }, ref) => (\n <li\n ref={ref}\n data-sidebar=\"menu-item\"\n className={cn('group/menu-item relative', className)}\n {...props}\n />\n ),\n)\nSidebarMenuItem.displayName = 'SidebarMenuItem'\n\nconst sidebarMenuButtonVariants = cva(\n 'peer/menu-button hover:bg-surface-raised-hover active:bg-accent-2 data-[active=true]:bg-accent-2 data-[state=open]:hover:bg-surface-raised-hover flex w-full items-center gap-ds-03 overflow-hidden rounded-control p-ds-03 text-left outline-hidden ring-accent-9 transition-[width,height,padding] hover:text-surface-fg focus-visible:ring-2 active:text-surface-fg disabled:pointer-events-none disabled:opacity-action-disabled group-has-[[data-sidebar=menu-action]]/menu-item:pr-ds-07 aria-disabled:pointer-events-none aria-disabled:opacity-action-disabled data-[active=true]:font-medium data-[active=true]:text-surface-fg data-[state=open]:hover:text-surface-fg group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-ds-03! [&>span:last-child]:truncate [&>svg]:h-ico-sm [&>svg]:w-ico-sm [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n default:\n 'hover:bg-surface-raised-hover hover:text-surface-fg',\n outline:\n 'hover:bg-surface-raised-hover bg-surface-raised shadow-[0_0_0_1px_var(--color-surface-border)] hover:text-surface-fg hover:shadow-[0_0_0_1px_var(--color-surface-border-strong)]',\n },\n size: {\n md: 'h-ds-sm text-body-md',\n sm: 'h-ds-xs-plus text-body-sm',\n lg: 'h-ds-lg text-body-md group-data-[collapsible=icon]:p-0!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n },\n },\n)\n\nconst SidebarMenuButton = forwardRef<\n HTMLButtonElement,\n ComponentProps<'button'> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | ComponentProps<typeof TooltipContent>\n } & VariantProps<typeof sidebarMenuButtonVariants>\n>(\n (\n {\n asChild = false,\n isActive = false,\n variant = 'default',\n size = 'md',\n tooltip,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const Comp = asChild ? Slot : 'button'\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n ref={ref}\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), !asChild && 'relative', className)}\n {...props}\n >\n {asChild ? children : (\n <>\n {isActive && (\n <motion.span\n layoutId=\"sidebar-active-indicator\"\n className=\"absolute inset-0 rounded-control bg-accent-2\"\n transition={springs.smooth}\n />\n )}\n <span className=\"relative z-[1] flex w-full items-center gap-[inherit]\">{children}</span>\n </>\n )}\n </Comp>\n )\n\n if (!tooltip) {\n return button\n }\n\n if (typeof tooltip === 'string') {\n tooltip = {\n children: tooltip,\n }\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== 'collapsed' || isMobile}\n {...tooltip}\n />\n </Tooltip>\n )\n },\n)\nSidebarMenuButton.displayName = 'SidebarMenuButton'\n\nconst SidebarMenuAction = forwardRef<\n HTMLButtonElement,\n ComponentProps<'button'> & {\n asChild?: boolean\n showOnHover?: boolean\n }\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-action\"\n className={cn(\n 'hover:bg-surface-raised-hover absolute right-ds-02 top-ds-02b flex aspect-square w-5 items-center justify-center rounded-control p-0 text-surface-fg outline-hidden ring-accent-9 transition-transform hover:text-surface-fg focus-visible:ring-2 peer-hover/menu-button:text-surface-fg [&>svg]:h-ico-sm [&>svg]:w-ico-sm [&>svg]:shrink-0',\n 'after:absolute after:-inset-2 after:md:hidden',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=md]/menu-button:top-ds-02b',\n 'peer-data-[size=lg]/menu-button:top-ds-03',\n 'group-data-[collapsible=icon]:hidden',\n showOnHover &&\n 'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-surface-fg md:opacity-0',\n className,\n )}\n {...props}\n />\n )\n})\nSidebarMenuAction.displayName = 'SidebarMenuAction'\n\nconst SidebarMenuBadge = forwardRef<HTMLDivElement, ComponentProps<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-sidebar=\"menu-badge\"\n className={cn(\n 'pointer-events-none absolute right-ds-02 flex h-5 min-w-5 select-none items-center justify-center rounded-control px-ds-02 text-body-sm font-medium tabular-nums text-surface-fg',\n 'peer-hover/menu-button:text-surface-fg peer-data-[active=true]/menu-button:text-surface-fg',\n 'peer-data-[size=sm]/menu-button:top-1',\n 'peer-data-[size=md]/menu-button:top-ds-02b',\n 'peer-data-[size=lg]/menu-button:top-ds-03',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n ),\n)\nSidebarMenuBadge.displayName = 'SidebarMenuBadge'\n\nconst SidebarMenuSkeleton = forwardRef<\n HTMLDivElement,\n ComponentProps<'div'> & {\n showIcon?: boolean\n }\n>(({ className, showIcon = false, ...props }, ref) => {\n const width = useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n }, [])\n\n return (\n <div\n ref={ref}\n data-sidebar=\"menu-skeleton\"\n className={cn('flex h-ds-sm items-center gap-ds-03 rounded-control px-ds-03', className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"h-ico-sm w-ico-sm rounded-control\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n '--skeleton-width': width,\n } as CSSProperties\n }\n />\n </div>\n )\n})\nSidebarMenuSkeleton.displayName = 'SidebarMenuSkeleton'\n\nconst SidebarMenuSub = forwardRef<HTMLUListElement, ComponentProps<'ul'>>(\n ({ className, ...props }, ref) => (\n <ul\n ref={ref}\n data-sidebar=\"menu-sub\"\n className={cn(\n 'mx-ds-04 flex min-w-0 translate-x-px flex-col gap-ds-02 border-l border-surface-border px-ds-03 py-ds-01',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n ),\n)\nSidebarMenuSub.displayName = 'SidebarMenuSub'\n\nconst SidebarMenuSubItem = forwardRef<HTMLLIElement, ComponentProps<'li'>>(\n ({ ...props }, ref) => <li ref={ref} {...props} />,\n)\nSidebarMenuSubItem.displayName = 'SidebarMenuSubItem'\n\nconst SidebarMenuSubButton = forwardRef<\n HTMLAnchorElement,\n ComponentProps<'a'> & {\n asChild?: boolean\n size?: 'sm' | 'md'\n isActive?: boolean\n }\n>(({ asChild = false, size = 'md', isActive, className, ...props }, ref) => {\n const Comp = asChild ? Slot : 'a'\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n 'hover:bg-surface-raised-hover active:bg-accent-2 flex h-ds-xs-plus min-w-0 -translate-x-px items-center gap-ds-03 overflow-hidden rounded-control px-ds-03 text-surface-fg outline-hidden ring-accent-9 hover:text-surface-fg focus-visible:ring-2 active:text-surface-fg disabled:pointer-events-none disabled:opacity-action-disabled aria-disabled:pointer-events-none aria-disabled:opacity-action-disabled [&>span:last-child]:truncate [&>svg]:h-ico-sm [&>svg]:w-ico-sm [&>svg]:shrink-0 [&>svg]:text-surface-fg',\n 'data-[active=true]:bg-accent-2 data-[active=true]:text-surface-fg',\n size === 'sm' && 'text-body-sm',\n size === 'md' && 'text-body-md',\n 'group-data-[collapsible=icon]:hidden',\n className,\n )}\n {...props}\n />\n )\n})\nSidebarMenuSubButton.displayName = 'SidebarMenuSubButton'\n\nexport type SidebarProps = React.ComponentPropsWithoutRef<'div'> & { side?: 'left' | 'right'; variant?: 'sidebar' | 'floating' | 'inset'; collapsible?: 'offcanvas' | 'icon' | 'none' }\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n"],"mappings":"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"}
|
package/dist/ui/skeleton.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
1
|
+
import { cn as e } from "./lib/utils.js";
|
|
2
|
+
import * as t from "react";
|
|
3
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
+
import { cva as i } from "class-variance-authority";
|
|
5
5
|
//#region src/ui/skeleton.tsx
|
|
6
|
-
var a =
|
|
6
|
+
var a = i("bg-skeleton-base", {
|
|
7
7
|
variants: {
|
|
8
8
|
variant: {
|
|
9
9
|
rectangle: "rounded-control",
|
|
@@ -20,13 +20,13 @@ var a = e("bg-skeleton-base", {
|
|
|
20
20
|
variant: "rectangle",
|
|
21
21
|
animation: "pulse"
|
|
22
22
|
}
|
|
23
|
-
}), o =
|
|
23
|
+
}), o = t.forwardRef(({ className: t, variant: r, animation: i, ...o }, s) => /* @__PURE__ */ n("div", {
|
|
24
24
|
ref: s,
|
|
25
25
|
"aria-hidden": "true",
|
|
26
|
-
className:
|
|
27
|
-
variant:
|
|
26
|
+
className: e(a({
|
|
27
|
+
variant: r,
|
|
28
28
|
animation: i
|
|
29
|
-
}),
|
|
29
|
+
}), t),
|
|
30
30
|
...o
|
|
31
31
|
}));
|
|
32
32
|
o.displayName = "Skeleton";
|
|
@@ -39,9 +39,9 @@ var s = {
|
|
|
39
39
|
md: "h-10 w-10",
|
|
40
40
|
lg: "h-12 w-12",
|
|
41
41
|
xl: "h-16 w-16"
|
|
42
|
-
}, l =
|
|
42
|
+
}, l = t.forwardRef(({ className: t, size: r = "md", animation: i = "pulse", ...a }, o) => /* @__PURE__ */ n("div", {
|
|
43
43
|
ref: o,
|
|
44
|
-
className:
|
|
44
|
+
className: e("bg-skeleton-base rounded-pill", c[r], s[i], t),
|
|
45
45
|
...a
|
|
46
46
|
}));
|
|
47
47
|
l.displayName = "SkeletonAvatar";
|
|
@@ -52,13 +52,13 @@ var u = {
|
|
|
52
52
|
}, d = {
|
|
53
53
|
sm: "gap-ds-02",
|
|
54
54
|
md: "gap-ds-03"
|
|
55
|
-
}, f =
|
|
56
|
-
let f = Math.max(1,
|
|
57
|
-
return /* @__PURE__ */
|
|
55
|
+
}, f = t.forwardRef(({ className: t, lines: r = 3, lastLineWidth: i = "three-quarter", spacing: a = "md", animation: o = "pulse", ...c }, l) => {
|
|
56
|
+
let f = Math.max(1, r ?? 3);
|
|
57
|
+
return /* @__PURE__ */ n("div", {
|
|
58
58
|
ref: l,
|
|
59
|
-
className:
|
|
59
|
+
className: e("flex flex-col", d[a], t),
|
|
60
60
|
...c,
|
|
61
|
-
children: Array.from({ length: f }).map((
|
|
61
|
+
children: Array.from({ length: f }).map((t, r) => /* @__PURE__ */ n("div", { className: e("h-3.5 rounded-control-inner bg-skeleton-base", s[o], r === f - 1 ? u[i] : "w-full") }, r))
|
|
62
62
|
});
|
|
63
63
|
});
|
|
64
64
|
f.displayName = "SkeletonText";
|
|
@@ -77,11 +77,11 @@ var p = {
|
|
|
77
77
|
md: "w-full",
|
|
78
78
|
lg: "w-full"
|
|
79
79
|
}
|
|
80
|
-
}, h =
|
|
80
|
+
}, h = t.forwardRef(({ className: t, size: r = "md", width: i = "auto", animation: a = "pulse", ...o }, c) => {
|
|
81
81
|
let l = i === "icon";
|
|
82
|
-
return /* @__PURE__ */
|
|
82
|
+
return /* @__PURE__ */ n("div", {
|
|
83
83
|
ref: c,
|
|
84
|
-
className:
|
|
84
|
+
className: e("bg-skeleton-base rounded-control", p[r], l ? "aspect-square" : m[i][r], s[a], t),
|
|
85
85
|
...o
|
|
86
86
|
});
|
|
87
87
|
});
|
|
@@ -90,9 +90,9 @@ var g = {
|
|
|
90
90
|
sm: "h-ds-sm",
|
|
91
91
|
md: "h-ds-md",
|
|
92
92
|
lg: "h-ds-lg"
|
|
93
|
-
}, _ =
|
|
93
|
+
}, _ = t.forwardRef(({ className: t, size: r = "md", animation: i = "pulse", ...a }, o) => /* @__PURE__ */ n("div", {
|
|
94
94
|
ref: o,
|
|
95
|
-
className:
|
|
95
|
+
className: e("w-full bg-skeleton-base rounded-control border border-skeleton-base/30", g[r], s[i], t),
|
|
96
96
|
...a
|
|
97
97
|
}));
|
|
98
98
|
_.displayName = "SkeletonInput";
|
|
@@ -112,27 +112,27 @@ var v = [
|
|
|
112
112
|
60,
|
|
113
113
|
95,
|
|
114
114
|
38
|
|
115
|
-
], y =
|
|
116
|
-
let l = Math.max(1,
|
|
117
|
-
return /* @__PURE__ */
|
|
115
|
+
], y = t.forwardRef(({ className: t, bars: r = 7, height: i = "h-40", animation: a = "pulse", ...o }, c) => {
|
|
116
|
+
let l = Math.max(1, r ?? 7);
|
|
117
|
+
return /* @__PURE__ */ n("div", {
|
|
118
118
|
ref: c,
|
|
119
|
-
className:
|
|
119
|
+
className: e("flex items-end gap-ds-02", i, t),
|
|
120
120
|
...o,
|
|
121
|
-
children: Array.from({ length: l }).map((
|
|
122
|
-
let i = v[
|
|
123
|
-
return /* @__PURE__ */
|
|
124
|
-
className:
|
|
121
|
+
children: Array.from({ length: l }).map((t, r) => {
|
|
122
|
+
let i = v[r % v.length];
|
|
123
|
+
return /* @__PURE__ */ n("div", {
|
|
124
|
+
className: e("flex-1 bg-skeleton-base rounded-t-control-inner", s[a]),
|
|
125
125
|
style: { height: `${i}%` }
|
|
126
|
-
},
|
|
126
|
+
}, r);
|
|
127
127
|
})
|
|
128
128
|
});
|
|
129
129
|
});
|
|
130
130
|
y.displayName = "SkeletonChart";
|
|
131
|
-
var b =
|
|
131
|
+
var b = t.forwardRef(({ className: t, width: i = "w-full", height: a = "h-40", animation: o = "pulse", ...c }, l) => /* @__PURE__ */ n("div", {
|
|
132
132
|
ref: l,
|
|
133
|
-
className:
|
|
133
|
+
className: e("bg-skeleton-base rounded-control relative flex items-center justify-center", i, a, s[o], t),
|
|
134
134
|
...c,
|
|
135
|
-
children: /* @__PURE__ */
|
|
135
|
+
children: /* @__PURE__ */ r("svg", {
|
|
136
136
|
xmlns: "http://www.w3.org/2000/svg",
|
|
137
137
|
width: "24",
|
|
138
138
|
height: "24",
|
|
@@ -145,7 +145,7 @@ var b = n.forwardRef(({ className: e, width: n = "w-full", height: a = "h-40", a
|
|
|
145
145
|
className: "text-skeleton-shimmer opacity-40",
|
|
146
146
|
"aria-hidden": "true",
|
|
147
147
|
children: [
|
|
148
|
-
/* @__PURE__ */
|
|
148
|
+
/* @__PURE__ */ n("rect", {
|
|
149
149
|
x: "3",
|
|
150
150
|
y: "3",
|
|
151
151
|
width: "18",
|
|
@@ -153,23 +153,23 @@ var b = n.forwardRef(({ className: e, width: n = "w-full", height: a = "h-40", a
|
|
|
153
153
|
rx: "2",
|
|
154
154
|
ry: "2"
|
|
155
155
|
}),
|
|
156
|
-
/* @__PURE__ */
|
|
156
|
+
/* @__PURE__ */ n("circle", {
|
|
157
157
|
cx: "8.5",
|
|
158
158
|
cy: "8.5",
|
|
159
159
|
r: "1.5"
|
|
160
160
|
}),
|
|
161
|
-
/* @__PURE__ */
|
|
161
|
+
/* @__PURE__ */ n("polyline", { points: "21 15 16 10 5 21" })
|
|
162
162
|
]
|
|
163
163
|
})
|
|
164
164
|
}));
|
|
165
165
|
b.displayName = "SkeletonImage";
|
|
166
|
-
var x =
|
|
167
|
-
ref:
|
|
166
|
+
var x = t.forwardRef(({ label: e = "Loading", children: t, ...n }, i) => /* @__PURE__ */ r("div", {
|
|
167
|
+
ref: i,
|
|
168
168
|
role: "status",
|
|
169
169
|
"aria-label": e,
|
|
170
170
|
"aria-busy": "true",
|
|
171
171
|
...n,
|
|
172
|
-
children: [/* @__PURE__ */
|
|
172
|
+
children: [/* @__PURE__ */ r("span", {
|
|
173
173
|
className: "sr-only",
|
|
174
174
|
children: [e, "..."]
|
|
175
175
|
}), t]
|
package/dist/ui/slider.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
2
|
+
import { cn as e } from "./lib/utils.js";
|
|
3
|
+
import { useFormField as t } from "./form.js";
|
|
4
|
+
import { Range as n, Root as r, Thumb as i, Track as a } from "../_chunks/primitives/react-slider.js";
|
|
5
|
+
import * as o from "react";
|
|
6
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
7
|
+
import { cva as l } from "class-variance-authority";
|
|
8
8
|
//#region src/ui/slider.tsx
|
|
9
|
-
var u =
|
|
9
|
+
var u = l("relative w-full grow overflow-hidden rounded-pill bg-surface-raised-hover", {
|
|
10
10
|
variants: { size: {
|
|
11
11
|
sm: "h-ds-02",
|
|
12
12
|
md: "h-ds-02b",
|
|
13
13
|
lg: "h-[10px]"
|
|
14
14
|
} },
|
|
15
15
|
defaultVariants: { size: "md" }
|
|
16
|
-
}), d =
|
|
16
|
+
}), d = l("touch-target block rounded-pill bg-surface-overlay shadow-raised transition-[color,transform,box-shadow] duration-fast-02 ease-productive-standard hover:shadow-raised-hover active:scale-[1.15] focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-action-disabled", {
|
|
17
17
|
variants: {
|
|
18
18
|
size: {
|
|
19
19
|
sm: "h-4 w-4 border",
|
|
@@ -36,23 +36,23 @@ var u = e("relative w-full grow overflow-hidden rounded-pill bg-surface-raised-h
|
|
|
36
36
|
success: "bg-success-9",
|
|
37
37
|
warning: "bg-warning-9",
|
|
38
38
|
error: "bg-error-9"
|
|
39
|
-
}, p =
|
|
40
|
-
let y = h ?? "md", b = g ?? "accent", x =
|
|
41
|
-
return /* @__PURE__ */
|
|
39
|
+
}, p = o.forwardRef(({ className: o, "aria-label": l, value: p, defaultValue: m, size: h = "md", color: g = "accent", ..._ }, v) => {
|
|
40
|
+
let y = h ?? "md", b = g ?? "accent", x = t(), S = x.state === "error", C = _["aria-describedby"] ?? x.helperTextId, w = _["aria-required"] ?? x.required, T = (p ?? m ?? [0]).length;
|
|
41
|
+
return /* @__PURE__ */ c(r, {
|
|
42
42
|
ref: v,
|
|
43
43
|
value: p,
|
|
44
44
|
defaultValue: m,
|
|
45
45
|
"aria-invalid": S || void 0,
|
|
46
46
|
"aria-describedby": C,
|
|
47
47
|
"aria-required": w || void 0,
|
|
48
|
-
className:
|
|
48
|
+
className: e("relative flex w-full touch-none select-none items-center", o),
|
|
49
49
|
..._,
|
|
50
|
-
children: [/* @__PURE__ */
|
|
50
|
+
children: [/* @__PURE__ */ s(a, {
|
|
51
51
|
className: u({ size: y }),
|
|
52
|
-
children: /* @__PURE__ */
|
|
53
|
-
}), Array.from({ length: T }, (e, t) => /* @__PURE__ */
|
|
54
|
-
"aria-label": T === 1 ?
|
|
55
|
-
"aria-labelledby": T === 1 && !
|
|
52
|
+
children: /* @__PURE__ */ s(n, { className: e("absolute h-full", f[b]) })
|
|
53
|
+
}), Array.from({ length: T }, (e, t) => /* @__PURE__ */ s(i, {
|
|
54
|
+
"aria-label": T === 1 ? l : void 0,
|
|
55
|
+
"aria-labelledby": T === 1 && !l ? x.labelId : void 0,
|
|
56
56
|
className: d({
|
|
57
57
|
size: y,
|
|
58
58
|
color: b
|
|
@@ -60,6 +60,6 @@ var u = e("relative w-full grow overflow-hidden rounded-pill bg-surface-raised-h
|
|
|
60
60
|
}, t))]
|
|
61
61
|
});
|
|
62
62
|
});
|
|
63
|
-
p.displayName =
|
|
63
|
+
p.displayName = r.displayName;
|
|
64
64
|
//#endregion
|
|
65
65
|
export { p as Slider, d as sliderThumbVariants, u as sliderTrackVariants };
|
package/dist/ui/surface.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Slot as e } from "../_chunks/primitives-internal.js";
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
2
|
+
import { cn as t } from "./lib/utils.js";
|
|
3
|
+
import * as n from "react";
|
|
4
|
+
import { jsx as r } from "react/jsx-runtime";
|
|
5
|
+
import { cva as i } from "class-variance-authority";
|
|
6
6
|
//#region src/ui/surface.tsx
|
|
7
|
-
var a =
|
|
7
|
+
var a = i("", {
|
|
8
8
|
variants: {
|
|
9
9
|
elevation: {
|
|
10
10
|
flat: "bg-surface-raised",
|
|
@@ -36,14 +36,14 @@ var a = t("", {
|
|
|
36
36
|
radius: "surface",
|
|
37
37
|
bordered: !1
|
|
38
38
|
}
|
|
39
|
-
}), o =
|
|
39
|
+
}), o = n.forwardRef(({ className: n, elevation: i, padding: o, radius: s, bordered: c, asChild: l = !1, ...u }, d) => (typeof process < "u" && process.env.NODE_ENV !== "production" && c && (i ?? "raised") !== "flat" && console.warn("[shilp-sutra] <Surface> combines `bordered` with a raised `elevation` — the double-edge anti-pattern. Pick one: use elevation=\"flat\" with `bordered`, or drop `bordered` and let the elevation carry the edge."), /* @__PURE__ */ r(l ? e : "div", {
|
|
40
40
|
ref: d,
|
|
41
|
-
className:
|
|
42
|
-
elevation:
|
|
41
|
+
className: t(a({
|
|
42
|
+
elevation: i,
|
|
43
43
|
padding: o,
|
|
44
44
|
radius: s,
|
|
45
45
|
bordered: c
|
|
46
|
-
}),
|
|
46
|
+
}), n),
|
|
47
47
|
...u
|
|
48
48
|
})));
|
|
49
49
|
o.displayName = "Surface";
|
package/dist/ui/tabs.js
CHANGED
|
@@ -1,43 +1,43 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { springs as e, tweens as t } from "./lib/motion.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
3
|
+
import { cn as n } from "./lib/utils.js";
|
|
4
|
+
import { Content as r, List as i, Root2 as a, Trigger as o } from "../_chunks/primitives/react-tabs.js";
|
|
5
|
+
import * as s from "react";
|
|
6
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
7
|
+
import { LayoutGroup as u, motion as d } from "framer-motion";
|
|
8
|
+
import { cva as f } from "class-variance-authority";
|
|
9
9
|
//#region src/ui/tabs.tsx
|
|
10
|
-
var p =
|
|
11
|
-
let [u, d] =
|
|
12
|
-
|
|
10
|
+
var p = s.createContext(void 0), m = s.createContext("horizontal"), h = s.forwardRef(({ value: e, defaultValue: t, onValueChange: r, orientation: i, ...o }, l) => {
|
|
11
|
+
let [u, d] = s.useState(e ?? t ?? "");
|
|
12
|
+
s.useEffect(() => {
|
|
13
13
|
e !== void 0 && d(e);
|
|
14
14
|
}, [e]);
|
|
15
|
-
let f =
|
|
16
|
-
d(e),
|
|
17
|
-
}, [
|
|
18
|
-
return /* @__PURE__ */
|
|
15
|
+
let f = s.useCallback((e) => {
|
|
16
|
+
d(e), r?.(e);
|
|
17
|
+
}, [r]), h = i ?? "horizontal";
|
|
18
|
+
return /* @__PURE__ */ c(p.Provider, {
|
|
19
19
|
value: u,
|
|
20
|
-
children: /* @__PURE__ */
|
|
20
|
+
children: /* @__PURE__ */ c(m.Provider, {
|
|
21
21
|
value: h,
|
|
22
|
-
children: /* @__PURE__ */
|
|
23
|
-
ref:
|
|
22
|
+
children: /* @__PURE__ */ c(a, {
|
|
23
|
+
ref: l,
|
|
24
24
|
value: e,
|
|
25
25
|
defaultValue: e === void 0 ? t : void 0,
|
|
26
26
|
onValueChange: f,
|
|
27
27
|
orientation: i,
|
|
28
|
-
...
|
|
29
|
-
className:
|
|
28
|
+
...o,
|
|
29
|
+
className: n(h === "vertical" && "flex flex-row gap-ds-05", o.className)
|
|
30
30
|
})
|
|
31
31
|
})
|
|
32
32
|
});
|
|
33
33
|
});
|
|
34
34
|
h.displayName = "Tabs";
|
|
35
|
-
var g =
|
|
35
|
+
var g = s.createContext({
|
|
36
36
|
variant: "line",
|
|
37
37
|
size: "md",
|
|
38
38
|
color: "accent",
|
|
39
39
|
layoutId: "tab-indicator"
|
|
40
|
-
}), _ =
|
|
40
|
+
}), _ = f("inline-flex items-center", {
|
|
41
41
|
variants: {
|
|
42
42
|
variant: {
|
|
43
43
|
line: "border-b border-surface-border-strong w-full gap-0",
|
|
@@ -67,7 +67,7 @@ var g = c.createContext({
|
|
|
67
67
|
size: "md",
|
|
68
68
|
orientation: "horizontal"
|
|
69
69
|
}
|
|
70
|
-
}), v =
|
|
70
|
+
}), v = f("relative inline-flex items-center justify-center gap-ds-02 whitespace-nowrap font-sans font-medium transition-colors duration-100 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-1 disabled:pointer-events-none disabled:opacity-action-disabled", {
|
|
71
71
|
variants: {
|
|
72
72
|
variant: {
|
|
73
73
|
line: ["-mb-px", "text-surface-fg-muted hover:text-surface-fg"],
|
|
@@ -87,8 +87,8 @@ var g = c.createContext({
|
|
|
87
87
|
variant: "line",
|
|
88
88
|
size: "md"
|
|
89
89
|
}
|
|
90
|
-
}), y =
|
|
91
|
-
let
|
|
90
|
+
}), y = s.forwardRef(({ className: e, variant: t, size: r, color: a, ...o }, l) => {
|
|
91
|
+
let d = s.useContext(m), f = t ?? "line", p = r ?? "md", h = a ?? "accent", v = s.useId(), y = s.useMemo(() => ({
|
|
92
92
|
variant: f,
|
|
93
93
|
size: p,
|
|
94
94
|
color: h,
|
|
@@ -99,68 +99,68 @@ var g = c.createContext({
|
|
|
99
99
|
h,
|
|
100
100
|
v
|
|
101
101
|
]);
|
|
102
|
-
return /* @__PURE__ */
|
|
102
|
+
return /* @__PURE__ */ c(g.Provider, {
|
|
103
103
|
value: y,
|
|
104
|
-
children: /* @__PURE__ */
|
|
105
|
-
ref:
|
|
106
|
-
className:
|
|
104
|
+
children: /* @__PURE__ */ c(u, { children: /* @__PURE__ */ c(i, {
|
|
105
|
+
ref: l,
|
|
106
|
+
className: n(_({
|
|
107
107
|
variant: f,
|
|
108
108
|
size: p,
|
|
109
|
-
orientation:
|
|
109
|
+
orientation: d
|
|
110
110
|
}), e),
|
|
111
111
|
...o
|
|
112
112
|
}) })
|
|
113
113
|
});
|
|
114
114
|
});
|
|
115
|
-
y.displayName =
|
|
115
|
+
y.displayName = i.displayName;
|
|
116
116
|
var b = {
|
|
117
117
|
accent: "data-[state=active]:text-accent-11",
|
|
118
118
|
neutral: "data-[state=active]:text-surface-fg"
|
|
119
119
|
}, x = {
|
|
120
120
|
accent: "bg-accent-9",
|
|
121
121
|
neutral: "bg-surface-fg"
|
|
122
|
-
}, S =
|
|
123
|
-
let
|
|
124
|
-
return /* @__PURE__ */
|
|
125
|
-
ref:
|
|
126
|
-
className:
|
|
122
|
+
}, S = s.forwardRef(({ className: t, variant: r, children: i, ...a }, u) => {
|
|
123
|
+
let f = s.useContext(g), h = s.useContext(p), _ = s.useContext(m), y = r ?? f.variant, S = f.size, C = f.color, w = a.value === h, T = _ === "vertical";
|
|
124
|
+
return /* @__PURE__ */ l(o, {
|
|
125
|
+
ref: u,
|
|
126
|
+
className: n(v({
|
|
127
127
|
variant: y,
|
|
128
128
|
size: S
|
|
129
129
|
}), y === "line" && b[C], T && "w-full justify-start", y === "line" && T && "-ml-px -mb-0", t),
|
|
130
130
|
...a,
|
|
131
131
|
children: [
|
|
132
|
-
y === "contained" && w && /* @__PURE__ */
|
|
133
|
-
layoutId: `${
|
|
132
|
+
y === "contained" && w && /* @__PURE__ */ c(d.span, {
|
|
133
|
+
layoutId: `${f.layoutId}-contained`,
|
|
134
134
|
className: "absolute inset-0 rounded-control bg-surface-overlay shadow-raised",
|
|
135
135
|
transition: e.smooth
|
|
136
136
|
}),
|
|
137
|
-
/* @__PURE__ */
|
|
137
|
+
/* @__PURE__ */ c("span", {
|
|
138
138
|
className: "relative z-[1] inline-flex min-w-0 items-center gap-ds-02",
|
|
139
|
-
children: /* @__PURE__ */
|
|
139
|
+
children: /* @__PURE__ */ c("span", {
|
|
140
140
|
className: "truncate",
|
|
141
141
|
children: i
|
|
142
142
|
})
|
|
143
143
|
}),
|
|
144
|
-
y === "line" && w && /* @__PURE__ */
|
|
145
|
-
layoutId: `${
|
|
146
|
-
className:
|
|
144
|
+
y === "line" && w && /* @__PURE__ */ c(d.span, {
|
|
145
|
+
layoutId: `${f.layoutId}-line`,
|
|
146
|
+
className: n("absolute", T ? "left-0 top-0 bottom-0 w-0.5" : "bottom-0 left-0 right-0 h-0.5", x[C]),
|
|
147
147
|
transition: e.smooth
|
|
148
148
|
})
|
|
149
149
|
]
|
|
150
150
|
});
|
|
151
151
|
});
|
|
152
|
-
S.displayName =
|
|
153
|
-
var C =
|
|
152
|
+
S.displayName = o.displayName;
|
|
153
|
+
var C = s.forwardRef(({ className: e, children: i, ...a }, o) => /* @__PURE__ */ c(r, {
|
|
154
154
|
ref: o,
|
|
155
|
-
className:
|
|
155
|
+
className: n("ring-offset-background focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 focus-visible:ring-offset-2", s.useContext(m) === "vertical" ? "mt-0 flex-1 min-w-0" : "mt-ds-05", e),
|
|
156
156
|
...a,
|
|
157
|
-
children: /* @__PURE__ */
|
|
157
|
+
children: /* @__PURE__ */ c(d.div, {
|
|
158
158
|
initial: { opacity: 0 },
|
|
159
159
|
animate: { opacity: 1 },
|
|
160
160
|
transition: t.fade,
|
|
161
|
-
children:
|
|
161
|
+
children: i
|
|
162
162
|
})
|
|
163
163
|
}));
|
|
164
|
-
C.displayName =
|
|
164
|
+
C.displayName = r.displayName;
|
|
165
165
|
//#endregion
|
|
166
166
|
export { h as Tabs, C as TabsContent, y as TabsList, S as TabsTrigger };
|