asterui 0.12.49 → 0.12.51
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/components/Alert.js +18 -18
- package/dist/components/Alert.js.map +1 -1
- package/dist/components/Autocomplete.js +115 -114
- package/dist/components/Autocomplete.js.map +1 -1
- package/dist/components/Avatar.js +33 -32
- package/dist/components/Avatar.js.map +1 -1
- package/dist/components/Badge.js +99 -99
- package/dist/components/Badge.js.map +1 -1
- package/dist/components/Breadcrumb.js +12 -11
- package/dist/components/Breadcrumb.js.map +1 -1
- package/dist/components/Browser.js +10 -10
- package/dist/components/Browser.js.map +1 -1
- package/dist/components/Button.js +80 -79
- package/dist/components/Button.js.map +1 -1
- package/dist/components/Card.d.ts +2 -0
- package/dist/components/Card.js +111 -110
- package/dist/components/Card.js.map +1 -1
- package/dist/components/Carousel.js +59 -59
- package/dist/components/Carousel.js.map +1 -1
- package/dist/components/Cascader.js +175 -174
- package/dist/components/Cascader.js.map +1 -1
- package/dist/components/Chat.js +27 -27
- package/dist/components/Chat.js.map +1 -1
- package/dist/components/Checkbox.js +98 -97
- package/dist/components/Checkbox.js.map +1 -1
- package/dist/components/Code.js +11 -11
- package/dist/components/Code.js.map +1 -1
- package/dist/components/Collapse.js +46 -46
- package/dist/components/Collapse.js.map +1 -1
- package/dist/components/ColorPicker.d.ts +1 -1
- package/dist/components/ColorPicker.js +93 -91
- package/dist/components/ColorPicker.js.map +1 -1
- package/dist/components/Command.js +120 -120
- package/dist/components/Command.js.map +1 -1
- package/dist/components/ConfigProvider.d.ts +1 -1
- package/dist/components/ConfigProvider.js +9 -9
- package/dist/components/ConfigProvider.js.map +1 -1
- package/dist/components/ContextMenu.js +33 -33
- package/dist/components/ContextMenu.js.map +1 -1
- package/dist/components/CopyButton.js +74 -73
- package/dist/components/CopyButton.js.map +1 -1
- package/dist/components/Countdown.js +60 -59
- package/dist/components/Countdown.js.map +1 -1
- package/dist/components/DatePicker.d.ts +1 -1
- package/dist/components/DatePicker.js +54 -53
- package/dist/components/DatePicker.js.map +1 -1
- package/dist/components/Diff.js +10 -10
- package/dist/components/Diff.js.map +1 -1
- package/dist/components/Divider.js +21 -20
- package/dist/components/Divider.js.map +1 -1
- package/dist/components/Dock.js +28 -27
- package/dist/components/Dock.js.map +1 -1
- package/dist/components/Drawer.js +43 -43
- package/dist/components/Drawer.js.map +1 -1
- package/dist/components/Dropdown.js +127 -127
- package/dist/components/Dropdown.js.map +1 -1
- package/dist/components/Empty.js +16 -15
- package/dist/components/Empty.js.map +1 -1
- package/dist/components/Fieldset.js +11 -10
- package/dist/components/Fieldset.js.map +1 -1
- package/dist/components/FileInput.js +30 -29
- package/dist/components/FileInput.js.map +1 -1
- package/dist/components/Filter.d.ts +1 -1
- package/dist/components/Filter.js +32 -30
- package/dist/components/Filter.js.map +1 -1
- package/dist/components/FloatButton.js +83 -83
- package/dist/components/FloatButton.js.map +1 -1
- package/dist/components/Footer.js +14 -13
- package/dist/components/Footer.js.map +1 -1
- package/dist/components/Form.js +133 -132
- package/dist/components/Form.js.map +1 -1
- package/dist/components/Hero.js +12 -11
- package/dist/components/Hero.js.map +1 -1
- package/dist/components/HoverGallery.js +7 -7
- package/dist/components/HoverGallery.js.map +1 -1
- package/dist/components/Image.js +40 -40
- package/dist/components/Image.js.map +1 -1
- package/dist/components/Input.js +171 -169
- package/dist/components/Input.js.map +1 -1
- package/dist/components/InputNumber.js +84 -83
- package/dist/components/InputNumber.js.map +1 -1
- package/dist/components/Join.js +11 -10
- package/dist/components/Join.js.map +1 -1
- package/dist/components/Kbd.js +15 -15
- package/dist/components/Kbd.js.map +1 -1
- package/dist/components/List.d.ts +1 -1
- package/dist/components/List.js +75 -72
- package/dist/components/List.js.map +1 -1
- package/dist/components/Loading.d.ts +1 -1
- package/dist/components/Loading.js +31 -29
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/Mask.js +31 -31
- package/dist/components/Mask.js.map +1 -1
- package/dist/components/Mention.js +61 -61
- package/dist/components/Mention.js.map +1 -1
- package/dist/components/Menu.js +84 -84
- package/dist/components/Menu.js.map +1 -1
- package/dist/components/Message.js +30 -29
- package/dist/components/Message.js.map +1 -1
- package/dist/components/Modal.js +117 -116
- package/dist/components/Modal.js.map +1 -1
- package/dist/components/MonthCalendar.d.ts +31 -0
- package/dist/components/MonthCalendar.js +205 -0
- package/dist/components/MonthCalendar.js.map +1 -0
- package/dist/components/Navbar.js +25 -25
- package/dist/components/Navbar.js.map +1 -1
- package/dist/components/Notification.js +56 -55
- package/dist/components/Notification.js.map +1 -1
- package/dist/components/OTPInput.js +69 -68
- package/dist/components/OTPInput.js.map +1 -1
- package/dist/components/Pagination.d.ts +1 -1
- package/dist/components/Pagination.js +60 -58
- package/dist/components/Pagination.js.map +1 -1
- package/dist/components/Phone.js +10 -10
- package/dist/components/Phone.js.map +1 -1
- package/dist/components/Popconfirm.js +60 -60
- package/dist/components/Popconfirm.js.map +1 -1
- package/dist/components/Progress.js +17 -17
- package/dist/components/Progress.js.map +1 -1
- package/dist/components/QRCode.js +23 -23
- package/dist/components/QRCode.js.map +1 -1
- package/dist/components/RadialProgress.js +17 -17
- package/dist/components/RadialProgress.js.map +1 -1
- package/dist/components/Radio.js +41 -40
- package/dist/components/Radio.js.map +1 -1
- package/dist/components/Range.d.ts +1 -1
- package/dist/components/Range.js +39 -37
- package/dist/components/Range.js.map +1 -1
- package/dist/components/Rating.js +79 -78
- package/dist/components/Rating.js.map +1 -1
- package/dist/components/ResponsiveDrawer.js +27 -27
- package/dist/components/ResponsiveDrawer.js.map +1 -1
- package/dist/components/RichTextEditor.d.ts +32 -0
- package/dist/components/RichTextEditor.js +335 -0
- package/dist/components/RichTextEditor.js.map +1 -0
- package/dist/components/Segmented.d.ts +1 -1
- package/dist/components/Segmented.js +48 -46
- package/dist/components/Segmented.js.map +1 -1
- package/dist/components/Select.js +55 -54
- package/dist/components/Select.js.map +1 -1
- package/dist/components/Skeleton.js +9 -9
- package/dist/components/Skeleton.js.map +1 -1
- package/dist/components/Splitter.js +1 -3
- package/dist/components/Splitter.js.map +1 -1
- package/dist/components/Stat.js +17 -16
- package/dist/components/Stat.js.map +1 -1
- package/dist/components/Status.js +29 -29
- package/dist/components/Status.js.map +1 -1
- package/dist/components/Steps.js +61 -61
- package/dist/components/Steps.js.map +1 -1
- package/dist/components/Table.js +256 -256
- package/dist/components/Table.js.map +1 -1
- package/dist/components/Tabs.js +65 -65
- package/dist/components/Tabs.js.map +1 -1
- package/dist/components/Tag.js +147 -147
- package/dist/components/Tag.js.map +1 -1
- package/dist/components/TextRotate.js +6 -6
- package/dist/components/TextRotate.js.map +1 -1
- package/dist/components/Textarea.js +35 -34
- package/dist/components/Textarea.js.map +1 -1
- package/dist/components/ThemeController.d.ts +1 -1
- package/dist/components/ThemeController.js +71 -68
- package/dist/components/ThemeController.js.map +1 -1
- package/dist/components/TimePicker.d.ts +1 -1
- package/dist/components/TimePicker.js +133 -129
- package/dist/components/TimePicker.js.map +1 -1
- package/dist/components/Timeline.js +79 -79
- package/dist/components/Timeline.js.map +1 -1
- package/dist/components/Toggle.js +33 -32
- package/dist/components/Toggle.js.map +1 -1
- package/dist/components/Tooltip.js +25 -25
- package/dist/components/Tooltip.js.map +1 -1
- package/dist/components/Tour.js +126 -126
- package/dist/components/Tour.js.map +1 -1
- package/dist/components/Transfer.js +93 -92
- package/dist/components/Transfer.js.map +1 -1
- package/dist/components/Tree.js +200 -200
- package/dist/components/Tree.js.map +1 -1
- package/dist/components/TreeSelect.js +255 -254
- package/dist/components/TreeSelect.js.map +1 -1
- package/dist/components/Typography.js +71 -70
- package/dist/components/Typography.js.map +1 -1
- package/dist/components/Upload.js +81 -81
- package/dist/components/Upload.js.map +1 -1
- package/dist/components/WeekCalendar.d.ts +35 -0
- package/dist/components/WeekCalendar.js +204 -0
- package/dist/components/WeekCalendar.js.map +1 -0
- package/dist/components/Window.js +7 -7
- package/dist/components/Window.js.map +1 -1
- package/dist/editor.d.ts +1 -0
- package/dist/editor.js +5 -0
- package/dist/editor.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +211 -207
- package/dist/index.js.map +1 -1
- package/package.json +30 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Card.js","sources":["../../src/components/Card.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\n\nexport type CardSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type CardVariant = 'default' | 'border' | 'dash' | 'borderless'\n\nexport interface CardTabItem {\n key: string\n label: React.ReactNode\n disabled?: boolean\n}\n\nexport interface CardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n children?: React.ReactNode\n title?: React.ReactNode\n /** Content in the top-right corner of the card header */\n extra?: React.ReactNode\n cover?: React.ReactNode\n actions?: React.ReactNode\n size?: CardSize\n /** @deprecated Use variant instead */\n bordered?: boolean\n /** Card style variant */\n variant?: CardVariant\n /** Inner card style (nested cards) */\n type?: 'inner'\n side?: boolean\n imageFull?: boolean\n actionsJustify?: 'start' | 'center' | 'end'\n loading?: boolean\n hoverable?: boolean\n // Meta props for avatar + description layout\n avatar?: React.ReactNode\n description?: React.ReactNode\n // Tab support\n tabList?: CardTabItem[]\n activeTabKey?: string\n defaultActiveTabKey?: string\n onTabChange?: (key: string) => void\n tabBarExtraContent?: React.ReactNode\n 'data-testid'?: string\n}\n\nexport interface CardMetaProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Avatar or icon element */\n avatar?: React.ReactNode\n /** Title content */\n title?: React.ReactNode\n /** Description content */\n description?: React.ReactNode\n 'data-testid'?: string\n}\n\nexport interface CardGridProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n hoverable?: boolean\n 'data-testid'?: string\n}\n\nconst sizeClasses: Record<CardSize, string> = {\n xs: 'card-xs',\n sm: 'card-sm',\n md: 'card-md',\n lg: 'card-lg',\n xl: 'card-xl',\n}\n\nconst variantClasses: Record<CardVariant, string> = {\n default: 'shadow-sm',\n border: 'card-border',\n dash: 'card-dash',\n borderless: '',\n}\n\nconst justifyClasses: Record<string, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n}\n\nconst CardGrid = forwardRef<HTMLDivElement, CardGridProps>(\n ({ children, hoverable = false, className = '', 'data-testid': testId, ...rest }, ref) => {\n const classes = [\n 'p-6 border border-base-content/10',\n hoverable && 'cursor-pointer hover:shadow-md transition-shadow',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div ref={ref} className={classes} data-testid={testId} {...rest}>\n {children}\n </div>\n )\n }\n)\n\nCardGrid.displayName = 'Card.Grid'\n\nconst CardMeta = forwardRef<HTMLDivElement, CardMetaProps>(\n ({ avatar, title, description, className = '', 'data-testid': testId, ...rest }, ref) => {\n return (\n <div ref={ref} className={`flex gap-4 ${className}`} data-testid={testId} {...rest}>\n {avatar && <div className=\"flex-shrink-0\">{avatar}</div>}\n <div className=\"flex-1 min-w-0\">\n {title && <div className=\"font-medium\">{title}</div>}\n {description && <div className=\"text-sm opacity-70 mt-1\">{description}</div>}\n </div>\n </div>\n )\n }\n)\n\nCardMeta.displayName = 'Card.Meta'\n\nconst CardRoot = forwardRef<HTMLDivElement, CardProps>(\n (\n {\n children,\n title,\n extra,\n cover,\n actions,\n className = '',\n size,\n bordered,\n variant,\n type,\n side = false,\n imageFull = false,\n actionsJustify = 'end',\n loading = false,\n hoverable = false,\n avatar,\n description,\n tabList,\n activeTabKey,\n defaultActiveTabKey,\n onTabChange,\n tabBarExtraContent,\n 'data-testid': testId,\n ...rest\n },\n ref\n ) => {\n const baseTestId = testId ?? 'card'\n\n // Handle activeTabKey state\n const [internalActiveKey, setInternalActiveKey] = React.useState(\n defaultActiveTabKey ?? tabList?.[0]?.key\n )\n const currentTabKey = activeTabKey ?? internalActiveKey\n\n const handleTabChange = (key: string) => {\n if (activeTabKey === undefined) {\n setInternalActiveKey(key)\n }\n onTabChange?.(key)\n }\n\n // Resolve variant from bordered prop for backwards compatibility\n const resolvedVariant = variant ?? (bordered === false ? 'borderless' : 'default')\n\n const classes = [\n 'card',\n 'bg-base-100',\n size && sizeClasses[size],\n // Don't add variant styling when imageFull is used (it breaks the overlay effect)\n !imageFull && variantClasses[resolvedVariant],\n side && 'card-side',\n imageFull && 'image-full shadow-sm',\n hoverable && 'transition-shadow hover:shadow-lg cursor-pointer',\n type === 'inner' && 'bg-base-200',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Render loading skeleton\n if (loading) {\n return (\n <div\n ref={ref}\n className={classes}\n data-testid={baseTestId}\n data-loading=\"true\"\n {...rest}\n >\n {cover && (\n <figure>\n <div className=\"skeleton h-48 w-full rounded-none\" />\n </figure>\n )}\n <div className=\"card-body\">\n {(avatar || title) && (\n <div className=\"flex gap-4 mb-4\">\n {avatar && <div className=\"skeleton w-12 h-12 rounded-full flex-shrink-0\" />}\n <div className=\"flex-1 space-y-2\">\n <div className=\"skeleton h-6 w-2/3\" />\n {description && <div className=\"skeleton h-4 w-full\" />}\n </div>\n </div>\n )}\n {!avatar && !title && (\n <>\n <div className=\"skeleton h-6 w-2/3 mb-4\" />\n <div className=\"space-y-2\">\n <div className=\"skeleton h-4 w-full\" />\n <div className=\"skeleton h-4 w-5/6\" />\n <div className=\"skeleton h-4 w-4/6\" />\n </div>\n </>\n )}\n {actions && (\n <div className={`card-actions ${justifyClasses[actionsJustify]} mt-4`}>\n <div className=\"skeleton h-10 w-20\" />\n <div className=\"skeleton h-10 w-20\" />\n </div>\n )}\n </div>\n </div>\n )\n }\n\n // Render with avatar + title + description layout (meta style)\n const hasMetaLayout = avatar || (title && description)\n\n // Header with title and extra\n const renderHeader = () => {\n if (!title && !extra) return null\n\n if (extra) {\n return (\n <div\n className=\"flex justify-between items-start gap-4\"\n data-testid={`${baseTestId}-header`}\n >\n {title && <h2 className=\"card-title\">{title}</h2>}\n <div className=\"flex-shrink-0\" data-testid={`${baseTestId}-extra`}>\n {extra}\n </div>\n </div>\n )\n }\n\n return title ? <h2 className=\"card-title\">{title}</h2> : null\n }\n\n // Render tabs\n const renderTabs = () => {\n if (!tabList || tabList.length === 0) return null\n\n return (\n <div\n className=\"border-b border-base-300 px-4\"\n data-testid={`${baseTestId}-tabs`}\n >\n <div className=\"flex items-center justify-between\">\n <div role=\"tablist\" className=\"tabs\">\n {tabList.map((tab) => (\n <button\n key={tab.key}\n role=\"tab\"\n className={[\n 'tab',\n currentTabKey === tab.key && 'tab-active',\n tab.disabled && 'tab-disabled',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => !tab.disabled && handleTabChange(tab.key)}\n disabled={tab.disabled}\n aria-selected={currentTabKey === tab.key}\n data-testid={`${baseTestId}-tab-${tab.key}`}\n >\n {tab.label}\n </button>\n ))}\n </div>\n {tabBarExtraContent && (\n <div data-testid={`${baseTestId}-tab-extra`}>{tabBarExtraContent}</div>\n )}\n </div>\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={classes}\n data-testid={baseTestId}\n {...rest}\n >\n {cover && (\n <figure data-testid={`${baseTestId}-cover`}>{cover}</figure>\n )}\n {renderTabs()}\n <div className=\"card-body\" data-testid={`${baseTestId}-body`}>\n {hasMetaLayout ? (\n <>\n <div className=\"flex gap-4\">\n {avatar && <div className=\"flex-shrink-0\">{avatar}</div>}\n <div className=\"flex-1 min-w-0\">\n {renderHeader()}\n {description && <p className=\"text-sm opacity-70 mt-1\">{description}</p>}\n </div>\n </div>\n {children}\n </>\n ) : (\n <>\n {renderHeader()}\n {children}\n </>\n )}\n {actions && (\n <div\n className={`card-actions ${justifyClasses[actionsJustify]}`}\n data-testid={`${baseTestId}-actions`}\n >\n {actions}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\n\nCardRoot.displayName = 'Card'\n\nexport const Card = Object.assign(CardRoot, {\n Grid: CardGrid,\n Meta: CardMeta,\n})\n\nexport default Card\n"],"names":["sizeClasses","variantClasses","justifyClasses","CardGrid","forwardRef","children","hoverable","className","testId","rest","ref","classes","jsx","CardMeta","avatar","title","description","jsxs","CardRoot","extra","cover","actions","size","bordered","variant","type","side","imageFull","actionsJustify","loading","tabList","activeTabKey","defaultActiveTabKey","onTabChange","tabBarExtraContent","baseTestId","internalActiveKey","setInternalActiveKey","React","currentTabKey","handleTabChange","key","resolvedVariant","Fragment","hasMetaLayout","renderHeader","renderTabs","tab","Card"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Card.js","sources":["../../src/components/Card.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\n\n// DaisyUI classes\nconst dCard = 'card'\nconst dCardXs = 'card-xs'\nconst dCardSm = 'card-sm'\nconst dCardMd = 'card-md'\nconst dCardLg = 'card-lg'\nconst dCardXl = 'card-xl'\nconst dCardBorder = 'card-border'\nconst dCardDash = 'card-dash'\nconst dCardSide = 'card-side'\nconst dCardBody = 'card-body'\nconst dCardTitle = 'card-title'\nconst dCardActions = 'card-actions'\nconst dSkeleton = 'skeleton'\nconst dTab = 'tab'\nconst dTabActive = 'tab-active'\nconst dTabDisabled = 'tab-disabled'\nconst dTabs = 'tabs'\n\nexport type CardSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type CardVariant = 'default' | 'border' | 'dash' | 'borderless'\n\nexport interface CardTabItem {\n key: string\n label: React.ReactNode\n disabled?: boolean\n}\n\nexport interface CardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n children?: React.ReactNode\n title?: React.ReactNode\n /** Content in the top-right corner of the card header */\n extra?: React.ReactNode\n cover?: React.ReactNode\n actions?: React.ReactNode\n size?: CardSize\n /** @deprecated Use variant instead */\n bordered?: boolean\n /** Card style variant */\n variant?: CardVariant\n /** Inner card style (nested cards) */\n type?: 'inner'\n side?: boolean\n imageFull?: boolean\n actionsJustify?: 'start' | 'center' | 'end'\n loading?: boolean\n hoverable?: boolean\n // Meta props for avatar + description layout\n avatar?: React.ReactNode\n description?: React.ReactNode\n // Tab support\n tabList?: CardTabItem[]\n activeTabKey?: string\n defaultActiveTabKey?: string\n onTabChange?: (key: string) => void\n tabBarExtraContent?: React.ReactNode\n /** Additional classes for the card-body element */\n bodyClassName?: string\n 'data-testid'?: string\n}\n\nexport interface CardMetaProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Avatar or icon element */\n avatar?: React.ReactNode\n /** Title content */\n title?: React.ReactNode\n /** Description content */\n description?: React.ReactNode\n 'data-testid'?: string\n}\n\nexport interface CardGridProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n hoverable?: boolean\n 'data-testid'?: string\n}\n\nconst sizeClasses: Record<CardSize, string> = {\n xs: dCardXs,\n sm: dCardSm,\n md: dCardMd,\n lg: dCardLg,\n xl: dCardXl,\n}\n\nconst variantClasses: Record<CardVariant, string> = {\n default: 'shadow-sm',\n border: dCardBorder,\n dash: dCardDash,\n borderless: '',\n}\n\nconst justifyClasses: Record<string, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n}\n\nconst CardGrid = forwardRef<HTMLDivElement, CardGridProps>(\n ({ children, hoverable = false, className = '', 'data-testid': testId, ...rest }, ref) => {\n const classes = [\n 'p-6 border border-base-content/10',\n hoverable && 'cursor-pointer hover:shadow-md transition-shadow',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div ref={ref} className={classes} data-testid={testId} {...rest}>\n {children}\n </div>\n )\n }\n)\n\nCardGrid.displayName = 'Card.Grid'\n\nconst CardMeta = forwardRef<HTMLDivElement, CardMetaProps>(\n ({ avatar, title, description, className = '', 'data-testid': testId, ...rest }, ref) => {\n return (\n <div ref={ref} className={`flex gap-4 ${className}`} data-testid={testId} {...rest}>\n {avatar && <div className=\"flex-shrink-0\">{avatar}</div>}\n <div className=\"flex-1 min-w-0\">\n {title && <div className=\"font-medium\">{title}</div>}\n {description && <div className=\"text-sm opacity-70 mt-1\">{description}</div>}\n </div>\n </div>\n )\n }\n)\n\nCardMeta.displayName = 'Card.Meta'\n\nconst CardRoot = forwardRef<HTMLDivElement, CardProps>(\n (\n {\n children,\n title,\n extra,\n cover,\n actions,\n className = '',\n size,\n bordered,\n variant,\n type,\n side = false,\n imageFull = false,\n actionsJustify = 'end',\n loading = false,\n hoverable = false,\n avatar,\n description,\n tabList,\n activeTabKey,\n defaultActiveTabKey,\n onTabChange,\n tabBarExtraContent,\n bodyClassName,\n 'data-testid': testId,\n ...rest\n },\n ref\n ) => {\n const baseTestId = testId ?? 'card'\n\n // Handle activeTabKey state\n const [internalActiveKey, setInternalActiveKey] = React.useState(\n defaultActiveTabKey ?? tabList?.[0]?.key\n )\n const currentTabKey = activeTabKey ?? internalActiveKey\n\n const handleTabChange = (key: string) => {\n if (activeTabKey === undefined) {\n setInternalActiveKey(key)\n }\n onTabChange?.(key)\n }\n\n // Resolve variant from bordered prop for backwards compatibility\n const resolvedVariant = variant ?? (bordered === false ? 'borderless' : 'default')\n\n const classes = [\n dCard,\n 'bg-base-100',\n size && sizeClasses[size],\n // Don't add variant styling when imageFull is used (it breaks the overlay effect)\n !imageFull && variantClasses[resolvedVariant],\n side && dCardSide,\n imageFull && 'image-full shadow-sm',\n hoverable && 'transition-shadow hover:shadow-lg cursor-pointer',\n type === 'inner' && 'bg-base-200',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Render loading skeleton\n if (loading) {\n return (\n <div\n ref={ref}\n className={classes}\n data-testid={baseTestId}\n data-loading=\"true\"\n {...rest}\n >\n {cover && (\n <figure>\n <div className={`${dSkeleton} h-48 w-full rounded-none`} />\n </figure>\n )}\n <div className={dCardBody}>\n {(avatar || title) && (\n <div className=\"flex gap-4 mb-4\">\n {avatar && <div className={`${dSkeleton} w-12 h-12 rounded-full flex-shrink-0`} />}\n <div className=\"flex-1 space-y-2\">\n <div className={`${dSkeleton} h-6 w-2/3`} />\n {description && <div className={`${dSkeleton} h-4 w-full`} />}\n </div>\n </div>\n )}\n {!avatar && !title && (\n <>\n <div className={`${dSkeleton} h-6 w-2/3 mb-4`} />\n <div className=\"space-y-2\">\n <div className={`${dSkeleton} h-4 w-full`} />\n <div className={`${dSkeleton} h-4 w-5/6`} />\n <div className={`${dSkeleton} h-4 w-4/6`} />\n </div>\n </>\n )}\n {actions && (\n <div className={`${dCardActions} ${justifyClasses[actionsJustify]} mt-4`}>\n <div className={`${dSkeleton} h-10 w-20`} />\n <div className={`${dSkeleton} h-10 w-20`} />\n </div>\n )}\n </div>\n </div>\n )\n }\n\n // Render with avatar + title + description layout (meta style)\n const hasMetaLayout = avatar || (title && description)\n\n // Header with title and extra\n const renderHeader = () => {\n if (!title && !extra) return null\n\n if (extra) {\n return (\n <div\n className=\"flex justify-between items-start gap-4\"\n data-testid={`${baseTestId}-header`}\n >\n {title && <h2 className={dCardTitle}>{title}</h2>}\n <div className=\"flex-shrink-0\" data-testid={`${baseTestId}-extra`}>\n {extra}\n </div>\n </div>\n )\n }\n\n return title ? <h2 className={dCardTitle}>{title}</h2> : null\n }\n\n // Render tabs\n const renderTabs = () => {\n if (!tabList || tabList.length === 0) return null\n\n return (\n <div\n className=\"border-b border-base-300 px-4\"\n data-testid={`${baseTestId}-tabs`}\n >\n <div className=\"flex items-center justify-between\">\n <div role=\"tablist\" className={dTabs}>\n {tabList.map((tab) => (\n <button\n key={tab.key}\n role=\"tab\"\n className={[\n dTab,\n currentTabKey === tab.key && dTabActive,\n tab.disabled && dTabDisabled,\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => !tab.disabled && handleTabChange(tab.key)}\n disabled={tab.disabled}\n aria-selected={currentTabKey === tab.key}\n data-testid={`${baseTestId}-tab-${tab.key}`}\n >\n {tab.label}\n </button>\n ))}\n </div>\n {tabBarExtraContent && (\n <div data-testid={`${baseTestId}-tab-extra`}>{tabBarExtraContent}</div>\n )}\n </div>\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={classes}\n data-testid={baseTestId}\n {...rest}\n >\n {cover && (\n <figure data-testid={`${baseTestId}-cover`}>{cover}</figure>\n )}\n {renderTabs()}\n <div className={`${dCardBody} ${bodyClassName || ''}`} data-testid={`${baseTestId}-body`}>\n {hasMetaLayout ? (\n <>\n <div className=\"flex gap-4\">\n {avatar && <div className=\"flex-shrink-0\">{avatar}</div>}\n <div className=\"flex-1 min-w-0\">\n {renderHeader()}\n {description && <p className=\"text-sm opacity-70 mt-1\">{description}</p>}\n </div>\n </div>\n {children}\n </>\n ) : (\n <>\n {renderHeader()}\n {children}\n </>\n )}\n {actions && (\n <div\n className={`${dCardActions} ${justifyClasses[actionsJustify]}`}\n data-testid={`${baseTestId}-actions`}\n >\n {actions}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\n\nCardRoot.displayName = 'Card'\n\nexport const Card = Object.assign(CardRoot, {\n Grid: CardGrid,\n Meta: CardMeta,\n})\n\nexport default Card\n"],"names":["dCard","dCardXs","dCardSm","dCardMd","dCardLg","dCardXl","dCardBorder","dCardDash","dCardSide","dCardBody","dCardTitle","dCardActions","dSkeleton","dTab","dTabActive","dTabDisabled","dTabs","sizeClasses","variantClasses","justifyClasses","CardGrid","forwardRef","children","hoverable","className","testId","rest","ref","classes","jsx","CardMeta","avatar","title","description","jsxs","CardRoot","extra","cover","actions","size","bordered","variant","type","side","imageFull","actionsJustify","loading","tabList","activeTabKey","defaultActiveTabKey","onTabChange","tabBarExtraContent","bodyClassName","baseTestId","internalActiveKey","setInternalActiveKey","React","currentTabKey","handleTabChange","key","resolvedVariant","Fragment","hasMetaLayout","renderHeader","renderTabs","tab","Card"],"mappings":"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"}
|
|
@@ -1,85 +1,85 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { forwardRef as
|
|
3
|
-
const
|
|
4
|
-
({ children:
|
|
1
|
+
import { jsxs as P, jsx as i, Fragment as ae } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as L, useState as I, useRef as R, Children as re, isValidElement as ne, useCallback as y, useImperativeHandle as ie, useEffect as ce, cloneElement as ue } from "react";
|
|
3
|
+
const de = "carousel", fe = "carousel-vertical", me = "carousel-item", be = "btn", pe = "btn-circle", he = "btn-sm", T = L(
|
|
4
|
+
({ children: $, className: b = "", "data-testid": g, ...c }, p) => /* @__PURE__ */ i(
|
|
5
5
|
"div",
|
|
6
6
|
{
|
|
7
7
|
ref: p,
|
|
8
8
|
role: "group",
|
|
9
9
|
"aria-roledescription": "slide",
|
|
10
|
-
className:
|
|
11
|
-
"data-testid":
|
|
10
|
+
className: `${me} w-full flex-shrink-0 ${b}`,
|
|
11
|
+
"data-testid": g,
|
|
12
12
|
...c,
|
|
13
|
-
children:
|
|
13
|
+
children: $
|
|
14
14
|
}
|
|
15
15
|
)
|
|
16
16
|
);
|
|
17
|
-
|
|
18
|
-
const
|
|
17
|
+
T.displayName = "Carousel.Item";
|
|
18
|
+
const z = L(
|
|
19
19
|
({
|
|
20
|
-
children:
|
|
20
|
+
children: $,
|
|
21
21
|
activeIndex: b,
|
|
22
|
-
defaultActiveIndex:
|
|
22
|
+
defaultActiveIndex: g = 0,
|
|
23
23
|
autoplay: c = !1,
|
|
24
24
|
autoplaySpeed: p = 3e3,
|
|
25
25
|
speed: h = 500,
|
|
26
26
|
arrows: K = !0,
|
|
27
27
|
dots: d = !0,
|
|
28
|
-
dotPlacement:
|
|
29
|
-
effect:
|
|
28
|
+
dotPlacement: V = "bottom",
|
|
29
|
+
effect: w = "scrollx",
|
|
30
30
|
infinite: v = !0,
|
|
31
|
-
pauseOnHover:
|
|
31
|
+
pauseOnHover: D = !0,
|
|
32
32
|
vertical: a = !1,
|
|
33
|
-
beforeChange:
|
|
34
|
-
afterChange:
|
|
35
|
-
className:
|
|
33
|
+
beforeChange: S,
|
|
34
|
+
afterChange: C,
|
|
35
|
+
className: F = "",
|
|
36
36
|
"data-testid": r,
|
|
37
|
-
...
|
|
38
|
-
},
|
|
39
|
-
const
|
|
37
|
+
...G
|
|
38
|
+
}, U) => {
|
|
39
|
+
const x = b !== void 0, [X, Y] = I(g), o = x ? b : X, [A, E] = I(!1), [M, j] = I(!1), _ = R(null), k = R(null), N = re.toArray($).filter(ne), s = N.length, u = y(
|
|
40
40
|
(e, t = !0) => {
|
|
41
|
-
if (M ||
|
|
42
|
-
let
|
|
43
|
-
v ?
|
|
44
|
-
j(!1),
|
|
45
|
-
}, h)) :
|
|
41
|
+
if (M || s === 0) return;
|
|
42
|
+
let l = e;
|
|
43
|
+
v ? l = (e % s + s) % s : l = Math.max(0, Math.min(e, s - 1)), l !== o && (S?.(o, l), t ? (j(!0), setTimeout(() => {
|
|
44
|
+
j(!1), C?.(l);
|
|
45
|
+
}, h)) : C?.(l), x || Y(l));
|
|
46
46
|
},
|
|
47
|
-
[o,
|
|
47
|
+
[o, s, v, x, S, C, h, M]
|
|
48
48
|
), n = y(() => {
|
|
49
49
|
u(o + 1);
|
|
50
50
|
}, [u, o]), f = y(() => {
|
|
51
51
|
u(o - 1);
|
|
52
52
|
}, [u, o]);
|
|
53
|
-
ie(
|
|
53
|
+
ie(U, () => ({
|
|
54
54
|
goTo: (e, t = !0) => u(e, t),
|
|
55
55
|
next: n,
|
|
56
56
|
prev: f
|
|
57
|
-
})), ce(() => (c && !
|
|
57
|
+
})), ce(() => (c && !A && s > 1 && (k.current = setInterval(() => {
|
|
58
58
|
n();
|
|
59
59
|
}, p)), () => {
|
|
60
60
|
k.current && clearInterval(k.current);
|
|
61
|
-
}), [c,
|
|
61
|
+
}), [c, A, p, n, s]);
|
|
62
62
|
const q = y(
|
|
63
63
|
(e) => {
|
|
64
64
|
a ? e.key === "ArrowUp" ? (e.preventDefault(), f()) : e.key === "ArrowDown" && (e.preventDefault(), n()) : e.key === "ArrowLeft" ? (e.preventDefault(), f()) : e.key === "ArrowRight" && (e.preventDefault(), n());
|
|
65
65
|
},
|
|
66
66
|
[a, f, n]
|
|
67
67
|
), H = () => {
|
|
68
|
-
|
|
68
|
+
D && c && E(!0);
|
|
69
69
|
}, J = () => {
|
|
70
|
-
|
|
70
|
+
D && c && E(!1);
|
|
71
71
|
}, Q = [
|
|
72
|
-
|
|
73
|
-
a ?
|
|
74
|
-
|
|
75
|
-
].filter(Boolean).join(" "), W = (e) =>
|
|
72
|
+
de,
|
|
73
|
+
a ? fe : "",
|
|
74
|
+
F
|
|
75
|
+
].filter(Boolean).join(" "), W = (e) => w === "fade" ? {
|
|
76
76
|
position: e === 0 ? "relative" : "absolute",
|
|
77
77
|
top: 0,
|
|
78
78
|
left: 0,
|
|
79
79
|
opacity: e === o ? 1 : 0,
|
|
80
80
|
transition: `opacity ${h}ms ease-in-out`,
|
|
81
81
|
zIndex: e === o ? 1 : 0
|
|
82
|
-
} : {}, Z =
|
|
82
|
+
} : {}, Z = w === "scrollx" ? {
|
|
83
83
|
display: "flex",
|
|
84
84
|
flexDirection: a ? "column" : "row",
|
|
85
85
|
transform: a ? `translateY(-${o * 100}%)` : `translateX(-${o * 100}%)`,
|
|
@@ -94,26 +94,26 @@ const B = T(
|
|
|
94
94
|
bottom: "bottom-2 left-1/2 -translate-x-1/2 flex-row",
|
|
95
95
|
start: "left-2 top-1/2 -translate-y-1/2 flex-col",
|
|
96
96
|
end: "right-2 top-1/2 -translate-y-1/2 flex-col"
|
|
97
|
-
}, te = d === !0 || typeof d == "object" && d !== null, oe = typeof d == "object" ? d.className : "",
|
|
97
|
+
}, te = d === !0 || typeof d == "object" && d !== null, oe = typeof d == "object" ? d.className : "", B = ({
|
|
98
98
|
direction: e,
|
|
99
99
|
onClick: t,
|
|
100
|
-
disabled:
|
|
100
|
+
disabled: l
|
|
101
101
|
}) => {
|
|
102
|
-
const m = e === "prev",
|
|
102
|
+
const m = e === "prev", se = a ? m ? "top-2 left-1/2 -translate-x-1/2" : "bottom-2 left-1/2 -translate-x-1/2" : m ? "left-2 top-1/2 -translate-y-1/2" : "right-2 top-1/2 -translate-y-1/2", le = a ? m ? "▲" : "▼" : m ? "❮" : "❯";
|
|
103
103
|
return /* @__PURE__ */ i(
|
|
104
104
|
"button",
|
|
105
105
|
{
|
|
106
106
|
type: "button",
|
|
107
107
|
onClick: t,
|
|
108
|
-
disabled:
|
|
108
|
+
disabled: l,
|
|
109
109
|
"aria-label": m ? "Previous slide" : "Next slide",
|
|
110
|
-
className: `absolute ${
|
|
110
|
+
className: `absolute ${se} ${be} ${pe} ${he} bg-base-100/80 hover:bg-base-100 border-none shadow-md z-10 disabled:opacity-50 disabled:cursor-not-allowed`,
|
|
111
111
|
"data-testid": r ? `${r}-${e}` : void 0,
|
|
112
|
-
children:
|
|
112
|
+
children: le
|
|
113
113
|
}
|
|
114
114
|
);
|
|
115
115
|
};
|
|
116
|
-
return /* @__PURE__ */
|
|
116
|
+
return /* @__PURE__ */ P(
|
|
117
117
|
"div",
|
|
118
118
|
{
|
|
119
119
|
ref: _,
|
|
@@ -127,22 +127,22 @@ const B = T(
|
|
|
127
127
|
className: `relative overflow-hidden focus:outline-none focus-visible:ring-2 focus-visible:ring-primary ${Q}`,
|
|
128
128
|
"data-testid": r,
|
|
129
129
|
"data-active-index": o,
|
|
130
|
-
...
|
|
130
|
+
...G,
|
|
131
131
|
children: [
|
|
132
132
|
/* @__PURE__ */ i(
|
|
133
133
|
"div",
|
|
134
134
|
{
|
|
135
|
-
className:
|
|
135
|
+
className: w === "fade" ? "relative w-full h-full" : a ? "h-full" : "",
|
|
136
136
|
style: Z,
|
|
137
137
|
"aria-live": "polite",
|
|
138
138
|
children: N.map((e, t) => {
|
|
139
|
-
const
|
|
140
|
-
return ue(
|
|
139
|
+
const l = e;
|
|
140
|
+
return ue(l, {
|
|
141
141
|
key: t,
|
|
142
142
|
"aria-hidden": t !== o,
|
|
143
|
-
"aria-label": `Slide ${t + 1} of ${
|
|
143
|
+
"aria-label": `Slide ${t + 1} of ${s}`,
|
|
144
144
|
style: {
|
|
145
|
-
...
|
|
145
|
+
...l.props.style,
|
|
146
146
|
...O(),
|
|
147
147
|
...W(t)
|
|
148
148
|
},
|
|
@@ -151,9 +151,9 @@ const B = T(
|
|
|
151
151
|
})
|
|
152
152
|
}
|
|
153
153
|
),
|
|
154
|
-
K &&
|
|
154
|
+
K && s > 1 && /* @__PURE__ */ P(ae, { children: [
|
|
155
155
|
/* @__PURE__ */ i(
|
|
156
|
-
|
|
156
|
+
B,
|
|
157
157
|
{
|
|
158
158
|
direction: "prev",
|
|
159
159
|
onClick: f,
|
|
@@ -161,18 +161,18 @@ const B = T(
|
|
|
161
161
|
}
|
|
162
162
|
),
|
|
163
163
|
/* @__PURE__ */ i(
|
|
164
|
-
|
|
164
|
+
B,
|
|
165
165
|
{
|
|
166
166
|
direction: "next",
|
|
167
167
|
onClick: n,
|
|
168
|
-
disabled: !v && o ===
|
|
168
|
+
disabled: !v && o === s - 1
|
|
169
169
|
}
|
|
170
170
|
)
|
|
171
171
|
] }),
|
|
172
|
-
te &&
|
|
172
|
+
te && s > 1 && /* @__PURE__ */ i(
|
|
173
173
|
"div",
|
|
174
174
|
{
|
|
175
|
-
className: `absolute flex gap-2 ${ee[
|
|
175
|
+
className: `absolute flex gap-2 ${ee[V]} ${oe || ""}`,
|
|
176
176
|
role: "tablist",
|
|
177
177
|
"aria-label": "Slide indicators",
|
|
178
178
|
"data-testid": r ? `${r}-dots` : void 0,
|
|
@@ -196,10 +196,10 @@ const B = T(
|
|
|
196
196
|
);
|
|
197
197
|
}
|
|
198
198
|
);
|
|
199
|
-
|
|
200
|
-
const
|
|
201
|
-
|
|
199
|
+
z.displayName = "Carousel";
|
|
200
|
+
const ve = z;
|
|
201
|
+
ve.Item = T;
|
|
202
202
|
export {
|
|
203
|
-
|
|
203
|
+
ve as Carousel
|
|
204
204
|
};
|
|
205
205
|
//# sourceMappingURL=Carousel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Carousel.js","sources":["../../src/components/Carousel.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n Children,\n cloneElement,\n isValidElement,\n} from 'react'\n\nexport type CarouselEffect = 'scrollx' | 'fade'\nexport type CarouselDotPlacement = 'top' | 'bottom' | 'start' | 'end'\n\nexport interface CarouselRef {\n goTo: (index: number, animate?: boolean) => void\n next: () => void\n prev: () => void\n}\n\nexport interface CarouselItemProps extends React.HTMLAttributes<HTMLDivElement> {\n 'data-testid'?: string\n children: React.ReactNode\n}\n\nconst CarouselItemComponent = forwardRef<HTMLDivElement, CarouselItemProps>(\n ({ children, className = '', 'data-testid': testId, ...rest }, ref) => {\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-roledescription=\"slide\"\n className={`carousel-item w-full flex-shrink-0 ${className}`}\n data-testid={testId}\n {...rest}\n >\n {children}\n </div>\n )\n }\n)\n\nCarouselItemComponent.displayName = 'Carousel.Item'\n\nexport interface CarouselProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Carousel slides */\n children: React.ReactNode\n /** Current slide index (controlled mode) */\n activeIndex?: number\n /** Default slide index (uncontrolled mode) */\n defaultActiveIndex?: number\n /** Auto-advance slides */\n autoplay?: boolean\n /** Autoplay interval in milliseconds */\n autoplaySpeed?: number\n /** Animation duration in milliseconds */\n speed?: number\n /** Show prev/next navigation arrows */\n arrows?: boolean\n /** Show slide indicator dots */\n dots?: boolean | { className?: string }\n /** Position of indicator dots */\n dotPlacement?: CarouselDotPlacement\n /** Transition effect */\n effect?: CarouselEffect\n /** Enable infinite looping */\n infinite?: boolean\n /** Pause autoplay on hover */\n pauseOnHover?: boolean\n /** Vertical carousel orientation */\n vertical?: boolean\n /** Callback before slide change */\n beforeChange?: (current: number, next: number) => void\n /** Callback after slide change */\n afterChange?: (current: number) => void\n /** Test ID for testing */\n 'data-testid'?: string\n}\n\nconst CarouselComponent = forwardRef<CarouselRef, CarouselProps>(\n (\n {\n children,\n activeIndex: controlledIndex,\n defaultActiveIndex = 0,\n autoplay = false,\n autoplaySpeed = 3000,\n speed = 500,\n arrows = true,\n dots = true,\n dotPlacement = 'bottom',\n effect = 'scrollx',\n infinite = true,\n pauseOnHover = true,\n vertical = false,\n beforeChange,\n afterChange,\n className = '',\n 'data-testid': testId,\n ...rest\n },\n ref\n ) => {\n const isControlled = controlledIndex !== undefined\n const [internalIndex, setInternalIndex] = useState(defaultActiveIndex)\n const currentIndex = isControlled ? controlledIndex : internalIndex\n\n const [isPaused, setIsPaused] = useState(false)\n const [isAnimating, setIsAnimating] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n const autoplayRef = useRef<NodeJS.Timeout | null>(null)\n\n const slides = Children.toArray(children).filter(isValidElement)\n const slideCount = slides.length\n\n const goTo = useCallback(\n (index: number, animate = true) => {\n if (isAnimating || slideCount === 0) return\n\n let targetIndex = index\n if (infinite) {\n targetIndex = ((index % slideCount) + slideCount) % slideCount\n } else {\n targetIndex = Math.max(0, Math.min(index, slideCount - 1))\n }\n\n if (targetIndex === currentIndex) return\n\n beforeChange?.(currentIndex, targetIndex)\n\n if (animate) {\n setIsAnimating(true)\n setTimeout(() => {\n setIsAnimating(false)\n afterChange?.(targetIndex)\n }, speed)\n } else {\n afterChange?.(targetIndex)\n }\n\n if (!isControlled) {\n setInternalIndex(targetIndex)\n }\n },\n [currentIndex, slideCount, infinite, isControlled, beforeChange, afterChange, speed, isAnimating]\n )\n\n const next = useCallback(() => {\n goTo(currentIndex + 1)\n }, [goTo, currentIndex])\n\n const prev = useCallback(() => {\n goTo(currentIndex - 1)\n }, [goTo, currentIndex])\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n goTo: (index: number, animate = true) => goTo(index, animate),\n next,\n prev,\n }))\n\n // Autoplay\n useEffect(() => {\n if (autoplay && !isPaused && slideCount > 1) {\n autoplayRef.current = setInterval(() => {\n next()\n }, autoplaySpeed)\n }\n\n return () => {\n if (autoplayRef.current) {\n clearInterval(autoplayRef.current)\n }\n }\n }, [autoplay, isPaused, autoplaySpeed, next, slideCount])\n\n // Keyboard navigation\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (vertical) {\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n prev()\n } else if (e.key === 'ArrowDown') {\n e.preventDefault()\n next()\n }\n } else {\n if (e.key === 'ArrowLeft') {\n e.preventDefault()\n prev()\n } else if (e.key === 'ArrowRight') {\n e.preventDefault()\n next()\n }\n }\n },\n [vertical, prev, next]\n )\n\n const handleMouseEnter = () => {\n if (pauseOnHover && autoplay) {\n setIsPaused(true)\n }\n }\n\n const handleMouseLeave = () => {\n if (pauseOnHover && autoplay) {\n setIsPaused(false)\n }\n }\n\n // Build carousel classes\n const carouselClasses = [\n 'carousel',\n vertical ? 'carousel-vertical' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Slide transform/opacity based on effect\n const getSlideStyle = (index: number): React.CSSProperties => {\n if (effect === 'fade') {\n return {\n position: index === 0 ? 'relative' : 'absolute',\n top: 0,\n left: 0,\n opacity: index === currentIndex ? 1 : 0,\n transition: `opacity ${speed}ms ease-in-out`,\n zIndex: index === currentIndex ? 1 : 0,\n }\n }\n return {}\n }\n\n // Container style for scrollx effect\n const trackStyle: React.CSSProperties =\n effect === 'scrollx'\n ? {\n display: 'flex',\n flexDirection: vertical ? 'column' : 'row',\n transform: vertical\n ? `translateY(-${currentIndex * 100}%)`\n : `translateX(-${currentIndex * 100}%)`,\n transition: `transform ${speed}ms ease-in-out`,\n height: vertical ? '100%' : undefined,\n }\n : {\n position: 'relative',\n width: '100%',\n height: '100%',\n }\n\n // Slide style - ensure proper sizing for vertical/horizontal\n const getSlideContainerStyle = (): React.CSSProperties => {\n if (vertical) {\n return { height: '100%', flexShrink: 0 }\n }\n return {}\n }\n\n // Dots placement classes\n const dotsPlacementClasses: Record<CarouselDotPlacement, string> = {\n top: 'top-2 left-1/2 -translate-x-1/2 flex-row',\n bottom: 'bottom-2 left-1/2 -translate-x-1/2 flex-row',\n start: 'left-2 top-1/2 -translate-y-1/2 flex-col',\n end: 'right-2 top-1/2 -translate-y-1/2 flex-col',\n }\n\n const showDots = dots === true || (typeof dots === 'object' && dots !== null)\n const dotsClassName = typeof dots === 'object' ? dots.className : ''\n\n // Arrow buttons\n const ArrowButton = ({\n direction,\n onClick,\n disabled,\n }: {\n direction: 'prev' | 'next'\n onClick: () => void\n disabled: boolean\n }) => {\n const isPrev = direction === 'prev'\n const positionClass = vertical\n ? isPrev\n ? 'top-2 left-1/2 -translate-x-1/2'\n : 'bottom-2 left-1/2 -translate-x-1/2'\n : isPrev\n ? 'left-2 top-1/2 -translate-y-1/2'\n : 'right-2 top-1/2 -translate-y-1/2'\n\n const arrowIcon = vertical\n ? isPrev\n ? '▲'\n : '▼'\n : isPrev\n ? '❮'\n : '❯'\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={isPrev ? 'Previous slide' : 'Next slide'}\n className={`absolute ${positionClass} btn btn-circle btn-sm bg-base-100/80 hover:bg-base-100 border-none shadow-md z-10 disabled:opacity-50 disabled:cursor-not-allowed`}\n data-testid={testId ? `${testId}-${direction}` : undefined}\n >\n {arrowIcon}\n </button>\n )\n }\n\n return (\n <div\n ref={containerRef}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label=\"Image carousel\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={`relative overflow-hidden focus:outline-none focus-visible:ring-2 focus-visible:ring-primary ${carouselClasses}`}\n data-testid={testId}\n data-active-index={currentIndex}\n {...rest}\n >\n {/* Slides track */}\n <div\n className={effect === 'fade' ? 'relative w-full h-full' : vertical ? 'h-full' : ''}\n style={trackStyle}\n aria-live=\"polite\"\n >\n {slides.map((slide, index) => {\n const slideElement = slide as React.ReactElement<CarouselItemProps & { style?: React.CSSProperties }>\n return cloneElement(slideElement, {\n key: index,\n 'aria-hidden': index !== currentIndex,\n 'aria-label': `Slide ${index + 1} of ${slideCount}`,\n style: {\n ...slideElement.props.style,\n ...getSlideContainerStyle(),\n ...getSlideStyle(index),\n },\n 'data-testid': testId ? `${testId}-slide-${index}` : undefined,\n })\n })}\n </div>\n\n {/* Navigation arrows */}\n {arrows && slideCount > 1 && (\n <>\n <ArrowButton\n direction=\"prev\"\n onClick={prev}\n disabled={!infinite && currentIndex === 0}\n />\n <ArrowButton\n direction=\"next\"\n onClick={next}\n disabled={!infinite && currentIndex === slideCount - 1}\n />\n </>\n )}\n\n {/* Dot indicators */}\n {showDots && slideCount > 1 && (\n <div\n className={`absolute flex gap-2 ${dotsPlacementClasses[dotPlacement]} ${dotsClassName || ''}`}\n role=\"tablist\"\n aria-label=\"Slide indicators\"\n data-testid={testId ? `${testId}-dots` : undefined}\n >\n {slides.map((_, index) => (\n <button\n key={index}\n type=\"button\"\n role=\"tab\"\n aria-selected={index === currentIndex}\n aria-label={`Go to slide ${index + 1}`}\n onClick={() => goTo(index)}\n className={`w-2 h-2 rounded-full transition-all ${\n index === currentIndex\n ? 'bg-primary w-4'\n : 'bg-base-content/30 hover:bg-base-content/50'\n }`}\n data-testid={testId ? `${testId}-dot-${index}` : undefined}\n />\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n\nCarouselComponent.displayName = 'Carousel'\n\n// Compound component type\ntype CarouselType = typeof CarouselComponent & {\n Item: typeof CarouselItemComponent\n}\n\nexport const Carousel = CarouselComponent as CarouselType\nCarousel.Item = CarouselItemComponent\n"],"names":["CarouselItemComponent","forwardRef","children","className","testId","rest","ref","jsx","CarouselComponent","controlledIndex","defaultActiveIndex","autoplay","autoplaySpeed","speed","arrows","dots","dotPlacement","effect","infinite","pauseOnHover","vertical","beforeChange","afterChange","isControlled","internalIndex","setInternalIndex","useState","currentIndex","isPaused","setIsPaused","isAnimating","setIsAnimating","containerRef","useRef","autoplayRef","slides","Children","isValidElement","slideCount","goTo","useCallback","index","animate","targetIndex","next","prev","useImperativeHandle","useEffect","handleKeyDown","handleMouseEnter","handleMouseLeave","carouselClasses","getSlideStyle","trackStyle","getSlideContainerStyle","dotsPlacementClasses","showDots","dotsClassName","ArrowButton","direction","onClick","disabled","isPrev","positionClass","arrowIcon","jsxs","slide","slideElement","cloneElement","Fragment","_","Carousel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Carousel.js","sources":["../../src/components/Carousel.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n Children,\n cloneElement,\n isValidElement,\n} from 'react'\n\n// DaisyUI classes\nconst dCarousel = 'carousel'\nconst dCarouselVertical = 'carousel-vertical'\nconst dCarouselItem = 'carousel-item'\nconst dBtn = 'btn'\nconst dBtnCircle = 'btn-circle'\nconst dBtnSm = 'btn-sm'\n\nexport type CarouselEffect = 'scrollx' | 'fade'\nexport type CarouselDotPlacement = 'top' | 'bottom' | 'start' | 'end'\n\nexport interface CarouselRef {\n goTo: (index: number, animate?: boolean) => void\n next: () => void\n prev: () => void\n}\n\nexport interface CarouselItemProps extends React.HTMLAttributes<HTMLDivElement> {\n 'data-testid'?: string\n children: React.ReactNode\n}\n\nconst CarouselItemComponent = forwardRef<HTMLDivElement, CarouselItemProps>(\n ({ children, className = '', 'data-testid': testId, ...rest }, ref) => {\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-roledescription=\"slide\"\n className={`${dCarouselItem} w-full flex-shrink-0 ${className}`}\n data-testid={testId}\n {...rest}\n >\n {children}\n </div>\n )\n }\n)\n\nCarouselItemComponent.displayName = 'Carousel.Item'\n\nexport interface CarouselProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Carousel slides */\n children: React.ReactNode\n /** Current slide index (controlled mode) */\n activeIndex?: number\n /** Default slide index (uncontrolled mode) */\n defaultActiveIndex?: number\n /** Auto-advance slides */\n autoplay?: boolean\n /** Autoplay interval in milliseconds */\n autoplaySpeed?: number\n /** Animation duration in milliseconds */\n speed?: number\n /** Show prev/next navigation arrows */\n arrows?: boolean\n /** Show slide indicator dots */\n dots?: boolean | { className?: string }\n /** Position of indicator dots */\n dotPlacement?: CarouselDotPlacement\n /** Transition effect */\n effect?: CarouselEffect\n /** Enable infinite looping */\n infinite?: boolean\n /** Pause autoplay on hover */\n pauseOnHover?: boolean\n /** Vertical carousel orientation */\n vertical?: boolean\n /** Callback before slide change */\n beforeChange?: (current: number, next: number) => void\n /** Callback after slide change */\n afterChange?: (current: number) => void\n /** Test ID for testing */\n 'data-testid'?: string\n}\n\nconst CarouselComponent = forwardRef<CarouselRef, CarouselProps>(\n (\n {\n children,\n activeIndex: controlledIndex,\n defaultActiveIndex = 0,\n autoplay = false,\n autoplaySpeed = 3000,\n speed = 500,\n arrows = true,\n dots = true,\n dotPlacement = 'bottom',\n effect = 'scrollx',\n infinite = true,\n pauseOnHover = true,\n vertical = false,\n beforeChange,\n afterChange,\n className = '',\n 'data-testid': testId,\n ...rest\n },\n ref\n ) => {\n const isControlled = controlledIndex !== undefined\n const [internalIndex, setInternalIndex] = useState(defaultActiveIndex)\n const currentIndex = isControlled ? controlledIndex : internalIndex\n\n const [isPaused, setIsPaused] = useState(false)\n const [isAnimating, setIsAnimating] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n const autoplayRef = useRef<NodeJS.Timeout | null>(null)\n\n const slides = Children.toArray(children).filter(isValidElement)\n const slideCount = slides.length\n\n const goTo = useCallback(\n (index: number, animate = true) => {\n if (isAnimating || slideCount === 0) return\n\n let targetIndex = index\n if (infinite) {\n targetIndex = ((index % slideCount) + slideCount) % slideCount\n } else {\n targetIndex = Math.max(0, Math.min(index, slideCount - 1))\n }\n\n if (targetIndex === currentIndex) return\n\n beforeChange?.(currentIndex, targetIndex)\n\n if (animate) {\n setIsAnimating(true)\n setTimeout(() => {\n setIsAnimating(false)\n afterChange?.(targetIndex)\n }, speed)\n } else {\n afterChange?.(targetIndex)\n }\n\n if (!isControlled) {\n setInternalIndex(targetIndex)\n }\n },\n [currentIndex, slideCount, infinite, isControlled, beforeChange, afterChange, speed, isAnimating]\n )\n\n const next = useCallback(() => {\n goTo(currentIndex + 1)\n }, [goTo, currentIndex])\n\n const prev = useCallback(() => {\n goTo(currentIndex - 1)\n }, [goTo, currentIndex])\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n goTo: (index: number, animate = true) => goTo(index, animate),\n next,\n prev,\n }))\n\n // Autoplay\n useEffect(() => {\n if (autoplay && !isPaused && slideCount > 1) {\n autoplayRef.current = setInterval(() => {\n next()\n }, autoplaySpeed)\n }\n\n return () => {\n if (autoplayRef.current) {\n clearInterval(autoplayRef.current)\n }\n }\n }, [autoplay, isPaused, autoplaySpeed, next, slideCount])\n\n // Keyboard navigation\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (vertical) {\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n prev()\n } else if (e.key === 'ArrowDown') {\n e.preventDefault()\n next()\n }\n } else {\n if (e.key === 'ArrowLeft') {\n e.preventDefault()\n prev()\n } else if (e.key === 'ArrowRight') {\n e.preventDefault()\n next()\n }\n }\n },\n [vertical, prev, next]\n )\n\n const handleMouseEnter = () => {\n if (pauseOnHover && autoplay) {\n setIsPaused(true)\n }\n }\n\n const handleMouseLeave = () => {\n if (pauseOnHover && autoplay) {\n setIsPaused(false)\n }\n }\n\n // Build carousel classes\n const carouselClasses = [\n dCarousel,\n vertical ? dCarouselVertical : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Slide transform/opacity based on effect\n const getSlideStyle = (index: number): React.CSSProperties => {\n if (effect === 'fade') {\n return {\n position: index === 0 ? 'relative' : 'absolute',\n top: 0,\n left: 0,\n opacity: index === currentIndex ? 1 : 0,\n transition: `opacity ${speed}ms ease-in-out`,\n zIndex: index === currentIndex ? 1 : 0,\n }\n }\n return {}\n }\n\n // Container style for scrollx effect\n const trackStyle: React.CSSProperties =\n effect === 'scrollx'\n ? {\n display: 'flex',\n flexDirection: vertical ? 'column' : 'row',\n transform: vertical\n ? `translateY(-${currentIndex * 100}%)`\n : `translateX(-${currentIndex * 100}%)`,\n transition: `transform ${speed}ms ease-in-out`,\n height: vertical ? '100%' : undefined,\n }\n : {\n position: 'relative',\n width: '100%',\n height: '100%',\n }\n\n // Slide style - ensure proper sizing for vertical/horizontal\n const getSlideContainerStyle = (): React.CSSProperties => {\n if (vertical) {\n return { height: '100%', flexShrink: 0 }\n }\n return {}\n }\n\n // Dots placement classes\n const dotsPlacementClasses: Record<CarouselDotPlacement, string> = {\n top: 'top-2 left-1/2 -translate-x-1/2 flex-row',\n bottom: 'bottom-2 left-1/2 -translate-x-1/2 flex-row',\n start: 'left-2 top-1/2 -translate-y-1/2 flex-col',\n end: 'right-2 top-1/2 -translate-y-1/2 flex-col',\n }\n\n const showDots = dots === true || (typeof dots === 'object' && dots !== null)\n const dotsClassName = typeof dots === 'object' ? dots.className : ''\n\n // Arrow buttons\n const ArrowButton = ({\n direction,\n onClick,\n disabled,\n }: {\n direction: 'prev' | 'next'\n onClick: () => void\n disabled: boolean\n }) => {\n const isPrev = direction === 'prev'\n const positionClass = vertical\n ? isPrev\n ? 'top-2 left-1/2 -translate-x-1/2'\n : 'bottom-2 left-1/2 -translate-x-1/2'\n : isPrev\n ? 'left-2 top-1/2 -translate-y-1/2'\n : 'right-2 top-1/2 -translate-y-1/2'\n\n const arrowIcon = vertical\n ? isPrev\n ? '▲'\n : '▼'\n : isPrev\n ? '❮'\n : '❯'\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={isPrev ? 'Previous slide' : 'Next slide'}\n className={`absolute ${positionClass} ${dBtn} ${dBtnCircle} ${dBtnSm} bg-base-100/80 hover:bg-base-100 border-none shadow-md z-10 disabled:opacity-50 disabled:cursor-not-allowed`}\n data-testid={testId ? `${testId}-${direction}` : undefined}\n >\n {arrowIcon}\n </button>\n )\n }\n\n return (\n <div\n ref={containerRef}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label=\"Image carousel\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={`relative overflow-hidden focus:outline-none focus-visible:ring-2 focus-visible:ring-primary ${carouselClasses}`}\n data-testid={testId}\n data-active-index={currentIndex}\n {...rest}\n >\n {/* Slides track */}\n <div\n className={effect === 'fade' ? 'relative w-full h-full' : vertical ? 'h-full' : ''}\n style={trackStyle}\n aria-live=\"polite\"\n >\n {slides.map((slide, index) => {\n const slideElement = slide as React.ReactElement<CarouselItemProps & { style?: React.CSSProperties }>\n return cloneElement(slideElement, {\n key: index,\n 'aria-hidden': index !== currentIndex,\n 'aria-label': `Slide ${index + 1} of ${slideCount}`,\n style: {\n ...slideElement.props.style,\n ...getSlideContainerStyle(),\n ...getSlideStyle(index),\n },\n 'data-testid': testId ? `${testId}-slide-${index}` : undefined,\n })\n })}\n </div>\n\n {/* Navigation arrows */}\n {arrows && slideCount > 1 && (\n <>\n <ArrowButton\n direction=\"prev\"\n onClick={prev}\n disabled={!infinite && currentIndex === 0}\n />\n <ArrowButton\n direction=\"next\"\n onClick={next}\n disabled={!infinite && currentIndex === slideCount - 1}\n />\n </>\n )}\n\n {/* Dot indicators */}\n {showDots && slideCount > 1 && (\n <div\n className={`absolute flex gap-2 ${dotsPlacementClasses[dotPlacement]} ${dotsClassName || ''}`}\n role=\"tablist\"\n aria-label=\"Slide indicators\"\n data-testid={testId ? `${testId}-dots` : undefined}\n >\n {slides.map((_, index) => (\n <button\n key={index}\n type=\"button\"\n role=\"tab\"\n aria-selected={index === currentIndex}\n aria-label={`Go to slide ${index + 1}`}\n onClick={() => goTo(index)}\n className={`w-2 h-2 rounded-full transition-all ${\n index === currentIndex\n ? 'bg-primary w-4'\n : 'bg-base-content/30 hover:bg-base-content/50'\n }`}\n data-testid={testId ? `${testId}-dot-${index}` : undefined}\n />\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n\nCarouselComponent.displayName = 'Carousel'\n\n// Compound component type\ntype CarouselType = typeof CarouselComponent & {\n Item: typeof CarouselItemComponent\n}\n\nexport const Carousel = CarouselComponent as CarouselType\nCarousel.Item = CarouselItemComponent\n"],"names":["dCarousel","dCarouselVertical","dCarouselItem","dBtn","dBtnCircle","dBtnSm","CarouselItemComponent","forwardRef","children","className","testId","rest","ref","jsx","CarouselComponent","controlledIndex","defaultActiveIndex","autoplay","autoplaySpeed","speed","arrows","dots","dotPlacement","effect","infinite","pauseOnHover","vertical","beforeChange","afterChange","isControlled","internalIndex","setInternalIndex","useState","currentIndex","isPaused","setIsPaused","isAnimating","setIsAnimating","containerRef","useRef","autoplayRef","slides","Children","isValidElement","slideCount","goTo","useCallback","index","animate","targetIndex","next","prev","useImperativeHandle","useEffect","handleKeyDown","handleMouseEnter","handleMouseLeave","carouselClasses","getSlideStyle","trackStyle","getSlideContainerStyle","dotsPlacementClasses","showDots","dotsClassName","ArrowButton","direction","onClick","disabled","isPrev","positionClass","arrowIcon","jsxs","slide","slideElement","cloneElement","Fragment","_","Carousel"],"mappings":"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"}
|