@mdigital_ui/ui 0.4.4 → 0.4.5
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/dist/breadcrumbs/index.js +3 -3
- package/dist/{chunk-FU5Q4WVX.js → chunk-AL2EEKUY.js} +3 -3
- package/dist/{chunk-FU5Q4WVX.js.map → chunk-AL2EEKUY.js.map} +1 -1
- package/dist/{chunk-BS4PZPY6.js → chunk-JBNFVXH5.js} +3 -3
- package/dist/{chunk-BS4PZPY6.js.map → chunk-JBNFVXH5.js.map} +1 -1
- package/dist/{chunk-GOBUFGGJ.js → chunk-OTNKP5CD.js} +3 -3
- package/dist/{chunk-GOBUFGGJ.js.map → chunk-OTNKP5CD.js.map} +1 -1
- package/dist/dropdown/index.js +2 -2
- package/dist/index.js +8 -8
- package/dist/menubar/index.js +2 -2
- package/dist/multi-select/index.js +1 -1
- package/dist/select/index.js +1 -1
- package/package.json +2 -2
- package/styles/global.css +495 -6016
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, breadcrumbs_default as default } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-NZHKNUGE.js';
|
|
1
|
+
export { BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, breadcrumbs_default as default } from '../chunk-AL2EEKUY.js';
|
|
2
|
+
import '../chunk-OTNKP5CD.js';
|
|
4
3
|
import '../chunk-ROQGBDET.js';
|
|
4
|
+
import '../chunk-NZHKNUGE.js';
|
|
5
5
|
import '../chunk-4TEZWGX7.js';
|
|
6
6
|
import '../chunk-G6QIIWKU.js';
|
|
7
7
|
import '../chunk-RAS6HUEI.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { dropdown_default } from './chunk-
|
|
1
|
+
import { dropdown_default } from './chunk-OTNKP5CD.js';
|
|
2
2
|
import { colorVars } from './chunk-G6QIIWKU.js';
|
|
3
3
|
import { cn, iconSizes } from './chunk-RAS6HUEI.js';
|
|
4
4
|
import { cva } from 'class-variance-authority';
|
|
@@ -278,5 +278,5 @@ BreadcrumbEllipsis.displayName = "BreadcrumbEllipsis";
|
|
|
278
278
|
var breadcrumbs_default = Breadcrumb;
|
|
279
279
|
|
|
280
280
|
export { BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, breadcrumbs_default };
|
|
281
|
-
//# sourceMappingURL=chunk-
|
|
282
|
-
//# sourceMappingURL=chunk-
|
|
281
|
+
//# sourceMappingURL=chunk-AL2EEKUY.js.map
|
|
282
|
+
//# sourceMappingURL=chunk-AL2EEKUY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/breadcrumbs/index.tsx"],"names":[],"mappings":"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","file":"chunk-FU5Q4WVX.js","sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport React from 'react'\n\nimport { ChevronRight, MoreHorizontal, MoreVertical } from 'lucide-react'\n\nimport Dropdown from '../dropdown'\nimport { cn, iconSizes } from '../utils'\nimport { colorVars } from '../variants'\nimport type {\n BreadcrumbEllipsisProps,\n BreadcrumbItemProps,\n BreadcrumbLinkProps,\n BreadcrumbListProps,\n BreadcrumbPageProps,\n BreadcrumbProps,\n BreadcrumbsColor,\n BreadcrumbSeparatorProps,\n BreadcrumbsSize,\n} from './types'\n\nexport type { BreadcrumbItemData } from './types'\n\ninterface BreadcrumbContextValue {\n color?: BreadcrumbsColor\n size?: BreadcrumbsSize\n classNames?: {\n list?: string\n item?: string\n link?: string\n separator?: string\n current?: string\n }\n}\n\nconst BreadcrumbContext = React.createContext<BreadcrumbContextValue>({})\n\nconst breadcrumbVariants = cva('', {\n variants: {\n size: {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nconst Breadcrumb = React.memo<BreadcrumbProps>(\n ({\n children,\n items,\n color = 'default',\n size = 'md',\n separator,\n className,\n classNames,\n }) => {\n const content = items?.length ? (\n <BreadcrumbList>\n {items.map((item, index) => {\n const isLast = index === items.length - 1\n return (\n <React.Fragment key={index}>\n <BreadcrumbItem>\n {item.ellipsis ? (\n <BreadcrumbEllipsis\n orientation={item.ellipsisOrientation || 'horizontal'}\n items={item.ellipsisItems || []}\n size={size}\n />\n ) : isLast ? (\n <BreadcrumbPage\n leftIcon={item.leftIcon}\n rightIcon={item.rightIcon}\n >\n {item.label}\n </BreadcrumbPage>\n ) : (\n <BreadcrumbLink\n href={item.href || ''}\n onClick={item.onClick}\n leftIcon={item.leftIcon}\n rightIcon={item.rightIcon}\n >\n {item.label}\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n {!isLast && (\n <BreadcrumbSeparator size={size}>\n {separator}\n </BreadcrumbSeparator>\n )}\n </React.Fragment>\n )\n })}\n </BreadcrumbList>\n ) : (\n children\n )\n\n return (\n <BreadcrumbContext.Provider value={{ color, size, classNames }}>\n <nav\n data-slot=\"root\"\n aria-label=\"breadcrumb\"\n className={cn(\n 'breadcrumbs_root',\n breadcrumbVariants({ size }),\n colorVars[color],\n 'text-slot',\n classNames?.root,\n className,\n )}\n >\n {content}\n </nav>\n </BreadcrumbContext.Provider>\n )\n },\n)\n\nBreadcrumb.displayName = 'Breadcrumb'\n\nexport const BreadcrumbList = React.memo<BreadcrumbListProps>(\n ({ children, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <ol\n className={cn(\n 'breadcrumbs_list',\n 'flex items-center gap-1.5',\n classNames?.list,\n className,\n )}\n >\n {children}\n </ol>\n )\n },\n)\n\nBreadcrumbList.displayName = 'BreadcrumbList'\n\nexport const BreadcrumbItem = React.memo<BreadcrumbItemProps>(\n ({ children, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <li\n className={cn(\n 'breadcrumbs_item',\n 'inline-flex items-center gap-1.5',\n classNames?.item,\n className,\n )}\n >\n {children}\n </li>\n )\n },\n)\n\nBreadcrumbItem.displayName = 'BreadcrumbItem'\n\nexport const BreadcrumbLink = React.memo<BreadcrumbLinkProps>(\n ({ children, href, onClick, leftIcon, rightIcon, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n e.preventDefault()\n onClick()\n }\n }\n\n const content = (\n <>\n {leftIcon && (\n <span className=\"inline-flex items-center\">{leftIcon}</span>\n )}\n {children}\n {rightIcon && (\n <span className=\"inline-flex items-center\">{rightIcon}</span>\n )}\n </>\n )\n\n const linkClasses = cn(\n 'breadcrumbs_link',\n 'inline-flex items-center gap-1.5 transition-colors hover:underline cursor-pointer',\n classNames?.link,\n className,\n )\n\n if (href) {\n return (\n <a\n href={href}\n onClick={handleClick}\n className={linkClasses}\n >\n {content}\n </a>\n )\n }\n\n if (onClick) {\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n className={linkClasses}\n >\n {content}\n </button>\n )\n }\n\n return (\n <span\n className={cn(\n 'breadcrumbs_link',\n 'inline-flex items-center gap-1.5',\n classNames?.link,\n className,\n )}\n >\n {content}\n </span>\n )\n },\n)\n\nBreadcrumbLink.displayName = 'BreadcrumbLink'\n\nexport const BreadcrumbPage = React.memo<BreadcrumbPageProps>(\n ({ children, leftIcon, rightIcon, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <span\n aria-current=\"page\"\n className={cn(\n 'breadcrumbs_current',\n 'inline-flex items-center gap-1.5 font-medium',\n classNames?.current,\n className,\n )}\n >\n {leftIcon && (\n <span className=\"inline-flex items-center\">{leftIcon}</span>\n )}\n {children}\n {rightIcon && (\n <span className=\"inline-flex items-center\">{rightIcon}</span>\n )}\n </span>\n )\n },\n)\n\nBreadcrumbPage.displayName = 'BreadcrumbPage'\n\nexport const BreadcrumbSeparator = React.memo<BreadcrumbSeparatorProps>(\n ({ children, className, size = 'md' }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n 'breadcrumbs_separator',\n 'text-text-secondary',\n classNames?.separator,\n className,\n )}\n >\n {children ?? <ChevronRight className={iconSizes[size]} />}\n </span>\n )\n },\n)\n\nBreadcrumbSeparator.displayName = 'BreadcrumbSeparator'\n\n/**\n * Validates URL to prevent open redirect vulnerabilities\n * Only allows relative URLs or same-origin URLs\n */\nconst isValidNavigationUrl = (href: string): boolean => {\n // Allow relative URLs starting with / or #\n if (href.startsWith('/') || href.startsWith('#') || href.startsWith('?')) {\n return true\n }\n\n // Block javascript: and other dangerous protocols\n const dangerousProtocols = ['javascript:', 'data:', 'vbscript:']\n const lowerHref = href.toLowerCase()\n if (dangerousProtocols.some(protocol => lowerHref.startsWith(protocol))) {\n return false\n }\n\n // For absolute URLs, verify same origin\n if (typeof window !== 'undefined') {\n try {\n const url = new URL(href, window.location.origin)\n return url.origin === window.location.origin\n } catch {\n // If URL parsing fails, allow it (likely a relative URL)\n return true\n }\n }\n\n // SSR fallback - allow relative-looking URLs\n return true\n}\n\nexport const BreadcrumbEllipsis = React.memo<BreadcrumbEllipsisProps>(\n ({ orientation = 'horizontal', items, children, className, size = 'md' }) => {\n const Icon = orientation === 'horizontal' ? MoreHorizontal : MoreVertical\n const isInteractive = !!(items?.length || children)\n\n const ellipsisButton = (\n <span\n {...(isInteractive && {\n role: 'button',\n 'aria-label': 'Show more breadcrumbs',\n tabIndex: 0,\n })}\n {...(!isInteractive && {\n 'aria-hidden': true,\n })}\n className={cn(\n 'flex items-center justify-center',\n isInteractive && 'cursor-pointer',\n className,\n )}\n >\n <Icon className={iconSizes[size]} />\n <span className=\"sr-only\">More</span>\n </span>\n )\n\n // If items or children are provided, wrap in Dropdown\n if (items || children) {\n const dropdownItems = (items || []).map((item) => ({\n label: item.label || '',\n value: item.label || '',\n onClick:\n item.onClick ||\n (() => {\n // Validate URL before navigation to prevent open redirect\n if (item.href && isValidNavigationUrl(item.href)) {\n window.location.href = item.href\n }\n }),\n }))\n\n return <Dropdown items={dropdownItems}>{ellipsisButton}</Dropdown>\n }\n\n return ellipsisButton\n },\n)\n\nBreadcrumbEllipsis.displayName = 'BreadcrumbEllipsis'\n\nexport type * from './types'\nexport default Breadcrumb\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/breadcrumbs/index.tsx"],"names":[],"mappings":"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","file":"chunk-AL2EEKUY.js","sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport React from 'react'\n\nimport { ChevronRight, MoreHorizontal, MoreVertical } from 'lucide-react'\n\nimport Dropdown from '../dropdown'\nimport { cn, iconSizes } from '../utils'\nimport { colorVars } from '../variants'\nimport type {\n BreadcrumbEllipsisProps,\n BreadcrumbItemProps,\n BreadcrumbLinkProps,\n BreadcrumbListProps,\n BreadcrumbPageProps,\n BreadcrumbProps,\n BreadcrumbsColor,\n BreadcrumbSeparatorProps,\n BreadcrumbsSize,\n} from './types'\n\nexport type { BreadcrumbItemData } from './types'\n\ninterface BreadcrumbContextValue {\n color?: BreadcrumbsColor\n size?: BreadcrumbsSize\n classNames?: {\n list?: string\n item?: string\n link?: string\n separator?: string\n current?: string\n }\n}\n\nconst BreadcrumbContext = React.createContext<BreadcrumbContextValue>({})\n\nconst breadcrumbVariants = cva('', {\n variants: {\n size: {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n})\n\nconst Breadcrumb = React.memo<BreadcrumbProps>(\n ({\n children,\n items,\n color = 'default',\n size = 'md',\n separator,\n className,\n classNames,\n }) => {\n const content = items?.length ? (\n <BreadcrumbList>\n {items.map((item, index) => {\n const isLast = index === items.length - 1\n return (\n <React.Fragment key={index}>\n <BreadcrumbItem>\n {item.ellipsis ? (\n <BreadcrumbEllipsis\n orientation={item.ellipsisOrientation || 'horizontal'}\n items={item.ellipsisItems || []}\n size={size}\n />\n ) : isLast ? (\n <BreadcrumbPage\n leftIcon={item.leftIcon}\n rightIcon={item.rightIcon}\n >\n {item.label}\n </BreadcrumbPage>\n ) : (\n <BreadcrumbLink\n href={item.href || ''}\n onClick={item.onClick}\n leftIcon={item.leftIcon}\n rightIcon={item.rightIcon}\n >\n {item.label}\n </BreadcrumbLink>\n )}\n </BreadcrumbItem>\n {!isLast && (\n <BreadcrumbSeparator size={size}>\n {separator}\n </BreadcrumbSeparator>\n )}\n </React.Fragment>\n )\n })}\n </BreadcrumbList>\n ) : (\n children\n )\n\n return (\n <BreadcrumbContext.Provider value={{ color, size, classNames }}>\n <nav\n data-slot=\"root\"\n aria-label=\"breadcrumb\"\n className={cn(\n 'breadcrumbs_root',\n breadcrumbVariants({ size }),\n colorVars[color],\n 'text-slot',\n classNames?.root,\n className,\n )}\n >\n {content}\n </nav>\n </BreadcrumbContext.Provider>\n )\n },\n)\n\nBreadcrumb.displayName = 'Breadcrumb'\n\nexport const BreadcrumbList = React.memo<BreadcrumbListProps>(\n ({ children, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <ol\n className={cn(\n 'breadcrumbs_list',\n 'flex items-center gap-1.5',\n classNames?.list,\n className,\n )}\n >\n {children}\n </ol>\n )\n },\n)\n\nBreadcrumbList.displayName = 'BreadcrumbList'\n\nexport const BreadcrumbItem = React.memo<BreadcrumbItemProps>(\n ({ children, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <li\n className={cn(\n 'breadcrumbs_item',\n 'inline-flex items-center gap-1.5',\n classNames?.item,\n className,\n )}\n >\n {children}\n </li>\n )\n },\n)\n\nBreadcrumbItem.displayName = 'BreadcrumbItem'\n\nexport const BreadcrumbLink = React.memo<BreadcrumbLinkProps>(\n ({ children, href, onClick, leftIcon, rightIcon, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n e.preventDefault()\n onClick()\n }\n }\n\n const content = (\n <>\n {leftIcon && (\n <span className=\"inline-flex items-center\">{leftIcon}</span>\n )}\n {children}\n {rightIcon && (\n <span className=\"inline-flex items-center\">{rightIcon}</span>\n )}\n </>\n )\n\n const linkClasses = cn(\n 'breadcrumbs_link',\n 'inline-flex items-center gap-1.5 transition-colors hover:underline cursor-pointer',\n classNames?.link,\n className,\n )\n\n if (href) {\n return (\n <a\n href={href}\n onClick={handleClick}\n className={linkClasses}\n >\n {content}\n </a>\n )\n }\n\n if (onClick) {\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n className={linkClasses}\n >\n {content}\n </button>\n )\n }\n\n return (\n <span\n className={cn(\n 'breadcrumbs_link',\n 'inline-flex items-center gap-1.5',\n classNames?.link,\n className,\n )}\n >\n {content}\n </span>\n )\n },\n)\n\nBreadcrumbLink.displayName = 'BreadcrumbLink'\n\nexport const BreadcrumbPage = React.memo<BreadcrumbPageProps>(\n ({ children, leftIcon, rightIcon, className }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <span\n aria-current=\"page\"\n className={cn(\n 'breadcrumbs_current',\n 'inline-flex items-center gap-1.5 font-medium',\n classNames?.current,\n className,\n )}\n >\n {leftIcon && (\n <span className=\"inline-flex items-center\">{leftIcon}</span>\n )}\n {children}\n {rightIcon && (\n <span className=\"inline-flex items-center\">{rightIcon}</span>\n )}\n </span>\n )\n },\n)\n\nBreadcrumbPage.displayName = 'BreadcrumbPage'\n\nexport const BreadcrumbSeparator = React.memo<BreadcrumbSeparatorProps>(\n ({ children, className, size = 'md' }) => {\n const { classNames } = React.useContext(BreadcrumbContext)\n\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n 'breadcrumbs_separator',\n 'text-text-secondary',\n classNames?.separator,\n className,\n )}\n >\n {children ?? <ChevronRight className={iconSizes[size]} />}\n </span>\n )\n },\n)\n\nBreadcrumbSeparator.displayName = 'BreadcrumbSeparator'\n\n/**\n * Validates URL to prevent open redirect vulnerabilities\n * Only allows relative URLs or same-origin URLs\n */\nconst isValidNavigationUrl = (href: string): boolean => {\n // Allow relative URLs starting with / or #\n if (href.startsWith('/') || href.startsWith('#') || href.startsWith('?')) {\n return true\n }\n\n // Block javascript: and other dangerous protocols\n const dangerousProtocols = ['javascript:', 'data:', 'vbscript:']\n const lowerHref = href.toLowerCase()\n if (dangerousProtocols.some(protocol => lowerHref.startsWith(protocol))) {\n return false\n }\n\n // For absolute URLs, verify same origin\n if (typeof window !== 'undefined') {\n try {\n const url = new URL(href, window.location.origin)\n return url.origin === window.location.origin\n } catch {\n // If URL parsing fails, allow it (likely a relative URL)\n return true\n }\n }\n\n // SSR fallback - allow relative-looking URLs\n return true\n}\n\nexport const BreadcrumbEllipsis = React.memo<BreadcrumbEllipsisProps>(\n ({ orientation = 'horizontal', items, children, className, size = 'md' }) => {\n const Icon = orientation === 'horizontal' ? MoreHorizontal : MoreVertical\n const isInteractive = !!(items?.length || children)\n\n const ellipsisButton = (\n <span\n {...(isInteractive && {\n role: 'button',\n 'aria-label': 'Show more breadcrumbs',\n tabIndex: 0,\n })}\n {...(!isInteractive && {\n 'aria-hidden': true,\n })}\n className={cn(\n 'flex items-center justify-center',\n isInteractive && 'cursor-pointer',\n className,\n )}\n >\n <Icon className={iconSizes[size]} />\n <span className=\"sr-only\">More</span>\n </span>\n )\n\n // If items or children are provided, wrap in Dropdown\n if (items || children) {\n const dropdownItems = (items || []).map((item) => ({\n label: item.label || '',\n value: item.label || '',\n onClick:\n item.onClick ||\n (() => {\n // Validate URL before navigation to prevent open redirect\n if (item.href && isValidNavigationUrl(item.href)) {\n window.location.href = item.href\n }\n }),\n }))\n\n return <Dropdown items={dropdownItems}>{ellipsisButton}</Dropdown>\n }\n\n return ellipsisButton\n },\n)\n\nBreadcrumbEllipsis.displayName = 'BreadcrumbEllipsis'\n\nexport type * from './types'\nexport default Breadcrumb\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { useMenuNavigation } from './chunk-NZHKNUGE.js';
|
|
2
1
|
import { Popover, PopoverTrigger, PopoverContent } from './chunk-ROQGBDET.js';
|
|
2
|
+
import { useMenuNavigation } from './chunk-NZHKNUGE.js';
|
|
3
3
|
import { cn } from './chunk-RAS6HUEI.js';
|
|
4
4
|
import React, { useState, useMemo, useCallback, useEffect } from 'react';
|
|
5
5
|
import { ChevronRight, Check, Circle } from 'lucide-react';
|
|
@@ -318,5 +318,5 @@ Menubar.displayName = "Menubar";
|
|
|
318
318
|
var menubar_default = Menubar;
|
|
319
319
|
|
|
320
320
|
export { menubar_default };
|
|
321
|
-
//# sourceMappingURL=chunk-
|
|
322
|
-
//# sourceMappingURL=chunk-
|
|
321
|
+
//# sourceMappingURL=chunk-JBNFVXH5.js.map
|
|
322
|
+
//# sourceMappingURL=chunk-JBNFVXH5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/menubar/index.tsx"],"names":[],"mappings":"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","file":"chunk-BS4PZPY6.js","sourcesContent":["'use client'\n\nimport React, { useState, useCallback, useEffect, useMemo } from 'react'\n\nimport { ChevronRight, Check, Circle } from 'lucide-react'\n\nimport { useMenuNavigation } from '../hooks/useMenuNavigation'\nimport { Popover, PopoverTrigger, PopoverContent } from '../popover'\nimport { cn } from '../utils'\nimport type { MenubarProps, MenubarItem } from './types'\n\ninterface MenuItemsProps {\n items: MenubarItem[]\n classNames?: MenubarProps['classNames']\n onItemClick: (item: MenubarItem) => void\n onClose: () => void\n}\n\nconst ITEM_CLASS = 'menubar_item relative flex items-center gap-2 px-3 py-1.5 text-sm cursor-pointer rounded-sm transition-colors mx-1'\n\nconst MenuItems = React.memo<MenuItemsProps>(({ items, classNames, onItemClick, onClose }) => {\n const [activeSubmenu, setActiveSubmenu] = useState<string | null>(null)\n\n const hasAnyIcon = useMemo(\n () => items.some((item) => !item.separator && item.type !== 'label' && (item.icon || item.type === 'checkbox' || item.type === 'radio')),\n [items],\n )\n\n const enabledIndices = useMemo(\n () =>\n items\n .map((item, i) => (!item.separator && item.type !== 'label' && !item.disabled) ? i : -1)\n .filter((i) => i !== -1),\n [items],\n )\n\n const onMenuSelect = useCallback(\n (index: number) => {\n const item = items[index]\n if (!item || (item.children && item.children.length > 0)) return\n onItemClick(item)\n },\n [items, onItemClick],\n )\n\n const { highlightedIndex, handleKeyDown, highlightFirst } = useMenuNavigation({\n enabledIndices,\n isOpen: true,\n onClose,\n onSelect: onMenuSelect,\n })\n\n // Highlight first item on mount\n useEffect(() => {\n highlightFirst()\n }, [highlightFirst])\n\n // Document-level keyboard listener (content is in a portal)\n useEffect(() => {\n const listener = (e: KeyboardEvent) => {\n handleKeyDown(e)\n e.stopImmediatePropagation()\n }\n document.addEventListener('keydown', listener)\n return () => document.removeEventListener('keydown', listener)\n }, [handleKeyDown])\n\n return (\n <>\n {items.map((item, idx) => {\n if (item.separator) {\n return (\n <div\n key={item.key || `separator-${idx}`}\n data-slot=\"separator\"\n className={cn('menubar_separator h-px bg-border my-1', classNames?.separator)}\n role=\"separator\"\n />\n )\n }\n\n if (item.type === 'label') {\n return (\n <div\n key={item.key}\n data-slot=\"label\"\n className={cn(\n 'menubar_label px-3 py-1.5 text-xs font-semibold text-text-secondary mx-1',\n classNames?.label,\n )}\n role=\"presentation\"\n >\n {item.label}\n </div>\n )\n }\n\n const isCheckboxOrRadio = item.type === 'checkbox' || item.type === 'radio'\n const hasChildren = item.children && item.children.length > 0\n const isFocused = highlightedIndex === idx\n\n if (hasChildren) {\n return (\n <Popover\n key={item.key}\n open={activeSubmenu === item.key}\n onOpenChange={(open) => setActiveSubmenu(open ? item.key : null)}\n >\n <PopoverTrigger asChild>\n <div\n data-slot=\"item\"\n className={cn(\n ITEM_CLASS,\n item.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'hover:bg-surface focus-visible:bg-surface focus-visible:outline-none',\n isFocused && !item.disabled && 'bg-surface',\n classNames?.item,\n )}\n role=\"menuitem\"\n aria-disabled={item.disabled}\n aria-haspopup=\"menu\"\n tabIndex={item.disabled ? -1 : 0}\n onMouseEnter={() => !item.disabled && setActiveSubmenu(item.key)}\n >\n {item.icon ? <span className=\"w-4 h-4 shrink-0\">{item.icon}</span> : hasAnyIcon && <span className=\"w-4 h-4 shrink-0\" />}\n <span className=\"flex-1\">{item.label}</span>\n <ChevronRight className=\"w-4 h-4 ml-2 shrink-0\" />\n </div>\n </PopoverTrigger>\n <PopoverContent\n side=\"right\"\n align=\"start\"\n sideOffset={4}\n data-slot=\"submenu\"\n className={cn(\n 'menubar_submenu min-w-[200px] w-auto p-1 rounded-md',\n classNames?.submenu,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <MenuItems items={item.children!} classNames={classNames} onItemClick={onItemClick} onClose={onClose} />\n </PopoverContent>\n </Popover>\n )\n }\n\n return (\n <div\n key={item.key}\n data-slot=\"item\"\n className={cn(\n ITEM_CLASS,\n item.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'hover:bg-surface focus-visible:bg-surface focus-visible:outline-none',\n isFocused && !item.disabled && 'bg-surface',\n isCheckboxOrRadio && classNames?.checkboxItem,\n item.type === 'radio' && classNames?.radioItem,\n classNames?.item,\n )}\n role={\n item.type === 'checkbox'\n ? 'menuitemcheckbox'\n : item.type === 'radio'\n ? 'menuitemradio'\n : 'menuitem'\n }\n aria-disabled={item.disabled}\n aria-checked={isCheckboxOrRadio ? item.checked : undefined}\n tabIndex={item.disabled ? -1 : 0}\n onClick={() => !item.disabled && onItemClick(item)}\n >\n {isCheckboxOrRadio && (\n <span className=\"w-4 h-4 shrink-0\">\n {item.checked && (\n <>\n {item.type === 'checkbox' && <Check className=\"w-4 h-4\" />}\n {item.type === 'radio' && <Circle className=\"w-4 h-4 fill-current\" />}\n </>\n )}\n </span>\n )}\n {!isCheckboxOrRadio && (\n item.icon\n ? <span className=\"w-4 h-4 shrink-0\">{item.icon}</span>\n : hasAnyIcon && <span className=\"w-4 h-4 shrink-0\" />\n )}\n <span className=\"flex-1\">{item.label}</span>\n {item.shortcut && (\n <span\n data-slot=\"shortcut\"\n className={cn(\n 'menubar_shortcut text-xs text-text-secondary ml-auto',\n classNames?.shortcut,\n )}\n >\n {item.shortcut}\n </span>\n )}\n </div>\n )\n })}\n </>\n )\n})\n\nMenuItems.displayName = 'MenuItems'\n\nconst Menubar = React.memo<MenubarProps>(({ menus, className, classNames, ref }) => {\n const [activeMenu, setActiveMenu] = useState<string | null>(null)\n const [hoverMode, setHoverMode] = useState(false)\n\n const handleMenuClick = useCallback((menuKey: string, disabled?: boolean) => {\n if (disabled) return\n setActiveMenu((prev) => (prev === menuKey ? null : menuKey))\n setHoverMode(true)\n }, [])\n\n const handleMenuHover = useCallback(\n (menuKey: string, disabled?: boolean) => {\n if (disabled) return\n if (hoverMode && activeMenu !== null) {\n setActiveMenu(menuKey)\n }\n },\n [hoverMode, activeMenu],\n )\n\n const handleClose = useCallback(() => {\n setActiveMenu(null)\n setHoverMode(false)\n }, [])\n\n const handleItemClick = useCallback(\n (item: MenubarItem) => {\n if (item.type === 'checkbox') {\n item.onCheckedChange?.(!item.checked)\n } else if (item.type === 'radio') {\n item.onCheckedChange?.(true)\n } else {\n item.onClick?.()\n }\n if (item.type !== 'checkbox' && item.type !== 'radio') {\n handleClose()\n }\n },\n [handleClose],\n )\n\n // Top-level menu switching: ArrowLeft/Right and Escape\n useEffect(() => {\n if (!activeMenu) return\n\n const handler = (e: KeyboardEvent) => {\n const currentIndex = menus.findIndex((m) => m.key === activeMenu)\n\n if (e.key === 'ArrowRight') {\n e.preventDefault()\n e.stopImmediatePropagation()\n let next = (currentIndex + 1) % menus.length\n let attempts = 0\n while (attempts < menus.length && menus[next]?.disabled) {\n next = (next + 1) % menus.length\n attempts++\n }\n const nextMenu = menus[next]\n if (attempts < menus.length && nextMenu && !nextMenu.disabled) {\n setActiveMenu(nextMenu.key)\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault()\n e.stopImmediatePropagation()\n let prev = currentIndex - 1 < 0 ? menus.length - 1 : currentIndex - 1\n let attempts = 0\n while (attempts < menus.length && menus[prev]?.disabled) {\n prev = prev - 1 < 0 ? menus.length - 1 : prev - 1\n attempts++\n }\n const prevMenu = menus[prev]\n if (attempts < menus.length && prevMenu && !prevMenu.disabled) {\n setActiveMenu(prevMenu.key)\n }\n }\n }\n\n document.addEventListener('keydown', handler)\n return () => document.removeEventListener('keydown', handler)\n }, [activeMenu, menus])\n\n return (\n <div\n ref={ref}\n data-slot=\"root\"\n className={cn(\n 'menubar_root flex items-center gap-1 px-2 py-1 bg-background border-b border-border',\n className,\n classNames?.root,\n )}\n role=\"menubar\"\n >\n {menus.map((menu) => (\n <Popover\n key={menu.key}\n open={activeMenu === menu.key}\n onOpenChange={(open) => {\n if (open) {\n setActiveMenu(menu.key)\n setHoverMode(true)\n } else {\n handleClose()\n }\n }}\n >\n <PopoverTrigger asChild>\n <button\n data-slot=\"trigger\"\n className={cn(\n 'menubar_trigger px-3 py-1.5 text-sm rounded-sm transition-colors',\n menu.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'hover:bg-surface focus-visible:bg-surface focus-visible:outline-none',\n activeMenu === menu.key && 'bg-surface',\n classNames?.trigger,\n )}\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={activeMenu === menu.key}\n aria-disabled={menu.disabled}\n onClick={() => handleMenuClick(menu.key, menu.disabled)}\n onMouseEnter={() => handleMenuHover(menu.key, menu.disabled)}\n >\n {menu.label}\n </button>\n </PopoverTrigger>\n <PopoverContent\n side=\"bottom\"\n align=\"start\"\n sideOffset={2}\n data-slot=\"content\"\n className={cn(\n 'menubar_content min-w-[200px] w-auto p-1 rounded-md',\n classNames?.content,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n onPointerDownOutside={(e) => {\n const target = e.target as HTMLElement\n if (target.closest('[data-slot=\"root\"]')) {\n e.preventDefault()\n }\n }}\n >\n <MenuItems\n items={menu.items}\n classNames={classNames}\n onItemClick={handleItemClick}\n onClose={handleClose}\n />\n </PopoverContent>\n </Popover>\n ))}\n </div>\n )\n})\n\nMenubar.displayName = 'Menubar'\n\nexport type * from './types'\nexport default Menubar\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/menubar/index.tsx"],"names":[],"mappings":"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","file":"chunk-JBNFVXH5.js","sourcesContent":["'use client'\n\nimport React, { useState, useCallback, useEffect, useMemo } from 'react'\n\nimport { ChevronRight, Check, Circle } from 'lucide-react'\n\nimport { useMenuNavigation } from '../hooks/useMenuNavigation'\nimport { Popover, PopoverTrigger, PopoverContent } from '../popover'\nimport { cn } from '../utils'\nimport type { MenubarProps, MenubarItem } from './types'\n\ninterface MenuItemsProps {\n items: MenubarItem[]\n classNames?: MenubarProps['classNames']\n onItemClick: (item: MenubarItem) => void\n onClose: () => void\n}\n\nconst ITEM_CLASS = 'menubar_item relative flex items-center gap-2 px-3 py-1.5 text-sm cursor-pointer rounded-sm transition-colors mx-1'\n\nconst MenuItems = React.memo<MenuItemsProps>(({ items, classNames, onItemClick, onClose }) => {\n const [activeSubmenu, setActiveSubmenu] = useState<string | null>(null)\n\n const hasAnyIcon = useMemo(\n () => items.some((item) => !item.separator && item.type !== 'label' && (item.icon || item.type === 'checkbox' || item.type === 'radio')),\n [items],\n )\n\n const enabledIndices = useMemo(\n () =>\n items\n .map((item, i) => (!item.separator && item.type !== 'label' && !item.disabled) ? i : -1)\n .filter((i) => i !== -1),\n [items],\n )\n\n const onMenuSelect = useCallback(\n (index: number) => {\n const item = items[index]\n if (!item || (item.children && item.children.length > 0)) return\n onItemClick(item)\n },\n [items, onItemClick],\n )\n\n const { highlightedIndex, handleKeyDown, highlightFirst } = useMenuNavigation({\n enabledIndices,\n isOpen: true,\n onClose,\n onSelect: onMenuSelect,\n })\n\n // Highlight first item on mount\n useEffect(() => {\n highlightFirst()\n }, [highlightFirst])\n\n // Document-level keyboard listener (content is in a portal)\n useEffect(() => {\n const listener = (e: KeyboardEvent) => {\n handleKeyDown(e)\n e.stopImmediatePropagation()\n }\n document.addEventListener('keydown', listener)\n return () => document.removeEventListener('keydown', listener)\n }, [handleKeyDown])\n\n return (\n <>\n {items.map((item, idx) => {\n if (item.separator) {\n return (\n <div\n key={item.key || `separator-${idx}`}\n data-slot=\"separator\"\n className={cn('menubar_separator h-px bg-border my-1', classNames?.separator)}\n role=\"separator\"\n />\n )\n }\n\n if (item.type === 'label') {\n return (\n <div\n key={item.key}\n data-slot=\"label\"\n className={cn(\n 'menubar_label px-3 py-1.5 text-xs font-semibold text-text-secondary mx-1',\n classNames?.label,\n )}\n role=\"presentation\"\n >\n {item.label}\n </div>\n )\n }\n\n const isCheckboxOrRadio = item.type === 'checkbox' || item.type === 'radio'\n const hasChildren = item.children && item.children.length > 0\n const isFocused = highlightedIndex === idx\n\n if (hasChildren) {\n return (\n <Popover\n key={item.key}\n open={activeSubmenu === item.key}\n onOpenChange={(open) => setActiveSubmenu(open ? item.key : null)}\n >\n <PopoverTrigger asChild>\n <div\n data-slot=\"item\"\n className={cn(\n ITEM_CLASS,\n item.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'hover:bg-surface focus-visible:bg-surface focus-visible:outline-none',\n isFocused && !item.disabled && 'bg-surface',\n classNames?.item,\n )}\n role=\"menuitem\"\n aria-disabled={item.disabled}\n aria-haspopup=\"menu\"\n tabIndex={item.disabled ? -1 : 0}\n onMouseEnter={() => !item.disabled && setActiveSubmenu(item.key)}\n >\n {item.icon ? <span className=\"w-4 h-4 shrink-0\">{item.icon}</span> : hasAnyIcon && <span className=\"w-4 h-4 shrink-0\" />}\n <span className=\"flex-1\">{item.label}</span>\n <ChevronRight className=\"w-4 h-4 ml-2 shrink-0\" />\n </div>\n </PopoverTrigger>\n <PopoverContent\n side=\"right\"\n align=\"start\"\n sideOffset={4}\n data-slot=\"submenu\"\n className={cn(\n 'menubar_submenu min-w-[200px] w-auto p-1 rounded-md',\n classNames?.submenu,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <MenuItems items={item.children!} classNames={classNames} onItemClick={onItemClick} onClose={onClose} />\n </PopoverContent>\n </Popover>\n )\n }\n\n return (\n <div\n key={item.key}\n data-slot=\"item\"\n className={cn(\n ITEM_CLASS,\n item.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'hover:bg-surface focus-visible:bg-surface focus-visible:outline-none',\n isFocused && !item.disabled && 'bg-surface',\n isCheckboxOrRadio && classNames?.checkboxItem,\n item.type === 'radio' && classNames?.radioItem,\n classNames?.item,\n )}\n role={\n item.type === 'checkbox'\n ? 'menuitemcheckbox'\n : item.type === 'radio'\n ? 'menuitemradio'\n : 'menuitem'\n }\n aria-disabled={item.disabled}\n aria-checked={isCheckboxOrRadio ? item.checked : undefined}\n tabIndex={item.disabled ? -1 : 0}\n onClick={() => !item.disabled && onItemClick(item)}\n >\n {isCheckboxOrRadio && (\n <span className=\"w-4 h-4 shrink-0\">\n {item.checked && (\n <>\n {item.type === 'checkbox' && <Check className=\"w-4 h-4\" />}\n {item.type === 'radio' && <Circle className=\"w-4 h-4 fill-current\" />}\n </>\n )}\n </span>\n )}\n {!isCheckboxOrRadio && (\n item.icon\n ? <span className=\"w-4 h-4 shrink-0\">{item.icon}</span>\n : hasAnyIcon && <span className=\"w-4 h-4 shrink-0\" />\n )}\n <span className=\"flex-1\">{item.label}</span>\n {item.shortcut && (\n <span\n data-slot=\"shortcut\"\n className={cn(\n 'menubar_shortcut text-xs text-text-secondary ml-auto',\n classNames?.shortcut,\n )}\n >\n {item.shortcut}\n </span>\n )}\n </div>\n )\n })}\n </>\n )\n})\n\nMenuItems.displayName = 'MenuItems'\n\nconst Menubar = React.memo<MenubarProps>(({ menus, className, classNames, ref }) => {\n const [activeMenu, setActiveMenu] = useState<string | null>(null)\n const [hoverMode, setHoverMode] = useState(false)\n\n const handleMenuClick = useCallback((menuKey: string, disabled?: boolean) => {\n if (disabled) return\n setActiveMenu((prev) => (prev === menuKey ? null : menuKey))\n setHoverMode(true)\n }, [])\n\n const handleMenuHover = useCallback(\n (menuKey: string, disabled?: boolean) => {\n if (disabled) return\n if (hoverMode && activeMenu !== null) {\n setActiveMenu(menuKey)\n }\n },\n [hoverMode, activeMenu],\n )\n\n const handleClose = useCallback(() => {\n setActiveMenu(null)\n setHoverMode(false)\n }, [])\n\n const handleItemClick = useCallback(\n (item: MenubarItem) => {\n if (item.type === 'checkbox') {\n item.onCheckedChange?.(!item.checked)\n } else if (item.type === 'radio') {\n item.onCheckedChange?.(true)\n } else {\n item.onClick?.()\n }\n if (item.type !== 'checkbox' && item.type !== 'radio') {\n handleClose()\n }\n },\n [handleClose],\n )\n\n // Top-level menu switching: ArrowLeft/Right and Escape\n useEffect(() => {\n if (!activeMenu) return\n\n const handler = (e: KeyboardEvent) => {\n const currentIndex = menus.findIndex((m) => m.key === activeMenu)\n\n if (e.key === 'ArrowRight') {\n e.preventDefault()\n e.stopImmediatePropagation()\n let next = (currentIndex + 1) % menus.length\n let attempts = 0\n while (attempts < menus.length && menus[next]?.disabled) {\n next = (next + 1) % menus.length\n attempts++\n }\n const nextMenu = menus[next]\n if (attempts < menus.length && nextMenu && !nextMenu.disabled) {\n setActiveMenu(nextMenu.key)\n }\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault()\n e.stopImmediatePropagation()\n let prev = currentIndex - 1 < 0 ? menus.length - 1 : currentIndex - 1\n let attempts = 0\n while (attempts < menus.length && menus[prev]?.disabled) {\n prev = prev - 1 < 0 ? menus.length - 1 : prev - 1\n attempts++\n }\n const prevMenu = menus[prev]\n if (attempts < menus.length && prevMenu && !prevMenu.disabled) {\n setActiveMenu(prevMenu.key)\n }\n }\n }\n\n document.addEventListener('keydown', handler)\n return () => document.removeEventListener('keydown', handler)\n }, [activeMenu, menus])\n\n return (\n <div\n ref={ref}\n data-slot=\"root\"\n className={cn(\n 'menubar_root flex items-center gap-1 px-2 py-1 bg-background border-b border-border',\n className,\n classNames?.root,\n )}\n role=\"menubar\"\n >\n {menus.map((menu) => (\n <Popover\n key={menu.key}\n open={activeMenu === menu.key}\n onOpenChange={(open) => {\n if (open) {\n setActiveMenu(menu.key)\n setHoverMode(true)\n } else {\n handleClose()\n }\n }}\n >\n <PopoverTrigger asChild>\n <button\n data-slot=\"trigger\"\n className={cn(\n 'menubar_trigger px-3 py-1.5 text-sm rounded-sm transition-colors',\n menu.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'hover:bg-surface focus-visible:bg-surface focus-visible:outline-none',\n activeMenu === menu.key && 'bg-surface',\n classNames?.trigger,\n )}\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={activeMenu === menu.key}\n aria-disabled={menu.disabled}\n onClick={() => handleMenuClick(menu.key, menu.disabled)}\n onMouseEnter={() => handleMenuHover(menu.key, menu.disabled)}\n >\n {menu.label}\n </button>\n </PopoverTrigger>\n <PopoverContent\n side=\"bottom\"\n align=\"start\"\n sideOffset={2}\n data-slot=\"content\"\n className={cn(\n 'menubar_content min-w-[200px] w-auto p-1 rounded-md',\n classNames?.content,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n onPointerDownOutside={(e) => {\n const target = e.target as HTMLElement\n if (target.closest('[data-slot=\"root\"]')) {\n e.preventDefault()\n }\n }}\n >\n <MenuItems\n items={menu.items}\n classNames={classNames}\n onItemClick={handleItemClick}\n onClose={handleClose}\n />\n </PopoverContent>\n </Popover>\n ))}\n </div>\n )\n})\n\nMenubar.displayName = 'Menubar'\n\nexport type * from './types'\nexport default Menubar\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { useMenuNavigation } from './chunk-NZHKNUGE.js';
|
|
2
1
|
import { Popover, PopoverTrigger, PopoverContent } from './chunk-ROQGBDET.js';
|
|
2
|
+
import { useMenuNavigation } from './chunk-NZHKNUGE.js';
|
|
3
3
|
import { useRipple, RippleContainer } from './chunk-4TEZWGX7.js';
|
|
4
4
|
import { colorVars } from './chunk-G6QIIWKU.js';
|
|
5
5
|
import { cn } from './chunk-RAS6HUEI.js';
|
|
@@ -270,5 +270,5 @@ Dropdown.displayName = "Dropdown";
|
|
|
270
270
|
var dropdown_default = Dropdown;
|
|
271
271
|
|
|
272
272
|
export { dropdown_default };
|
|
273
|
-
//# sourceMappingURL=chunk-
|
|
274
|
-
//# sourceMappingURL=chunk-
|
|
273
|
+
//# sourceMappingURL=chunk-OTNKP5CD.js.map
|
|
274
|
+
//# sourceMappingURL=chunk-OTNKP5CD.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dropdown/index.tsx"],"names":[],"mappings":"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","file":"chunk-GOBUFGGJ.js","sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport React, {\n useCallback,\n useRef,\n useId,\n useState,\n useEffect,\n useMemo,\n} from \"react\";\n\nimport { useRipple, RippleContainer } from \"../hooks/useRipple\";\nimport { useMenuNavigation } from \"../hooks/useMenuNavigation\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { cn } from \"../utils\";\nimport { colorVars } from \"../variants\";\nimport type { DropdownProps } from \"./types\";\n\nconst dropdownItemVariants = cva(\n \"cursor-pointer select-none text-text-primary transition-colors flex items-center gap-2 rounded-sm outline-none\",\n {\n variants: {\n size: {\n xs: \"px-2 py-1 text-xs\",\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-5 py-2.5 text-lg\",\n },\n disabled: {\n true: \"opacity-50 cursor-not-allowed\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"md\",\n disabled: false,\n },\n },\n);\n\nconst DropdownItemDiv: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n children: React.ReactNode;\n disabled?: boolean;\n ref?: React.Ref<HTMLDivElement>;\n}> = ({\n children,\n disabled,\n className,\n onKeyDown: externalOnKeyDown,\n ref,\n ...props\n}) => {\n const {\n ripples,\n onPointerDown,\n onKeyDown: rippleOnKeyDown,\n onAnimationEnd,\n } = useRipple(!disabled);\n return (\n <div\n ref={ref}\n className={cn(className, \"relative overflow-hidden\")}\n onPointerDown={onPointerDown}\n onKeyDown={(e) => {\n rippleOnKeyDown(e);\n externalOnKeyDown?.(e);\n }}\n {...props}\n >\n {children}\n <RippleContainer ripples={ripples} onAnimationEnd={onAnimationEnd} />\n </div>\n );\n};\n\nconst Dropdown = React.memo<DropdownProps>(\n ({\n children,\n items,\n render,\n color = \"default\",\n size = \"md\",\n position = \"left\",\n maxHeight = 300,\n disabled = false,\n fullWidth = false,\n hover = false,\n className,\n classNames,\n onItemClick,\n ref,\n }) => {\n const [isOpen, setIsOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n const uniqueId = useId();\n const menuId = `dropdown-menu-${uniqueId}`;\n const triggerId = `dropdown-trigger-${uniqueId}`;\n\n const enabledIndices = useMemo(\n () =>\n items\n ?.map((item, i) => (!item.disabled ? i : -1))\n .filter((i) => i !== -1) || [],\n [items],\n );\n\n const handleItemClick = useCallback(\n (item: NonNullable<typeof items>[0]) => {\n if (!item.disabled) {\n item.onClick?.();\n if (item.value !== undefined) {\n onItemClick?.(item.value);\n }\n setIsOpen(false);\n }\n },\n [onItemClick],\n );\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const handleOpen = useCallback(() => {\n if (!disabled) {\n setIsOpen(true);\n }\n }, [disabled]);\n\n const handleToggle = useCallback(() => {\n if (!disabled) {\n setIsOpen((prev) => !prev);\n }\n }, [disabled]);\n\n const onMenuSelect = useCallback(\n (index: number) => {\n if (items?.[index]) handleItemClick(items[index]);\n },\n [items, handleItemClick],\n );\n\n const {\n highlightedIndex,\n setHighlightedIndex,\n handleKeyDown,\n } = useMenuNavigation({\n enabledIndices,\n isOpen,\n onClose: handleClose,\n onSelect: onMenuSelect,\n onOpen: handleOpen,\n });\n\n // Scroll highlighted item into view\n useEffect(() => {\n if (highlightedIndex >= 0 && itemRefs.current[highlightedIndex]) {\n itemRefs.current[highlightedIndex]?.scrollIntoView({\n block: \"nearest\",\n });\n }\n }, [highlightedIndex]);\n\n const wrappedKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled || !items?.length) return;\n handleKeyDown(e);\n },\n [disabled, items, handleKeyDown],\n );\n\n return (\n <div\n ref={ref}\n data-slot=\"dropdown\"\n className={cn(\n \"dropdown_root relative\",\n fullWidth ? \"w-full\" : \"inline-block\",\n className,\n classNames?.root,\n )}\n onMouseEnter={hover ? handleOpen : undefined}\n onMouseLeave={hover ? handleClose : undefined}\n >\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild>\n <div\n id={triggerId}\n data-slot=\"dropdown-trigger\"\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? menuId : undefined}\n aria-disabled={disabled}\n onClick={hover ? undefined : handleToggle}\n onKeyDown={wrappedKeyDown}\n className={cn(\n \"dropdown_trigger flex outline-none\",\n !hover && \"cursor-pointer\",\n fullWidth && \"w-full\",\n disabled && \"opacity-50 cursor-not-allowed\",\n classNames?.trigger,\n )}\n >\n {children}\n </div>\n </PopoverTrigger>\n\n <PopoverContent\n className=\"p-0 min-w-[140px]\"\n align={position === \"left\" ? \"start\" : \"end\"}\n sideOffset={4}\n color={color}\n style={{ maxHeight }}\n onOpenAutoFocus={(e: Event) => e.preventDefault()}\n >\n <div\n ref={menuRef}\n id={menuId}\n data-slot=\"dropdown-menu\"\n role=\"menu\"\n aria-labelledby={triggerId}\n className={cn(\"dropdown_menu overflow-auto\", colorVars[color], classNames?.menu)}\n style={{ maxHeight }}\n onKeyDown={wrappedKeyDown}\n >\n {render\n ? render({ close: handleClose })\n : items?.map((item, idx) => (\n <DropdownItemDiv\n key={`${item.value}-${idx}`}\n ref={(el: HTMLDivElement | null) => {\n itemRefs.current[idx] = el;\n }}\n data-slot=\"dropdown-item\"\n role=\"menuitem\"\n tabIndex={item.disabled ? -1 : 0}\n aria-disabled={item.disabled}\n disabled={!!item.disabled}\n className={cn(\n \"dropdown_item\",\n dropdownItemVariants({\n size,\n disabled: !!item.disabled,\n }),\n !item.disabled && 'hover:bg-slot-10 hover:text-slot focus-visible:bg-slot-10 focus-visible:text-slot',\n highlightedIndex === idx &&\n !item.disabled &&\n 'bg-slot-10 text-slot',\n classNames?.item,\n )}\n onClick={() => handleItemClick(item)}\n onMouseEnter={() => !item.disabled && setHighlightedIndex(idx)}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleItemClick(item);\n }\n }}\n >\n {item.icon && (\n <span\n data-slot=\"dropdown-item-icon\"\n className={cn(\n \"dropdown_itemIcon shrink-0\",\n classNames?.itemIcon,\n )}\n aria-hidden=\"true\"\n >\n {item.icon}\n </span>\n )}\n <span\n data-slot=\"dropdown-item-label\"\n className={cn(\n \"dropdown_itemLabel flex-1\",\n classNames?.itemLabel,\n )}\n >\n {item.label}\n </span>\n </DropdownItemDiv>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n </div>\n );\n },\n);\n\nDropdown.displayName = \"Dropdown\";\n\nexport type * from \"./types\";\nexport default Dropdown;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/dropdown/index.tsx"],"names":[],"mappings":"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","file":"chunk-OTNKP5CD.js","sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport React, {\n useCallback,\n useRef,\n useId,\n useState,\n useEffect,\n useMemo,\n} from \"react\";\n\nimport { useRipple, RippleContainer } from \"../hooks/useRipple\";\nimport { useMenuNavigation } from \"../hooks/useMenuNavigation\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { cn } from \"../utils\";\nimport { colorVars } from \"../variants\";\nimport type { DropdownProps } from \"./types\";\n\nconst dropdownItemVariants = cva(\n \"cursor-pointer select-none text-text-primary transition-colors flex items-center gap-2 rounded-sm outline-none\",\n {\n variants: {\n size: {\n xs: \"px-2 py-1 text-xs\",\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-base\",\n lg: \"px-5 py-2.5 text-lg\",\n },\n disabled: {\n true: \"opacity-50 cursor-not-allowed\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"md\",\n disabled: false,\n },\n },\n);\n\nconst DropdownItemDiv: React.FC<React.HTMLAttributes<HTMLDivElement> & {\n children: React.ReactNode;\n disabled?: boolean;\n ref?: React.Ref<HTMLDivElement>;\n}> = ({\n children,\n disabled,\n className,\n onKeyDown: externalOnKeyDown,\n ref,\n ...props\n}) => {\n const {\n ripples,\n onPointerDown,\n onKeyDown: rippleOnKeyDown,\n onAnimationEnd,\n } = useRipple(!disabled);\n return (\n <div\n ref={ref}\n className={cn(className, \"relative overflow-hidden\")}\n onPointerDown={onPointerDown}\n onKeyDown={(e) => {\n rippleOnKeyDown(e);\n externalOnKeyDown?.(e);\n }}\n {...props}\n >\n {children}\n <RippleContainer ripples={ripples} onAnimationEnd={onAnimationEnd} />\n </div>\n );\n};\n\nconst Dropdown = React.memo<DropdownProps>(\n ({\n children,\n items,\n render,\n color = \"default\",\n size = \"md\",\n position = \"left\",\n maxHeight = 300,\n disabled = false,\n fullWidth = false,\n hover = false,\n className,\n classNames,\n onItemClick,\n ref,\n }) => {\n const [isOpen, setIsOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n const uniqueId = useId();\n const menuId = `dropdown-menu-${uniqueId}`;\n const triggerId = `dropdown-trigger-${uniqueId}`;\n\n const enabledIndices = useMemo(\n () =>\n items\n ?.map((item, i) => (!item.disabled ? i : -1))\n .filter((i) => i !== -1) || [],\n [items],\n );\n\n const handleItemClick = useCallback(\n (item: NonNullable<typeof items>[0]) => {\n if (!item.disabled) {\n item.onClick?.();\n if (item.value !== undefined) {\n onItemClick?.(item.value);\n }\n setIsOpen(false);\n }\n },\n [onItemClick],\n );\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const handleOpen = useCallback(() => {\n if (!disabled) {\n setIsOpen(true);\n }\n }, [disabled]);\n\n const handleToggle = useCallback(() => {\n if (!disabled) {\n setIsOpen((prev) => !prev);\n }\n }, [disabled]);\n\n const onMenuSelect = useCallback(\n (index: number) => {\n if (items?.[index]) handleItemClick(items[index]);\n },\n [items, handleItemClick],\n );\n\n const {\n highlightedIndex,\n setHighlightedIndex,\n handleKeyDown,\n } = useMenuNavigation({\n enabledIndices,\n isOpen,\n onClose: handleClose,\n onSelect: onMenuSelect,\n onOpen: handleOpen,\n });\n\n // Scroll highlighted item into view\n useEffect(() => {\n if (highlightedIndex >= 0 && itemRefs.current[highlightedIndex]) {\n itemRefs.current[highlightedIndex]?.scrollIntoView({\n block: \"nearest\",\n });\n }\n }, [highlightedIndex]);\n\n const wrappedKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled || !items?.length) return;\n handleKeyDown(e);\n },\n [disabled, items, handleKeyDown],\n );\n\n return (\n <div\n ref={ref}\n data-slot=\"dropdown\"\n className={cn(\n \"dropdown_root relative\",\n fullWidth ? \"w-full\" : \"inline-block\",\n className,\n classNames?.root,\n )}\n onMouseEnter={hover ? handleOpen : undefined}\n onMouseLeave={hover ? handleClose : undefined}\n >\n <Popover open={isOpen} onOpenChange={setIsOpen}>\n <PopoverTrigger asChild>\n <div\n id={triggerId}\n data-slot=\"dropdown-trigger\"\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? menuId : undefined}\n aria-disabled={disabled}\n onClick={hover ? undefined : handleToggle}\n onKeyDown={wrappedKeyDown}\n className={cn(\n \"dropdown_trigger flex outline-none\",\n !hover && \"cursor-pointer\",\n fullWidth && \"w-full\",\n disabled && \"opacity-50 cursor-not-allowed\",\n classNames?.trigger,\n )}\n >\n {children}\n </div>\n </PopoverTrigger>\n\n <PopoverContent\n className=\"p-0 min-w-[140px]\"\n align={position === \"left\" ? \"start\" : \"end\"}\n sideOffset={4}\n color={color}\n style={{ maxHeight }}\n onOpenAutoFocus={(e: Event) => e.preventDefault()}\n >\n <div\n ref={menuRef}\n id={menuId}\n data-slot=\"dropdown-menu\"\n role=\"menu\"\n aria-labelledby={triggerId}\n className={cn(\"dropdown_menu overflow-auto\", colorVars[color], classNames?.menu)}\n style={{ maxHeight }}\n onKeyDown={wrappedKeyDown}\n >\n {render\n ? render({ close: handleClose })\n : items?.map((item, idx) => (\n <DropdownItemDiv\n key={`${item.value}-${idx}`}\n ref={(el: HTMLDivElement | null) => {\n itemRefs.current[idx] = el;\n }}\n data-slot=\"dropdown-item\"\n role=\"menuitem\"\n tabIndex={item.disabled ? -1 : 0}\n aria-disabled={item.disabled}\n disabled={!!item.disabled}\n className={cn(\n \"dropdown_item\",\n dropdownItemVariants({\n size,\n disabled: !!item.disabled,\n }),\n !item.disabled && 'hover:bg-slot-10 hover:text-slot focus-visible:bg-slot-10 focus-visible:text-slot',\n highlightedIndex === idx &&\n !item.disabled &&\n 'bg-slot-10 text-slot',\n classNames?.item,\n )}\n onClick={() => handleItemClick(item)}\n onMouseEnter={() => !item.disabled && setHighlightedIndex(idx)}\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleItemClick(item);\n }\n }}\n >\n {item.icon && (\n <span\n data-slot=\"dropdown-item-icon\"\n className={cn(\n \"dropdown_itemIcon shrink-0\",\n classNames?.itemIcon,\n )}\n aria-hidden=\"true\"\n >\n {item.icon}\n </span>\n )}\n <span\n data-slot=\"dropdown-item-label\"\n className={cn(\n \"dropdown_itemLabel flex-1\",\n classNames?.itemLabel,\n )}\n >\n {item.label}\n </span>\n </DropdownItemDiv>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n </div>\n );\n },\n);\n\nDropdown.displayName = \"Dropdown\";\n\nexport type * from \"./types\";\nexport default Dropdown;\n"]}
|
package/dist/dropdown/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { dropdown_default as default } from '../chunk-
|
|
2
|
-
import '../chunk-NZHKNUGE.js';
|
|
1
|
+
export { dropdown_default as default } from '../chunk-OTNKP5CD.js';
|
|
3
2
|
import '../chunk-ROQGBDET.js';
|
|
3
|
+
import '../chunk-NZHKNUGE.js';
|
|
4
4
|
import '../chunk-4TEZWGX7.js';
|
|
5
5
|
import '../chunk-G6QIIWKU.js';
|
|
6
6
|
import '../chunk-RAS6HUEI.js';
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { upload_default as Upload } from './chunk-CUXQZRDI.js';
|
|
2
|
+
export { timeline_default as Timeline } from './chunk-JIXINKUJ.js';
|
|
2
3
|
export { ToastProvider, useToast } from './chunk-BGMYX7L5.js';
|
|
3
4
|
export { toggle_default as Toggle } from './chunk-I7HJBHQU.js';
|
|
4
|
-
export { timeline_default as Timeline } from './chunk-JIXINKUJ.js';
|
|
5
5
|
export { tooltip_default as Tooltip, TooltipProvider } from './chunk-253JZOYG.js';
|
|
6
6
|
export { Transfer } from './chunk-3XOHSE3X.js';
|
|
7
7
|
export { tree_select_default as TreeSelect } from './chunk-TBKPQOXF.js';
|
|
@@ -22,7 +22,7 @@ export { scroll_area_default as ScrollArea } from './chunk-WQT24BGG.js';
|
|
|
22
22
|
export { select_default as Select } from './chunk-HVHQA34X.js';
|
|
23
23
|
export { skeleton_default as Skeleton } from './chunk-SFP77VS3.js';
|
|
24
24
|
export { slider_default as Slider } from './chunk-HR5TGNOF.js';
|
|
25
|
-
export { menubar_default as Menubar } from './chunk-
|
|
25
|
+
export { menubar_default as Menubar } from './chunk-JBNFVXH5.js';
|
|
26
26
|
export { multi_select_default as MultiSelect } from './chunk-XOEEAMMY.js';
|
|
27
27
|
import './chunk-HJITFPBT.js';
|
|
28
28
|
export { NavigationMenu } from './chunk-S6HO7HUY.js';
|
|
@@ -37,32 +37,32 @@ export { input_password_default as InputPassword } from './chunk-LJOQ2C5W.js';
|
|
|
37
37
|
export { input_default as Input } from './chunk-W5VLFE4U.js';
|
|
38
38
|
export { kbd_default as Kbd } from './chunk-5SEVPU6C.js';
|
|
39
39
|
export { link_default as Link } from './chunk-XMBZBXXS.js';
|
|
40
|
-
export { context_menu_default as ContextMenu, ContextMenuContent } from './chunk-Z3DIBMBQ.js';
|
|
41
40
|
export { DatePicker, RangePickerComponent as RangePicker, TimePickerComponent as TimePicker } from './chunk-BKLJDEUX.js';
|
|
42
41
|
export { descriptions_default as Descriptions } from './chunk-PRDJLQLB.js';
|
|
43
42
|
export { divider_default as Divider } from './chunk-JFTSWOGE.js';
|
|
44
43
|
export { Drawer, DrawerBody, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger } from './chunk-DDZCRCTQ.js';
|
|
44
|
+
export { clipboard_default as Clipboard } from './chunk-J2WIZULN.js';
|
|
45
45
|
export { fetching_overlay_default as FetchingOverlay } from './chunk-XBXPY7U3.js';
|
|
46
46
|
export { float_input_default as FloatInput } from './chunk-TDNPACQD.js';
|
|
47
47
|
export { card_default as Card } from './chunk-OGB5QPNZ.js';
|
|
48
48
|
export { carousel_default as Carousel } from './chunk-QEAALOJC.js';
|
|
49
|
-
export { cascader_default as Cascader } from './chunk-LWYZCSX4.js';
|
|
50
49
|
export { checkbox_default as Checkbox } from './chunk-A4MYCEGM.js';
|
|
50
|
+
export { cascader_default as Cascader } from './chunk-LWYZCSX4.js';
|
|
51
51
|
export { checkbox_group_default as CheckboxGroup } from './chunk-ON76IMMI.js';
|
|
52
52
|
export { collapse_default as Collapse } from './chunk-OJAHIPPP.js';
|
|
53
53
|
export { useControllable } from './chunk-PQOIW5CM.js';
|
|
54
|
-
export { clipboard_default as Clipboard } from './chunk-J2WIZULN.js';
|
|
55
54
|
export { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandModal, CommandSeparator, CommandShortcut } from './chunk-WG5AYAC6.js';
|
|
56
55
|
export { modal_default as Modal, ModalClose, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalOverlay, ModalPortal, Modal as ModalRoot, ModalTitle, ModalTrigger } from './chunk-AFW2ORFT.js';
|
|
56
|
+
export { context_menu_default as ContextMenu, ContextMenuContent } from './chunk-Z3DIBMBQ.js';
|
|
57
57
|
export { accordion_default as Accordion } from './chunk-4HKPDSA6.js';
|
|
58
58
|
export { alert_default as Alert } from './chunk-C65SCJD6.js';
|
|
59
59
|
export { Avatar, AvatarGroup } from './chunk-HSMO2BR4.js';
|
|
60
60
|
export { badge_default as Badge } from './chunk-C32HL4XU.js';
|
|
61
|
-
export { breadcrumbs_default as Breadcrumbs } from './chunk-
|
|
62
|
-
export { dropdown_default as Dropdown } from './chunk-
|
|
63
|
-
export { useMenuNavigation } from './chunk-NZHKNUGE.js';
|
|
61
|
+
export { breadcrumbs_default as Breadcrumbs } from './chunk-AL2EEKUY.js';
|
|
62
|
+
export { dropdown_default as Dropdown } from './chunk-OTNKP5CD.js';
|
|
64
63
|
import { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from './chunk-ROQGBDET.js';
|
|
65
64
|
export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } from './chunk-ROQGBDET.js';
|
|
65
|
+
export { useMenuNavigation } from './chunk-NZHKNUGE.js';
|
|
66
66
|
export { button_default as Button } from './chunk-SJLH5ZDW.js';
|
|
67
67
|
export { spinner_default as Spinner } from './chunk-RRPMZYVN.js';
|
|
68
68
|
export { RippleContainer, useRipple } from './chunk-4TEZWGX7.js';
|
package/dist/menubar/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { menubar_default as default } from '../chunk-
|
|
2
|
-
import '../chunk-NZHKNUGE.js';
|
|
1
|
+
export { menubar_default as default } from '../chunk-JBNFVXH5.js';
|
|
3
2
|
import '../chunk-ROQGBDET.js';
|
|
3
|
+
import '../chunk-NZHKNUGE.js';
|
|
4
4
|
import '../chunk-G6QIIWKU.js';
|
|
5
5
|
import '../chunk-RAS6HUEI.js';
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export { multi_select_default as default } from '../chunk-XOEEAMMY.js';
|
|
2
2
|
import '../chunk-HJITFPBT.js';
|
|
3
3
|
import '../chunk-PQOIW5CM.js';
|
|
4
|
-
import '../chunk-NZHKNUGE.js';
|
|
5
4
|
import '../chunk-ROQGBDET.js';
|
|
5
|
+
import '../chunk-NZHKNUGE.js';
|
|
6
6
|
import '../chunk-RRPMZYVN.js';
|
|
7
7
|
import '../chunk-G6QIIWKU.js';
|
|
8
8
|
import '../chunk-RAS6HUEI.js';
|
package/dist/select/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export { select_default as default } from '../chunk-HVHQA34X.js';
|
|
2
2
|
import '../chunk-HJITFPBT.js';
|
|
3
3
|
import '../chunk-PQOIW5CM.js';
|
|
4
|
-
import '../chunk-NZHKNUGE.js';
|
|
5
4
|
import '../chunk-ROQGBDET.js';
|
|
5
|
+
import '../chunk-NZHKNUGE.js';
|
|
6
6
|
import '../chunk-RRPMZYVN.js';
|
|
7
7
|
import '../chunk-G6QIIWKU.js';
|
|
8
8
|
import '../chunk-RAS6HUEI.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mdigital_ui/ui",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.5",
|
|
4
4
|
"description": "Modern React component library built with Tailwind CSS v4",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -287,7 +287,7 @@
|
|
|
287
287
|
},
|
|
288
288
|
"scripts": {
|
|
289
289
|
"build": "tsup && tsc -p tsconfig.dts.json && npm run build:css",
|
|
290
|
-
"build:css": "mkdir -p styles/themes/presets &&
|
|
290
|
+
"build:css": "mkdir -p styles/themes/presets && sed 's|@source \"../../dist\"|@source \"../dist\"|' src/styles/global.css > styles/global.css && postcss src/styles/themes/light.css -o styles/themes/light.css && postcss src/styles/themes/dark.css -o styles/themes/dark.css && postcss src/styles/themes/presets/corporate.css -o styles/themes/presets/corporate.css && postcss src/styles/themes/presets/vibrant.css -o styles/themes/presets/vibrant.css && postcss src/styles/themes/presets/minimal.css -o styles/themes/presets/minimal.css",
|
|
291
291
|
"dev": "tsup --watch",
|
|
292
292
|
"typecheck": "tsc --noEmit",
|
|
293
293
|
"storybook": "storybook dev -p 6006",
|