@humain/ui 2.2.4 → 2.2.6
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/index11.js +4 -4
- package/dist/index11.js.map +1 -1
- package/dist/index110.js +4 -4
- package/dist/index110.js.map +1 -1
- package/dist/index134.js +4 -4
- package/dist/index134.js.map +1 -1
- package/dist/index135.js +2 -2
- package/dist/index135.js.map +1 -1
- package/dist/index151.js +3 -3
- package/dist/index151.js.map +1 -1
- package/dist/index152.js +1 -1
- package/dist/index152.js.map +1 -1
- package/dist/index155.js +1 -1
- package/dist/index155.js.map +1 -1
- package/dist/index188.js +4 -4
- package/dist/index188.js.map +1 -1
- package/dist/index201.js +1 -1
- package/dist/index201.js.map +1 -1
- package/dist/index228.js +1 -1
- package/dist/index228.js.map +1 -1
- package/dist/index24.js +1 -1
- package/dist/index24.js.map +1 -1
- package/dist/index25.js +4 -4
- package/dist/index25.js.map +1 -1
- package/dist/index39.js +2 -2
- package/dist/index39.js.map +1 -1
- package/dist/index5.js +8 -8
- package/dist/index5.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/wc/AIScrollButton.js +8 -8
- package/dist/wc/AIScrollButton.js.map +1 -1
- package/dist/wc/Badge.js +9 -9
- package/dist/wc/Badge.js.map +1 -1
- package/dist/wc/Checkbox.js +22 -22
- package/dist/wc/Checkbox.js.map +1 -1
- package/dist/wc/Pagination.js +4 -4
- package/dist/wc/Pagination.js.map +1 -1
- package/dist/wc/Switch.js +23 -23
- package/dist/wc/Switch.js.map +1 -1
- package/dist/wc/Tabs.js +110 -110
- package/dist/wc/Tabs.js.map +1 -1
- package/dist/wc/Tooltip.js +28 -28
- package/dist/wc/Tooltip.js.map +1 -1
- package/dist/wc/button.js +33 -33
- package/dist/wc/button.js.map +1 -1
- package/dist/wc/hf-alert.js +10 -10
- package/dist/wc/hf-alert.js.map +1 -1
- package/dist/wc/hf-nav-account-menu.js +8 -8
- package/dist/wc/hf-nav-account-menu.js.map +1 -1
- package/dist/wc/hf-steps.js +8 -8
- package/dist/wc/hf-steps.js.map +1 -1
- package/dist/wc/markdown-renderer.js +4 -4
- package/dist/wc/markdown-renderer.js.map +1 -1
- package/dist/wc/selection-group.js +6 -6
- package/dist/wc/selection-group.js.map +1 -1
- package/dist/wc-react/AIScrollButton.js +18 -18
- package/dist/wc-react/AIScrollButton.js.map +1 -1
- package/dist/wc-react/Badge.js +16 -16
- package/dist/wc-react/Badge.js.map +1 -1
- package/dist/wc-react/Checkbox.js +14 -14
- package/dist/wc-react/Checkbox.js.map +1 -1
- package/dist/wc-react/Pagination.js +130 -130
- package/dist/wc-react/Pagination.js.map +1 -1
- package/dist/wc-react/Switch.js +2 -2
- package/dist/wc-react/Switch.js.map +1 -1
- package/dist/wc-react/Tabs.js +38 -38
- package/dist/wc-react/Tabs.js.map +1 -1
- package/dist/wc-react/Tooltip.js +22 -22
- package/dist/wc-react/Tooltip.js.map +1 -1
- package/dist/wc-react/button.js +8 -8
- package/dist/wc-react/button.js.map +1 -1
- package/dist/wc-react/hf-alert.js +28 -28
- package/dist/wc-react/hf-alert.js.map +1 -1
- package/dist/wc-react/hf-nav-account-menu.js +7 -7
- package/dist/wc-react/hf-nav-account-menu.js.map +1 -1
- package/dist/wc-react/hf-steps.js +16 -16
- package/dist/wc-react/hf-steps.js.map +1 -1
- package/dist/wc-react/markdown-renderer.js +4 -4
- package/dist/wc-react/markdown-renderer.js.map +1 -1
- package/dist/wc-react/selection-group.js +1 -1
- package/dist/wc-react/selection-group.js.map +1 -1
- package/package.json +1 -1
- package/skills/humain-ui/SKILL.md +1 -1
- package/skills/humain-ui/references/foundations.md +1 -1
- package/skills/humain-ui-wc/SKILL.md +1 -1
- package/skills/humain-ui-wc.skill +0 -0
- package/skills/humain-ui.skill +0 -0
- package/src/tokens.css +14 -6
package/dist/index11.js
CHANGED
|
@@ -56,22 +56,22 @@ var badgeVariants = cva("inline-flex items-center justify-center gap-1.5 font-me
|
|
|
56
56
|
{
|
|
57
57
|
variant: "solid",
|
|
58
58
|
color: "info",
|
|
59
|
-
className: "bg-info text-
|
|
59
|
+
className: "bg-info text-info-foreground hover:bg-info/90"
|
|
60
60
|
},
|
|
61
61
|
{
|
|
62
62
|
variant: "solid",
|
|
63
63
|
color: "success",
|
|
64
|
-
className: "bg-success text-
|
|
64
|
+
className: "bg-success text-success-foreground hover:bg-success/90"
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
67
|
variant: "solid",
|
|
68
68
|
color: "warning",
|
|
69
|
-
className: "bg-warning text-
|
|
69
|
+
className: "bg-warning text-warning-foreground hover:bg-warning/90"
|
|
70
70
|
},
|
|
71
71
|
{
|
|
72
72
|
variant: "solid",
|
|
73
73
|
color: "destructive",
|
|
74
|
-
className: "bg-destructive text-
|
|
74
|
+
className: "bg-destructive text-destructive-foreground hover:bg-destructive/90"
|
|
75
75
|
},
|
|
76
76
|
{
|
|
77
77
|
variant: "soft",
|
package/dist/index11.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index11.js","names":[],"sources":["../src/components/atoms/display/Badge/Badge.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { X } from 'lucide-react';\nimport { forwardRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nconst badgeVariants = cva(\n 'inline-flex items-center justify-center gap-1.5 font-medium transition-colors whitespace-nowrap shrink-0 [&>svg]:pointer-events-none [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n solid: '',\n soft: '',\n outline: 'border',\n white:\n 'bg-opacity-white-80 transition-opacity hover:opacity-80 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-current/50',\n dot: 'bg-transparent text-muted-foreground',\n },\n color: {\n primary: '',\n secondary: '',\n info: '',\n success: '',\n warning: '',\n destructive: '',\n gray: '',\n cyan: '',\n teal: '',\n green: '',\n blue: '',\n indigo: '',\n purple: '',\n pink: '',\n orange: '',\n yellow: '',\n },\n size: {\n xs: 'h-[18px] px-1.5 py-0.5 text-[10px] [&>svg]:size-2.5',\n sm: 'h-5 px-2 py-0.5 text-xs [&>svg]:size-3',\n md: 'h-[22px] px-2.5 py-1 text-xs [&>svg]:size-3.5',\n lg: 'h-[26px] px-3 py-1.5 text-sm [&>svg]:size-4',\n },\n shape: {\n round: 'rounded-full',\n rounded: 'rounded-sm',\n },\n },\n compoundVariants: [\n // Solid variants\n {\n variant: 'solid',\n color: 'primary',\n className: 'bg-primary text-primary-foreground hover:bg-primary/90',\n },\n {\n variant: 'solid',\n color: 'secondary',\n className:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/90',\n },\n {\n variant: 'solid',\n color: 'info',\n className: 'bg-info text-primary-foreground hover:bg-info/90',\n },\n {\n variant: 'solid',\n color: 'success',\n className: 'bg-success text-primary-foreground hover:bg-success/90',\n },\n {\n variant: 'solid',\n color: 'warning',\n className: 'bg-warning text-primary-foreground hover:bg-warning/90',\n },\n {\n variant: 'solid',\n color: 'destructive',\n className:\n 'bg-destructive text-primary-foreground hover:bg-destructive/90',\n },\n\n // Soft variants\n {\n variant: 'soft',\n color: 'primary',\n className:\n 'bg-soft-primary text-soft-primary-foreground hover:bg-opacity-primary-20 dark:bg-soft-primary dark:text-soft-primary-foreground',\n },\n {\n variant: 'soft',\n color: 'secondary',\n className:\n 'bg-soft-secondary text-soft-secondary-foreground hover:bg-opacity-secondary-20 dark:bg-soft-secondary dark:text-soft-secondary-foreground',\n },\n {\n variant: 'soft',\n color: 'info',\n className:\n 'bg-soft-info text-soft-info-foreground hover:bg-opacity-info-20 dark:bg-soft-info dark:text-soft-info-foreground',\n },\n {\n variant: 'soft',\n color: 'success',\n className:\n 'bg-soft-success text-soft-success-foreground hover:bg-opacity-success-20 dark:bg-soft-success dark:text-soft-success-foreground',\n },\n {\n variant: 'soft',\n color: 'warning',\n className:\n 'bg-soft-warning text-soft-warning-foreground hover:bg-opacity-warning-20 dark:bg-soft-warning dark:text-soft-warning-foreground',\n },\n {\n variant: 'soft',\n color: 'destructive',\n className:\n 'bg-soft-destructive text-soft-destructive-foreground hover:bg-opacity-destructive-20 dark:bg-soft-destructive dark:text-soft-destructive-foreground',\n },\n {\n variant: 'soft',\n color: 'gray',\n className:\n 'bg-soft-gray text-soft-gray-foreground hover:bg-opacity-neutral-20 dark:bg-soft-gray dark:text-soft-gray-foreground',\n },\n {\n variant: 'soft',\n color: 'cyan',\n className:\n 'bg-soft-cyan text-soft-cyan-foreground hover:bg-opacity-info-20 dark:bg-soft-cyan dark:text-soft-cyan-foreground',\n },\n {\n variant: 'soft',\n color: 'teal',\n className:\n 'bg-soft-primary text-soft-primary-foreground hover:bg-opacity-primary-20 dark:bg-soft-primary dark:text-soft-primary-foreground',\n },\n {\n variant: 'soft',\n color: 'green',\n className:\n 'bg-soft-green text-soft-green-foreground hover:bg-opacity-success-20 dark:bg-soft-green dark:text-soft-green-foreground',\n },\n {\n variant: 'soft',\n color: 'blue',\n className:\n 'bg-soft-blue text-soft-blue-foreground hover:bg-opacity-info-20 dark:bg-soft-blue dark:text-soft-blue-foreground',\n },\n {\n variant: 'soft',\n color: 'indigo',\n className:\n 'bg-soft-indigo text-soft-indigo-foreground hover:bg-opacity-info-20 dark:bg-soft-indigo dark:text-soft-indigo-foreground',\n },\n {\n variant: 'soft',\n color: 'purple',\n className:\n 'bg-soft-purple text-soft-purple-foreground hover:bg-opacity-primary-20 dark:bg-soft-purple dark:text-soft-purple-foreground',\n },\n {\n variant: 'soft',\n color: 'pink',\n className:\n 'bg-soft-pink text-soft-pink-foreground hover:bg-opacity-destructive-20 dark:bg-soft-pink dark:text-soft-pink-foreground',\n },\n {\n variant: 'soft',\n color: 'orange',\n className:\n 'bg-soft-orange text-soft-orange-foreground hover:bg-opacity-warning-20 dark:bg-soft-orange dark:text-soft-orange-foreground',\n },\n {\n variant: 'soft',\n color: 'yellow',\n className:\n 'bg-soft-yellow text-soft-yellow-foreground hover:bg-opacity-warning-20 dark:bg-soft-yellow dark:text-soft-yellow-foreground',\n },\n\n // Outline variants\n {\n variant: 'outline',\n color: 'primary',\n className: 'border-primary text-primary hover:bg-primary/10',\n },\n {\n variant: 'outline',\n color: 'secondary',\n className:\n 'border-border text-secondary-foreground hover:bg-secondary/50',\n },\n {\n variant: 'outline',\n color: 'info',\n className: 'border-info text-info hover:bg-info/10',\n },\n {\n variant: 'outline',\n color: 'success',\n className: 'border-success text-success hover:bg-success/10',\n },\n {\n variant: 'outline',\n color: 'warning',\n className: 'border-warning text-warning hover:bg-warning/10',\n },\n {\n variant: 'outline',\n color: 'destructive',\n className:\n 'border-destructive text-destructive hover:bg-destructive/10',\n },\n\n // White variants\n {\n variant: 'white',\n color: 'primary',\n className: 'text-primary',\n },\n {\n variant: 'white',\n color: 'secondary',\n className: 'text-secondary-foreground',\n },\n {\n variant: 'white',\n color: 'info',\n className: 'text-info',\n },\n {\n variant: 'white',\n color: 'success',\n className: 'text-success',\n },\n {\n variant: 'white',\n color: 'warning',\n className: 'text-warning',\n },\n {\n variant: 'white',\n color: 'destructive',\n className: 'text-destructive',\n },\n {\n variant: 'white',\n color: 'gray',\n className: 'text-soft-gray-foreground',\n },\n {\n variant: 'white',\n color: 'cyan',\n className: 'text-soft-cyan-foreground',\n },\n {\n variant: 'white',\n color: 'teal',\n className: 'text-primary',\n },\n {\n variant: 'white',\n color: 'green',\n className: 'text-soft-green-foreground',\n },\n {\n variant: 'white',\n color: 'blue',\n className: 'text-soft-blue-foreground',\n },\n {\n variant: 'white',\n color: 'indigo',\n className: 'text-soft-indigo-foreground',\n },\n {\n variant: 'white',\n color: 'purple',\n className: 'text-soft-purple-foreground',\n },\n {\n variant: 'white',\n color: 'pink',\n className: 'text-soft-pink-foreground',\n },\n {\n variant: 'white',\n color: 'orange',\n className: 'text-soft-orange-foreground',\n },\n {\n variant: 'white',\n color: 'yellow',\n className: 'text-soft-yellow-foreground',\n },\n ],\n defaultVariants: {\n variant: 'soft',\n color: 'secondary',\n size: 'sm',\n shape: 'round',\n },\n },\n);\n\ntype BadgeColor = NonNullable<VariantProps<typeof badgeVariants>['color']>;\n\n// Dot color mapping for the dot variant\nconst dotColorClasses: Partial<Record<BadgeColor, string>> = {\n primary: 'bg-primary',\n secondary: 'bg-muted-foreground',\n info: 'bg-info',\n success: 'bg-success',\n warning: 'bg-warning',\n destructive: 'bg-destructive',\n cyan: 'bg-soft-cyan-foreground',\n};\n\nexport interface BadgeProps\n extends Omit<React.ComponentProps<'span'>, 'color'>,\n VariantProps<typeof badgeVariants> {\n /** Leading icon displayed before the text */\n leadingIcon?: React.ReactNode;\n /** Trailing icon displayed after the text */\n trailingIcon?: React.ReactNode;\n /** Avatar element to display before the text */\n avatar?: React.ReactNode;\n /** For icon-only badges - no text, just an icon */\n iconOnly?: boolean;\n /** Shows a close button and enables onClose callback */\n closable?: boolean;\n /** Accessible label for the close button */\n closeLabel?: string;\n /** Callback when close button is clicked */\n onClose?: () => void;\n}\n\n/**\n * Dot indicator for the dot variant\n */\nconst BadgeDot = ({ color = 'secondary' }: { color?: BadgeColor }) => (\n <span className=\"relative flex size-2 shrink-0\" aria-hidden=\"true\">\n <span\n className={cn(\n 'absolute inline-flex size-full animate-ping rounded-full opacity-40 motion-reduce:animate-none',\n dotColorClasses[color] ?? dotColorClasses.secondary,\n )}\n />\n <span\n className={cn(\n 'relative inline-flex size-2 rounded-full',\n dotColorClasses[color] ?? dotColorClasses.secondary,\n )}\n />\n </span>\n);\n\nconst Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n children,\n leadingIcon,\n trailingIcon,\n avatar,\n iconOnly = false,\n closable = false,\n closeLabel = 'Remove',\n onClose,\n className,\n variant = 'soft',\n color = 'secondary',\n size = 'sm',\n shape = 'round',\n ...props\n },\n ref,\n ) => {\n const isDot = variant === 'dot';\n\n // Adjust padding for different configurations\n const paddingClasses = cn(\n // Leading content - reduce left padding\n (avatar || leadingIcon || isDot) && 'ps-1.5',\n // Trailing content - reduce right padding\n (trailingIcon || closable) && 'pe-1',\n // Icon only - equal padding\n iconOnly && 'px-1.5',\n );\n\n return (\n <span\n ref={ref}\n data-slot=\"badge\"\n {...(isDot && { role: 'status' })}\n className={cn(\n badgeVariants({ variant, color, size, shape }),\n paddingClasses,\n className,\n )}\n {...props}\n >\n {isDot && <BadgeDot color={color ?? 'secondary'} />}\n\n {avatar && !isDot && (\n <span className=\"shrink-0 -ms-0.5 [&>*]:size-4 [&>*]:rounded-full\">\n {avatar}\n </span>\n )}\n\n {leadingIcon && !avatar && !isDot && leadingIcon}\n\n {children}\n\n {trailingIcon && !closable && trailingIcon}\n\n {closable && (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"group/close relative shrink-0 rounded-full hover:bg-current/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 -me-0.5 p-0.5 before:absolute before:-inset-3.5 before:content-['']\"\n aria-label={closeLabel}\n >\n <X className=\"size-3 transition-transform duration-150 ease-out group-hover/close:rotate-90 motion-reduce:transition-none\" />\n </button>\n )}\n </span>\n );\n },\n);\n\nBadge.displayName = 'Badge';\n\nexport { Badge, BadgeDot, badgeVariants };\n"],"mappings":";;;;;;AAKA,IAAM,gBAAgB,IACpB,yJACA;CACE,UAAU;EACR,SAAS;GACP,OAAO;GACP,MAAM;GACN,SAAS;GACT,OACE;GACF,KAAK;EACP;EACA,OAAO;GACL,SAAS;GACT,WAAW;GACX,MAAM;GACN,SAAS;GACT,SAAS;GACT,aAAa;GACb,MAAM;GACN,MAAM;GACN,MAAM;GACN,OAAO;GACP,MAAM;GACN,QAAQ;GACR,QAAQ;GACR,MAAM;GACN,QAAQ;GACR,QAAQ;EACV;EACA,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;EACN;EACA,OAAO;GACL,OAAO;GACP,SAAS;EACX;CACF;CACA,kBAAkB;EAEhB;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EAGA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EAGA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EAGA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;CACF;CACA,iBAAiB;EACf,SAAS;EACT,OAAO;EACP,MAAM;EACN,OAAO;CACT;AACF,CACF;AAKA,IAAM,kBAAuD;CAC3D,SAAS;CACT,WAAW;CACX,MAAM;CACN,SAAS;CACT,SAAS;CACT,aAAa;CACb,MAAM;AACR;;;;AAwBA,IAAM,YAAY,EAAE,QAAQ,kBAC1B,qBAAC,QAAD;CAAM,WAAU;CAAgC,eAAY;WAA5D,CACE,oBAAC,QAAD,EACE,WAAW,GACT,kGACA,gBAAgB,UAAU,gBAAgB,SAC5C,EACD,CAAA,GACD,oBAAC,QAAD,EACE,WAAW,GACT,4CACA,gBAAgB,UAAU,gBAAgB,SAC5C,EACD,CAAA,CACG;;AAGR,IAAM,QAAQ,YAEV,EACE,UACA,aACA,cACA,QACA,WAAW,OACX,WAAW,OACX,aAAa,UACb,SACA,WACA,UAAU,QACV,QAAQ,aACR,OAAO,MACP,QAAQ,SACR,GAAG,SAEL,QACG;CACH,MAAM,QAAQ,YAAY;CAG1B,MAAM,iBAAiB,IAEpB,UAAU,eAAe,UAAU,WAEnC,gBAAgB,aAAa,QAE9B,YAAY,QACd;CAEA,OACE,qBAAC,QAAD;EACO;EACL,aAAU;EACV,GAAK,SAAS,EAAE,MAAM,SAAS;EAC/B,WAAW,GACT,cAAc;GAAE;GAAS;GAAO;GAAM;EAAM,CAAC,GAC7C,gBACA,SACF;EACA,GAAI;YATN;GAWG,SAAS,oBAAC,UAAD,EAAU,OAAO,SAAS,YAAc,CAAA;GAEjD,UAAU,CAAC,SACV,oBAAC,QAAD;IAAM,WAAU;cACb;GACG,CAAA;GAGP,eAAe,CAAC,UAAU,CAAC,SAAS;GAEpC;GAEA,gBAAgB,CAAC,YAAY;GAE7B,YACC,oBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,WAAU;IACV,cAAY;cAEZ,oBAAC,GAAD,EAAG,WAAU,8GAA+G,CAAA;GACtH,CAAA;EAEN;;AAEV,CACF;AAEA,MAAM,cAAc"}
|
|
1
|
+
{"version":3,"file":"index11.js","names":[],"sources":["../src/components/atoms/display/Badge/Badge.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { X } from 'lucide-react';\nimport { forwardRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nconst badgeVariants = cva(\n 'inline-flex items-center justify-center gap-1.5 font-medium transition-colors whitespace-nowrap shrink-0 [&>svg]:pointer-events-none [&>svg]:shrink-0',\n {\n variants: {\n variant: {\n solid: '',\n soft: '',\n outline: 'border',\n white:\n 'bg-opacity-white-80 transition-opacity hover:opacity-80 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-current/50',\n dot: 'bg-transparent text-muted-foreground',\n },\n color: {\n primary: '',\n secondary: '',\n info: '',\n success: '',\n warning: '',\n destructive: '',\n gray: '',\n cyan: '',\n teal: '',\n green: '',\n blue: '',\n indigo: '',\n purple: '',\n pink: '',\n orange: '',\n yellow: '',\n },\n size: {\n xs: 'h-[18px] px-1.5 py-0.5 text-[10px] [&>svg]:size-2.5',\n sm: 'h-5 px-2 py-0.5 text-xs [&>svg]:size-3',\n md: 'h-[22px] px-2.5 py-1 text-xs [&>svg]:size-3.5',\n lg: 'h-[26px] px-3 py-1.5 text-sm [&>svg]:size-4',\n },\n shape: {\n round: 'rounded-full',\n rounded: 'rounded-sm',\n },\n },\n compoundVariants: [\n // Solid variants\n {\n variant: 'solid',\n color: 'primary',\n className: 'bg-primary text-primary-foreground hover:bg-primary/90',\n },\n {\n variant: 'solid',\n color: 'secondary',\n className:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/90',\n },\n {\n variant: 'solid',\n color: 'info',\n className: 'bg-info text-info-foreground hover:bg-info/90',\n },\n {\n variant: 'solid',\n color: 'success',\n className: 'bg-success text-success-foreground hover:bg-success/90',\n },\n {\n variant: 'solid',\n color: 'warning',\n className: 'bg-warning text-warning-foreground hover:bg-warning/90',\n },\n {\n variant: 'solid',\n color: 'destructive',\n className:\n 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n },\n\n // Soft variants\n {\n variant: 'soft',\n color: 'primary',\n className:\n 'bg-soft-primary text-soft-primary-foreground hover:bg-opacity-primary-20 dark:bg-soft-primary dark:text-soft-primary-foreground',\n },\n {\n variant: 'soft',\n color: 'secondary',\n className:\n 'bg-soft-secondary text-soft-secondary-foreground hover:bg-opacity-secondary-20 dark:bg-soft-secondary dark:text-soft-secondary-foreground',\n },\n {\n variant: 'soft',\n color: 'info',\n className:\n 'bg-soft-info text-soft-info-foreground hover:bg-opacity-info-20 dark:bg-soft-info dark:text-soft-info-foreground',\n },\n {\n variant: 'soft',\n color: 'success',\n className:\n 'bg-soft-success text-soft-success-foreground hover:bg-opacity-success-20 dark:bg-soft-success dark:text-soft-success-foreground',\n },\n {\n variant: 'soft',\n color: 'warning',\n className:\n 'bg-soft-warning text-soft-warning-foreground hover:bg-opacity-warning-20 dark:bg-soft-warning dark:text-soft-warning-foreground',\n },\n {\n variant: 'soft',\n color: 'destructive',\n className:\n 'bg-soft-destructive text-soft-destructive-foreground hover:bg-opacity-destructive-20 dark:bg-soft-destructive dark:text-soft-destructive-foreground',\n },\n {\n variant: 'soft',\n color: 'gray',\n className:\n 'bg-soft-gray text-soft-gray-foreground hover:bg-opacity-neutral-20 dark:bg-soft-gray dark:text-soft-gray-foreground',\n },\n {\n variant: 'soft',\n color: 'cyan',\n className:\n 'bg-soft-cyan text-soft-cyan-foreground hover:bg-opacity-info-20 dark:bg-soft-cyan dark:text-soft-cyan-foreground',\n },\n {\n variant: 'soft',\n color: 'teal',\n className:\n 'bg-soft-primary text-soft-primary-foreground hover:bg-opacity-primary-20 dark:bg-soft-primary dark:text-soft-primary-foreground',\n },\n {\n variant: 'soft',\n color: 'green',\n className:\n 'bg-soft-green text-soft-green-foreground hover:bg-opacity-success-20 dark:bg-soft-green dark:text-soft-green-foreground',\n },\n {\n variant: 'soft',\n color: 'blue',\n className:\n 'bg-soft-blue text-soft-blue-foreground hover:bg-opacity-info-20 dark:bg-soft-blue dark:text-soft-blue-foreground',\n },\n {\n variant: 'soft',\n color: 'indigo',\n className:\n 'bg-soft-indigo text-soft-indigo-foreground hover:bg-opacity-info-20 dark:bg-soft-indigo dark:text-soft-indigo-foreground',\n },\n {\n variant: 'soft',\n color: 'purple',\n className:\n 'bg-soft-purple text-soft-purple-foreground hover:bg-opacity-primary-20 dark:bg-soft-purple dark:text-soft-purple-foreground',\n },\n {\n variant: 'soft',\n color: 'pink',\n className:\n 'bg-soft-pink text-soft-pink-foreground hover:bg-opacity-destructive-20 dark:bg-soft-pink dark:text-soft-pink-foreground',\n },\n {\n variant: 'soft',\n color: 'orange',\n className:\n 'bg-soft-orange text-soft-orange-foreground hover:bg-opacity-warning-20 dark:bg-soft-orange dark:text-soft-orange-foreground',\n },\n {\n variant: 'soft',\n color: 'yellow',\n className:\n 'bg-soft-yellow text-soft-yellow-foreground hover:bg-opacity-warning-20 dark:bg-soft-yellow dark:text-soft-yellow-foreground',\n },\n\n // Outline variants\n {\n variant: 'outline',\n color: 'primary',\n className: 'border-primary text-primary hover:bg-primary/10',\n },\n {\n variant: 'outline',\n color: 'secondary',\n className:\n 'border-border text-secondary-foreground hover:bg-secondary/50',\n },\n {\n variant: 'outline',\n color: 'info',\n className: 'border-info text-info hover:bg-info/10',\n },\n {\n variant: 'outline',\n color: 'success',\n className: 'border-success text-success hover:bg-success/10',\n },\n {\n variant: 'outline',\n color: 'warning',\n className: 'border-warning text-warning hover:bg-warning/10',\n },\n {\n variant: 'outline',\n color: 'destructive',\n className:\n 'border-destructive text-destructive hover:bg-destructive/10',\n },\n\n // White variants\n {\n variant: 'white',\n color: 'primary',\n className: 'text-primary',\n },\n {\n variant: 'white',\n color: 'secondary',\n className: 'text-secondary-foreground',\n },\n {\n variant: 'white',\n color: 'info',\n className: 'text-info',\n },\n {\n variant: 'white',\n color: 'success',\n className: 'text-success',\n },\n {\n variant: 'white',\n color: 'warning',\n className: 'text-warning',\n },\n {\n variant: 'white',\n color: 'destructive',\n className: 'text-destructive',\n },\n {\n variant: 'white',\n color: 'gray',\n className: 'text-soft-gray-foreground',\n },\n {\n variant: 'white',\n color: 'cyan',\n className: 'text-soft-cyan-foreground',\n },\n {\n variant: 'white',\n color: 'teal',\n className: 'text-primary',\n },\n {\n variant: 'white',\n color: 'green',\n className: 'text-soft-green-foreground',\n },\n {\n variant: 'white',\n color: 'blue',\n className: 'text-soft-blue-foreground',\n },\n {\n variant: 'white',\n color: 'indigo',\n className: 'text-soft-indigo-foreground',\n },\n {\n variant: 'white',\n color: 'purple',\n className: 'text-soft-purple-foreground',\n },\n {\n variant: 'white',\n color: 'pink',\n className: 'text-soft-pink-foreground',\n },\n {\n variant: 'white',\n color: 'orange',\n className: 'text-soft-orange-foreground',\n },\n {\n variant: 'white',\n color: 'yellow',\n className: 'text-soft-yellow-foreground',\n },\n ],\n defaultVariants: {\n variant: 'soft',\n color: 'secondary',\n size: 'sm',\n shape: 'round',\n },\n },\n);\n\ntype BadgeColor = NonNullable<VariantProps<typeof badgeVariants>['color']>;\n\n// Dot color mapping for the dot variant\nconst dotColorClasses: Partial<Record<BadgeColor, string>> = {\n primary: 'bg-primary',\n secondary: 'bg-muted-foreground',\n info: 'bg-info',\n success: 'bg-success',\n warning: 'bg-warning',\n destructive: 'bg-destructive',\n cyan: 'bg-soft-cyan-foreground',\n};\n\nexport interface BadgeProps\n extends Omit<React.ComponentProps<'span'>, 'color'>,\n VariantProps<typeof badgeVariants> {\n /** Leading icon displayed before the text */\n leadingIcon?: React.ReactNode;\n /** Trailing icon displayed after the text */\n trailingIcon?: React.ReactNode;\n /** Avatar element to display before the text */\n avatar?: React.ReactNode;\n /** For icon-only badges - no text, just an icon */\n iconOnly?: boolean;\n /** Shows a close button and enables onClose callback */\n closable?: boolean;\n /** Accessible label for the close button */\n closeLabel?: string;\n /** Callback when close button is clicked */\n onClose?: () => void;\n}\n\n/**\n * Dot indicator for the dot variant\n */\nconst BadgeDot = ({ color = 'secondary' }: { color?: BadgeColor }) => (\n <span className=\"relative flex size-2 shrink-0\" aria-hidden=\"true\">\n <span\n className={cn(\n 'absolute inline-flex size-full animate-ping rounded-full opacity-40 motion-reduce:animate-none',\n dotColorClasses[color] ?? dotColorClasses.secondary,\n )}\n />\n <span\n className={cn(\n 'relative inline-flex size-2 rounded-full',\n dotColorClasses[color] ?? dotColorClasses.secondary,\n )}\n />\n </span>\n);\n\nconst Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n children,\n leadingIcon,\n trailingIcon,\n avatar,\n iconOnly = false,\n closable = false,\n closeLabel = 'Remove',\n onClose,\n className,\n variant = 'soft',\n color = 'secondary',\n size = 'sm',\n shape = 'round',\n ...props\n },\n ref,\n ) => {\n const isDot = variant === 'dot';\n\n // Adjust padding for different configurations\n const paddingClasses = cn(\n // Leading content - reduce left padding\n (avatar || leadingIcon || isDot) && 'ps-1.5',\n // Trailing content - reduce right padding\n (trailingIcon || closable) && 'pe-1',\n // Icon only - equal padding\n iconOnly && 'px-1.5',\n );\n\n return (\n <span\n ref={ref}\n data-slot=\"badge\"\n {...(isDot && { role: 'status' })}\n className={cn(\n badgeVariants({ variant, color, size, shape }),\n paddingClasses,\n className,\n )}\n {...props}\n >\n {isDot && <BadgeDot color={color ?? 'secondary'} />}\n\n {avatar && !isDot && (\n <span className=\"shrink-0 -ms-0.5 [&>*]:size-4 [&>*]:rounded-full\">\n {avatar}\n </span>\n )}\n\n {leadingIcon && !avatar && !isDot && leadingIcon}\n\n {children}\n\n {trailingIcon && !closable && trailingIcon}\n\n {closable && (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"group/close relative shrink-0 rounded-full hover:bg-current/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 -me-0.5 p-0.5 before:absolute before:-inset-3.5 before:content-['']\"\n aria-label={closeLabel}\n >\n <X className=\"size-3 transition-transform duration-150 ease-out group-hover/close:rotate-90 motion-reduce:transition-none\" />\n </button>\n )}\n </span>\n );\n },\n);\n\nBadge.displayName = 'Badge';\n\nexport { Badge, BadgeDot, badgeVariants };\n"],"mappings":";;;;;;AAKA,IAAM,gBAAgB,IACpB,yJACA;CACE,UAAU;EACR,SAAS;GACP,OAAO;GACP,MAAM;GACN,SAAS;GACT,OACE;GACF,KAAK;EACP;EACA,OAAO;GACL,SAAS;GACT,WAAW;GACX,MAAM;GACN,SAAS;GACT,SAAS;GACT,aAAa;GACb,MAAM;GACN,MAAM;GACN,MAAM;GACN,OAAO;GACP,MAAM;GACN,QAAQ;GACR,QAAQ;GACR,MAAM;GACN,QAAQ;GACR,QAAQ;EACV;EACA,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;EACN;EACA,OAAO;GACL,OAAO;GACP,SAAS;EACX;CACF;CACA,kBAAkB;EAEhB;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EAGA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EAGA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WACE;EACJ;EAGA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;EACA;GACE,SAAS;GACT,OAAO;GACP,WAAW;EACb;CACF;CACA,iBAAiB;EACf,SAAS;EACT,OAAO;EACP,MAAM;EACN,OAAO;CACT;AACF,CACF;AAKA,IAAM,kBAAuD;CAC3D,SAAS;CACT,WAAW;CACX,MAAM;CACN,SAAS;CACT,SAAS;CACT,aAAa;CACb,MAAM;AACR;;;;AAwBA,IAAM,YAAY,EAAE,QAAQ,kBAC1B,qBAAC,QAAD;CAAM,WAAU;CAAgC,eAAY;WAA5D,CACE,oBAAC,QAAD,EACE,WAAW,GACT,kGACA,gBAAgB,UAAU,gBAAgB,SAC5C,EACD,CAAA,GACD,oBAAC,QAAD,EACE,WAAW,GACT,4CACA,gBAAgB,UAAU,gBAAgB,SAC5C,EACD,CAAA,CACG;;AAGR,IAAM,QAAQ,YAEV,EACE,UACA,aACA,cACA,QACA,WAAW,OACX,WAAW,OACX,aAAa,UACb,SACA,WACA,UAAU,QACV,QAAQ,aACR,OAAO,MACP,QAAQ,SACR,GAAG,SAEL,QACG;CACH,MAAM,QAAQ,YAAY;CAG1B,MAAM,iBAAiB,IAEpB,UAAU,eAAe,UAAU,WAEnC,gBAAgB,aAAa,QAE9B,YAAY,QACd;CAEA,OACE,qBAAC,QAAD;EACO;EACL,aAAU;EACV,GAAK,SAAS,EAAE,MAAM,SAAS;EAC/B,WAAW,GACT,cAAc;GAAE;GAAS;GAAO;GAAM;EAAM,CAAC,GAC7C,gBACA,SACF;EACA,GAAI;YATN;GAWG,SAAS,oBAAC,UAAD,EAAU,OAAO,SAAS,YAAc,CAAA;GAEjD,UAAU,CAAC,SACV,oBAAC,QAAD;IAAM,WAAU;cACb;GACG,CAAA;GAGP,eAAe,CAAC,UAAU,CAAC,SAAS;GAEpC;GAEA,gBAAgB,CAAC,YAAY;GAE7B,YACC,oBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,WAAU;IACV,cAAY;cAEZ,oBAAC,GAAD,EAAG,WAAU,8GAA+G,CAAA;GACtH,CAAA;EAEN;;AAEV,CACF;AAEA,MAAM,cAAc"}
|
package/dist/index110.js
CHANGED
|
@@ -54,22 +54,22 @@ var alertVariants = cva("relative flex gap-3 rounded-lg px-4 py-3 text-sm motion
|
|
|
54
54
|
{
|
|
55
55
|
appearance: "solid",
|
|
56
56
|
variant: "info",
|
|
57
|
-
className: "bg-info text-
|
|
57
|
+
className: "bg-info text-info-foreground [&>svg]:text-info-foreground"
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
60
|
appearance: "solid",
|
|
61
61
|
variant: "success",
|
|
62
|
-
className: "bg-success text-
|
|
62
|
+
className: "bg-success text-success-foreground [&>svg]:text-success-foreground"
|
|
63
63
|
},
|
|
64
64
|
{
|
|
65
65
|
appearance: "solid",
|
|
66
66
|
variant: "warning",
|
|
67
|
-
className: "bg-warning text-
|
|
67
|
+
className: "bg-warning text-warning-foreground [&>svg]:text-warning-foreground"
|
|
68
68
|
},
|
|
69
69
|
{
|
|
70
70
|
appearance: "solid",
|
|
71
71
|
variant: "destructive",
|
|
72
|
-
className: "bg-destructive text-
|
|
72
|
+
className: "bg-destructive text-destructive-foreground [&>svg]:text-destructive-foreground"
|
|
73
73
|
},
|
|
74
74
|
{
|
|
75
75
|
appearance: "soft",
|
package/dist/index110.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index110.js","names":[],"sources":["../src/components/molecules/feedback/Alert/Alert.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { AlertCircle, AlertTriangle, CheckCircle, Info, X } from 'lucide-react';\nimport * as React from 'react';\nimport { Button, type ButtonProps } from '@/components/atoms/buttons/Button';\nimport { cn } from '@/lib/utils';\n\nconst alertVariants = cva(\n 'relative flex gap-3 rounded-lg px-4 py-3 text-sm motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-top-1 [&>svg]:shrink-0 [&>svg]:size-4 [&>svg]:mt-0.5 [&>svg]:motion-safe:animate-in [&>svg]:motion-safe:fade-in-0 [&>svg]:motion-safe:zoom-in-75 [&>svg]:motion-safe:duration-300 [&>svg]:motion-safe:delay-75',\n {\n variants: {\n appearance: {\n outline: 'bg-card border',\n solid: '',\n soft: '',\n },\n variant: {\n default: '',\n info: '',\n success: '',\n warning: '',\n destructive: '',\n },\n },\n compoundVariants: [\n // ===== OUTLINE =====\n {\n appearance: 'outline',\n variant: 'default',\n className:\n 'border-border text-card-foreground [&>svg]:text-muted-foreground',\n },\n {\n appearance: 'outline',\n variant: 'info',\n className: 'border-info text-info [&>svg]:text-info',\n },\n {\n appearance: 'outline',\n variant: 'success',\n className: 'border-success text-success [&>svg]:text-success',\n },\n {\n appearance: 'outline',\n variant: 'warning',\n className: 'border-warning text-warning [&>svg]:text-warning',\n },\n {\n appearance: 'outline',\n variant: 'destructive',\n className:\n 'border-destructive text-destructive [&>svg]:text-destructive',\n },\n\n // ===== SOLID =====\n {\n appearance: 'solid',\n variant: 'default',\n className:\n 'bg-primary text-primary-foreground [&>svg]:text-primary-foreground',\n },\n {\n appearance: 'solid',\n variant: 'info',\n className:\n 'bg-info text-primary-foreground [&>svg]:text-primary-foreground',\n },\n {\n appearance: 'solid',\n variant: 'success',\n className:\n 'bg-success text-primary-foreground [&>svg]:text-primary-foreground',\n },\n {\n appearance: 'solid',\n variant: 'warning',\n className:\n 'bg-warning text-primary-foreground [&>svg]:text-primary-foreground',\n },\n {\n appearance: 'solid',\n variant: 'destructive',\n className:\n 'bg-destructive text-primary-foreground [&>svg]:text-primary-foreground',\n },\n\n // ===== SOFT =====\n {\n appearance: 'soft',\n variant: 'default',\n className:\n 'bg-primary/10 text-card-foreground [&>svg]:text-primary dark:bg-primary/20',\n },\n {\n appearance: 'soft',\n variant: 'info',\n className: 'bg-info/10 text-info [&>svg]:text-info dark:bg-info/20',\n },\n {\n appearance: 'soft',\n variant: 'success',\n className:\n 'bg-success/10 text-success [&>svg]:text-success dark:bg-success/20',\n },\n {\n appearance: 'soft',\n variant: 'warning',\n className:\n 'bg-warning/10 text-warning [&>svg]:text-warning dark:bg-warning/20',\n },\n {\n appearance: 'soft',\n variant: 'destructive',\n className:\n 'bg-destructive/10 text-destructive [&>svg]:text-destructive dark:bg-destructive/20',\n },\n ],\n defaultVariants: {\n appearance: 'outline',\n variant: 'default',\n },\n },\n);\n\ntype AlertVariant = NonNullable<VariantProps<typeof alertVariants>['variant']>;\ntype AlertAppearance = NonNullable<\n VariantProps<typeof alertVariants>['appearance']\n>;\n\n/** Default icon mapping for each variant */\nconst defaultIcons: Record<AlertVariant, React.ReactNode> = {\n default: <AlertCircle />,\n info: <Info />,\n success: <CheckCircle />,\n warning: <AlertTriangle />,\n destructive: <AlertTriangle />,\n};\n\n/** Maps alert variant to button variant for soft/outline appearances */\nconst alertToButtonVariant = {\n default: 'secondary',\n info: 'info',\n success: 'success',\n warning: 'warning',\n destructive: 'destructive',\n} as const;\n\n/** Maps alert variant to button variant for soft appearance (uses primary for default) */\nconst alertToSolidButtonVariant = {\n default: 'primary',\n info: 'info',\n success: 'success',\n warning: 'warning',\n destructive: 'destructive',\n} as const;\n\n/** Maps alert variant to text color class */\nconst variantTextClass = {\n default: 'text-primary',\n info: 'text-info',\n success: 'text-success',\n warning: 'text-warning',\n destructive: 'text-destructive',\n} as const;\n\nexport interface AlertProps\n extends Omit<React.ComponentProps<'div'>, 'title'>,\n VariantProps<typeof alertVariants> {\n /** Alert title - displayed prominently */\n title?: React.ReactNode;\n /** Alert description - secondary text */\n description?: React.ReactNode;\n /** Custom icon to display. Set to `false` to hide the icon entirely */\n icon?: React.ReactNode | false;\n /** Show close button */\n closable?: boolean;\n /** Callback when close button is clicked */\n onClose?: () => void;\n /** Action button configuration */\n action?: {\n label: string;\n onClick?: () => void;\n props?: Omit<ButtonProps, 'children' | 'onClick'>;\n };\n /** Duration of dismiss animation in ms (0 to disable) */\n dismissDuration?: number;\n}\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n className,\n appearance = 'outline',\n variant = 'default',\n title,\n description,\n icon,\n closable = false,\n onClose,\n action,\n children,\n dismissDuration = 200,\n ...props\n },\n ref,\n ) => {\n const [dismissing, setDismissing] = React.useState(false);\n const internalRef = React.useRef<HTMLDivElement>(null);\n const resolvedVariant = variant ?? 'default';\n\n // Merge refs\n React.useImperativeHandle(ref, () => internalRef.current as HTMLDivElement);\n\n const showIcon = icon !== false;\n const iconElement = showIcon ? icon || defaultIcons[resolvedVariant] : null;\n\n const handleClose = React.useCallback(() => {\n if (dismissDuration <= 0) {\n onClose?.();\n return;\n }\n // Use ref-based window access per ADR-010\n const win = internalRef.current?.ownerDocument.defaultView;\n const prefersReducedMotion =\n win?.matchMedia('(prefers-reduced-motion: reduce)').matches ?? false;\n if (prefersReducedMotion) {\n onClose?.();\n return;\n }\n setDismissing(true);\n }, [dismissDuration, onClose]);\n\n // Determine button styling based on appearance and variant\n const getActionButtonProps = (): Partial<ButtonProps> => {\n if (appearance === 'solid') {\n return {\n appearance: 'outline',\n variant: 'secondary',\n className: cn(\n 'bg-background/90 border-background/20 hover:bg-background',\n variantTextClass[resolvedVariant],\n ),\n };\n }\n if (appearance === 'soft') {\n return {\n appearance: 'solid',\n variant: alertToSolidButtonVariant[resolvedVariant],\n };\n }\n // outline appearance\n return {\n appearance: 'outline',\n variant: alertToButtonVariant[resolvedVariant],\n };\n };\n\n const alertRole =\n resolvedVariant === 'destructive' || resolvedVariant === 'warning'\n ? 'alert'\n : 'status';\n\n const getCloseButtonClass = () => {\n if (appearance === 'solid') {\n return 'text-current/80 hover:text-current hover:bg-current/10';\n }\n if (appearance === 'outline' || resolvedVariant === 'default') {\n return 'text-muted-foreground hover:text-foreground hover:bg-muted';\n }\n // soft appearance with colored variant\n return cn('hover:bg-current/10', variantTextClass[resolvedVariant]);\n };\n\n return (\n <div\n ref={internalRef}\n role={alertRole}\n data-slot=\"alert\"\n data-dismissing={dismissing || undefined}\n className={cn(\n alertVariants({ appearance, variant }),\n dismissing &&\n 'motion-safe:animate-out motion-safe:fade-out-0 motion-safe:slide-out-to-right-2',\n className,\n )}\n style={\n dismissing ? { animationDuration: `${dismissDuration}ms` } : undefined\n }\n onAnimationEnd={(e) => {\n if (dismissing && e.target === e.currentTarget) {\n onClose?.();\n }\n }}\n {...props}\n >\n {iconElement}\n\n <div className=\"flex flex-1 flex-col gap-0.5 min-w-0\">\n {title && <AlertTitle>{title}</AlertTitle>}\n {description && <AlertDescription>{description}</AlertDescription>}\n {children}\n </div>\n\n {action && (\n <Button\n size=\"xs\"\n shape=\"rounded\"\n onClick={action.onClick}\n {...getActionButtonProps()}\n {...action.props}\n >\n {action.label}\n </Button>\n )}\n\n {closable && (\n <button\n type=\"button\"\n onClick={handleClose}\n className={cn(\n 'relative shrink-0 size-6 inline-flex items-center justify-center rounded transition-all duration-200 ease-smooth motion-reduce:transition-none',\n 'after:absolute after:inset-[-10px] after:content-[\"\"]',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:outline-none',\n 'active:scale-90 motion-reduce:active:scale-100',\n getCloseButtonClass(),\n )}\n aria-label=\"Dismiss alert\"\n >\n <X className=\"size-3.5\" />\n </button>\n )}\n </div>\n );\n },\n);\n\nAlert.displayName = 'Alert';\n\n/** Alert title component */\nconst AlertTitle = React.forwardRef<\n HTMLHeadingElement,\n React.ComponentProps<'h5'>\n>(({ className, children, ...props }, ref) => (\n <h5\n ref={ref}\n data-slot=\"alert-title\"\n className={cn('font-medium leading-5', className)}\n {...props}\n >\n {children}\n </h5>\n));\n\nAlertTitle.displayName = 'AlertTitle';\n\n/** Alert description component */\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.ComponentProps<'p'>\n>(({ className, children, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"alert-description\"\n className={cn('text-sm leading-5 opacity-80', className)}\n {...props}\n >\n {children}\n </p>\n));\n\nAlertDescription.displayName = 'AlertDescription';\n\nexport type { AlertAppearance, AlertVariant };\nexport { Alert, AlertDescription, AlertTitle, alertVariants };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index110.js","names":[],"sources":["../src/components/molecules/feedback/Alert/Alert.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { AlertCircle, AlertTriangle, CheckCircle, Info, X } from 'lucide-react';\nimport * as React from 'react';\nimport { Button, type ButtonProps } from '@/components/atoms/buttons/Button';\nimport { cn } from '@/lib/utils';\n\nconst alertVariants = cva(\n 'relative flex gap-3 rounded-lg px-4 py-3 text-sm motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-top-1 [&>svg]:shrink-0 [&>svg]:size-4 [&>svg]:mt-0.5 [&>svg]:motion-safe:animate-in [&>svg]:motion-safe:fade-in-0 [&>svg]:motion-safe:zoom-in-75 [&>svg]:motion-safe:duration-300 [&>svg]:motion-safe:delay-75',\n {\n variants: {\n appearance: {\n outline: 'bg-card border',\n solid: '',\n soft: '',\n },\n variant: {\n default: '',\n info: '',\n success: '',\n warning: '',\n destructive: '',\n },\n },\n compoundVariants: [\n // ===== OUTLINE =====\n {\n appearance: 'outline',\n variant: 'default',\n className:\n 'border-border text-card-foreground [&>svg]:text-muted-foreground',\n },\n {\n appearance: 'outline',\n variant: 'info',\n className: 'border-info text-info [&>svg]:text-info',\n },\n {\n appearance: 'outline',\n variant: 'success',\n className: 'border-success text-success [&>svg]:text-success',\n },\n {\n appearance: 'outline',\n variant: 'warning',\n className: 'border-warning text-warning [&>svg]:text-warning',\n },\n {\n appearance: 'outline',\n variant: 'destructive',\n className:\n 'border-destructive text-destructive [&>svg]:text-destructive',\n },\n\n // ===== SOLID =====\n {\n appearance: 'solid',\n variant: 'default',\n className:\n 'bg-primary text-primary-foreground [&>svg]:text-primary-foreground',\n },\n {\n appearance: 'solid',\n variant: 'info',\n className: 'bg-info text-info-foreground [&>svg]:text-info-foreground',\n },\n {\n appearance: 'solid',\n variant: 'success',\n className:\n 'bg-success text-success-foreground [&>svg]:text-success-foreground',\n },\n {\n appearance: 'solid',\n variant: 'warning',\n className:\n 'bg-warning text-warning-foreground [&>svg]:text-warning-foreground',\n },\n {\n appearance: 'solid',\n variant: 'destructive',\n className:\n 'bg-destructive text-destructive-foreground [&>svg]:text-destructive-foreground',\n },\n\n // ===== SOFT =====\n {\n appearance: 'soft',\n variant: 'default',\n className:\n 'bg-primary/10 text-card-foreground [&>svg]:text-primary dark:bg-primary/20',\n },\n {\n appearance: 'soft',\n variant: 'info',\n className: 'bg-info/10 text-info [&>svg]:text-info dark:bg-info/20',\n },\n {\n appearance: 'soft',\n variant: 'success',\n className:\n 'bg-success/10 text-success [&>svg]:text-success dark:bg-success/20',\n },\n {\n appearance: 'soft',\n variant: 'warning',\n className:\n 'bg-warning/10 text-warning [&>svg]:text-warning dark:bg-warning/20',\n },\n {\n appearance: 'soft',\n variant: 'destructive',\n className:\n 'bg-destructive/10 text-destructive [&>svg]:text-destructive dark:bg-destructive/20',\n },\n ],\n defaultVariants: {\n appearance: 'outline',\n variant: 'default',\n },\n },\n);\n\ntype AlertVariant = NonNullable<VariantProps<typeof alertVariants>['variant']>;\ntype AlertAppearance = NonNullable<\n VariantProps<typeof alertVariants>['appearance']\n>;\n\n/** Default icon mapping for each variant */\nconst defaultIcons: Record<AlertVariant, React.ReactNode> = {\n default: <AlertCircle />,\n info: <Info />,\n success: <CheckCircle />,\n warning: <AlertTriangle />,\n destructive: <AlertTriangle />,\n};\n\n/** Maps alert variant to button variant for soft/outline appearances */\nconst alertToButtonVariant = {\n default: 'secondary',\n info: 'info',\n success: 'success',\n warning: 'warning',\n destructive: 'destructive',\n} as const;\n\n/** Maps alert variant to button variant for soft appearance (uses primary for default) */\nconst alertToSolidButtonVariant = {\n default: 'primary',\n info: 'info',\n success: 'success',\n warning: 'warning',\n destructive: 'destructive',\n} as const;\n\n/** Maps alert variant to text color class */\nconst variantTextClass = {\n default: 'text-primary',\n info: 'text-info',\n success: 'text-success',\n warning: 'text-warning',\n destructive: 'text-destructive',\n} as const;\n\nexport interface AlertProps\n extends Omit<React.ComponentProps<'div'>, 'title'>,\n VariantProps<typeof alertVariants> {\n /** Alert title - displayed prominently */\n title?: React.ReactNode;\n /** Alert description - secondary text */\n description?: React.ReactNode;\n /** Custom icon to display. Set to `false` to hide the icon entirely */\n icon?: React.ReactNode | false;\n /** Show close button */\n closable?: boolean;\n /** Callback when close button is clicked */\n onClose?: () => void;\n /** Action button configuration */\n action?: {\n label: string;\n onClick?: () => void;\n props?: Omit<ButtonProps, 'children' | 'onClick'>;\n };\n /** Duration of dismiss animation in ms (0 to disable) */\n dismissDuration?: number;\n}\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n className,\n appearance = 'outline',\n variant = 'default',\n title,\n description,\n icon,\n closable = false,\n onClose,\n action,\n children,\n dismissDuration = 200,\n ...props\n },\n ref,\n ) => {\n const [dismissing, setDismissing] = React.useState(false);\n const internalRef = React.useRef<HTMLDivElement>(null);\n const resolvedVariant = variant ?? 'default';\n\n // Merge refs\n React.useImperativeHandle(ref, () => internalRef.current as HTMLDivElement);\n\n const showIcon = icon !== false;\n const iconElement = showIcon ? icon || defaultIcons[resolvedVariant] : null;\n\n const handleClose = React.useCallback(() => {\n if (dismissDuration <= 0) {\n onClose?.();\n return;\n }\n // Use ref-based window access per ADR-010\n const win = internalRef.current?.ownerDocument.defaultView;\n const prefersReducedMotion =\n win?.matchMedia('(prefers-reduced-motion: reduce)').matches ?? false;\n if (prefersReducedMotion) {\n onClose?.();\n return;\n }\n setDismissing(true);\n }, [dismissDuration, onClose]);\n\n // Determine button styling based on appearance and variant\n const getActionButtonProps = (): Partial<ButtonProps> => {\n if (appearance === 'solid') {\n return {\n appearance: 'outline',\n variant: 'secondary',\n className: cn(\n 'bg-background/90 border-background/20 hover:bg-background',\n variantTextClass[resolvedVariant],\n ),\n };\n }\n if (appearance === 'soft') {\n return {\n appearance: 'solid',\n variant: alertToSolidButtonVariant[resolvedVariant],\n };\n }\n // outline appearance\n return {\n appearance: 'outline',\n variant: alertToButtonVariant[resolvedVariant],\n };\n };\n\n const alertRole =\n resolvedVariant === 'destructive' || resolvedVariant === 'warning'\n ? 'alert'\n : 'status';\n\n const getCloseButtonClass = () => {\n if (appearance === 'solid') {\n return 'text-current/80 hover:text-current hover:bg-current/10';\n }\n if (appearance === 'outline' || resolvedVariant === 'default') {\n return 'text-muted-foreground hover:text-foreground hover:bg-muted';\n }\n // soft appearance with colored variant\n return cn('hover:bg-current/10', variantTextClass[resolvedVariant]);\n };\n\n return (\n <div\n ref={internalRef}\n role={alertRole}\n data-slot=\"alert\"\n data-dismissing={dismissing || undefined}\n className={cn(\n alertVariants({ appearance, variant }),\n dismissing &&\n 'motion-safe:animate-out motion-safe:fade-out-0 motion-safe:slide-out-to-right-2',\n className,\n )}\n style={\n dismissing ? { animationDuration: `${dismissDuration}ms` } : undefined\n }\n onAnimationEnd={(e) => {\n if (dismissing && e.target === e.currentTarget) {\n onClose?.();\n }\n }}\n {...props}\n >\n {iconElement}\n\n <div className=\"flex flex-1 flex-col gap-0.5 min-w-0\">\n {title && <AlertTitle>{title}</AlertTitle>}\n {description && <AlertDescription>{description}</AlertDescription>}\n {children}\n </div>\n\n {action && (\n <Button\n size=\"xs\"\n shape=\"rounded\"\n onClick={action.onClick}\n {...getActionButtonProps()}\n {...action.props}\n >\n {action.label}\n </Button>\n )}\n\n {closable && (\n <button\n type=\"button\"\n onClick={handleClose}\n className={cn(\n 'relative shrink-0 size-6 inline-flex items-center justify-center rounded transition-all duration-200 ease-smooth motion-reduce:transition-none',\n 'after:absolute after:inset-[-10px] after:content-[\"\"]',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:outline-none',\n 'active:scale-90 motion-reduce:active:scale-100',\n getCloseButtonClass(),\n )}\n aria-label=\"Dismiss alert\"\n >\n <X className=\"size-3.5\" />\n </button>\n )}\n </div>\n );\n },\n);\n\nAlert.displayName = 'Alert';\n\n/** Alert title component */\nconst AlertTitle = React.forwardRef<\n HTMLHeadingElement,\n React.ComponentProps<'h5'>\n>(({ className, children, ...props }, ref) => (\n <h5\n ref={ref}\n data-slot=\"alert-title\"\n className={cn('font-medium leading-5', className)}\n {...props}\n >\n {children}\n </h5>\n));\n\nAlertTitle.displayName = 'AlertTitle';\n\n/** Alert description component */\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.ComponentProps<'p'>\n>(({ className, children, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"alert-description\"\n className={cn('text-sm leading-5 opacity-80', className)}\n {...props}\n >\n {children}\n </p>\n));\n\nAlertDescription.displayName = 'AlertDescription';\n\nexport type { AlertAppearance, AlertVariant };\nexport { Alert, AlertDescription, AlertTitle, alertVariants };\n"],"mappings":";;;;;;;AAMA,IAAM,gBAAgB,IACpB,0UACA;CACE,UAAU;EACR,YAAY;GACV,SAAS;GACT,OAAO;GACP,MAAM;EACR;EACA,SAAS;GACP,SAAS;GACT,MAAM;GACN,SAAS;GACT,SAAS;GACT,aAAa;EACf;CACF;CACA,kBAAkB;EAEhB;GACE,YAAY;GACZ,SAAS;GACT,WACE;EACJ;EACA;GACE,YAAY;GACZ,SAAS;GACT,WAAW;EACb;EACA;GACE,YAAY;GACZ,SAAS;GACT,WAAW;EACb;EACA;GACE,YAAY;GACZ,SAAS;GACT,WAAW;EACb;EACA;GACE,YAAY;GACZ,SAAS;GACT,WACE;EACJ;EAGA;GACE,YAAY;GACZ,SAAS;GACT,WACE;EACJ;EACA;GACE,YAAY;GACZ,SAAS;GACT,WAAW;EACb;EACA;GACE,YAAY;GACZ,SAAS;GACT,WACE;EACJ;EACA;GACE,YAAY;GACZ,SAAS;GACT,WACE;EACJ;EACA;GACE,YAAY;GACZ,SAAS;GACT,WACE;EACJ;EAGA;GACE,YAAY;GACZ,SAAS;GACT,WACE;EACJ;EACA;GACE,YAAY;GACZ,SAAS;GACT,WAAW;EACb;EACA;GACE,YAAY;GACZ,SAAS;GACT,WACE;EACJ;EACA;GACE,YAAY;GACZ,SAAS;GACT,WACE;EACJ;EACA;GACE,YAAY;GACZ,SAAS;GACT,WACE;EACJ;CACF;CACA,iBAAiB;EACf,YAAY;EACZ,SAAS;CACX;AACF,CACF;;AAQA,IAAM,eAAsD;CAC1D,SAAS,oBAAC,aAAD,CAAc,CAAA;CACvB,MAAM,oBAAC,MAAD,CAAO,CAAA;CACb,SAAS,oBAAC,aAAD,CAAc,CAAA;CACvB,SAAS,oBAAC,eAAD,CAAgB,CAAA;CACzB,aAAa,oBAAC,eAAD,CAAgB,CAAA;AAC/B;;AAGA,IAAM,uBAAuB;CAC3B,SAAS;CACT,MAAM;CACN,SAAS;CACT,SAAS;CACT,aAAa;AACf;;AAGA,IAAM,4BAA4B;CAChC,SAAS;CACT,MAAM;CACN,SAAS;CACT,SAAS;CACT,aAAa;AACf;;AAGA,IAAM,mBAAmB;CACvB,SAAS;CACT,MAAM;CACN,SAAS;CACT,SAAS;CACT,aAAa;AACf;AAyBA,IAAM,QAAQ,QAAM,YAEhB,EACE,WACA,aAAa,WACb,UAAU,WACV,OACA,aACA,MACA,WAAW,OACX,SACA,QACA,UACA,kBAAkB,KAClB,GAAG,SAEL,QACG;CACH,MAAM,CAAC,YAAY,iBAAiB,QAAM,SAAS,KAAK;CACxD,MAAM,cAAc,QAAM,OAAuB,IAAI;CACrD,MAAM,kBAAkB,WAAW;CAGnC,QAAM,oBAAoB,WAAW,YAAY,OAAyB;CAG1E,MAAM,cADW,SAAS,QACK,QAAQ,aAAa,mBAAmB;CAEvE,MAAM,cAAc,QAAM,kBAAkB;EAC1C,IAAI,mBAAmB,GAAG;GACxB,UAAU;GACV;EACF;EAKA,KAHY,YAAY,SAAS,cAAc,YAAA,EAExC,WAAW,kCAAkC,CAAC,CAAC,WAAW,OACvC;GACxB,UAAU;GACV;EACF;EACA,cAAc,IAAI;CACpB,GAAG,CAAC,iBAAiB,OAAO,CAAC;CAG7B,MAAM,6BAAmD;EACvD,IAAI,eAAe,SACjB,OAAO;GACL,YAAY;GACZ,SAAS;GACT,WAAW,GACT,6DACA,iBAAiB,gBACnB;EACF;EAEF,IAAI,eAAe,QACjB,OAAO;GACL,YAAY;GACZ,SAAS,0BAA0B;EACrC;EAGF,OAAO;GACL,YAAY;GACZ,SAAS,qBAAqB;EAChC;CACF;CAEA,MAAM,YACJ,oBAAoB,iBAAiB,oBAAoB,YACrD,UACA;CAEN,MAAM,4BAA4B;EAChC,IAAI,eAAe,SACjB,OAAO;EAET,IAAI,eAAe,aAAa,oBAAoB,WAClD,OAAO;EAGT,OAAO,GAAG,uBAAuB,iBAAiB,gBAAgB;CACpE;CAEA,OACE,qBAAC,OAAD;EACE,KAAK;EACL,MAAM;EACN,aAAU;EACV,mBAAiB,cAAc,KAAA;EAC/B,WAAW,GACT,cAAc;GAAE;GAAY;EAAQ,CAAC,GACrC,cACE,mFACF,SACF;EACA,OACE,aAAa,EAAE,mBAAmB,GAAG,gBAAgB,IAAI,IAAI,KAAA;EAE/D,iBAAiB,MAAM;GACrB,IAAI,cAAc,EAAE,WAAW,EAAE,eAC/B,UAAU;EAEd;EACA,GAAI;YAnBN;GAqBG;GAED,qBAAC,OAAD;IAAK,WAAU;cAAf;KACG,SAAS,oBAAC,YAAD,EAAA,UAAa,MAAkB,CAAA;KACxC,eAAe,oBAAC,kBAAD,EAAA,UAAmB,YAA8B,CAAA;KAChE;IACE;;GAEJ,UACC,oBAAC,QAAD;IACE,MAAK;IACL,OAAM;IACN,SAAS,OAAO;IAChB,GAAI,qBAAqB;IACzB,GAAI,OAAO;cAEV,OAAO;GACF,CAAA;GAGT,YACC,oBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,WAAW,GACT,kJACA,2DACA,uGACA,kDACA,oBAAoB,CACtB;IACA,cAAW;cAEX,oBAAC,GAAD,EAAG,WAAU,WAAY,CAAA;GACnB,CAAA;EAEP;;AAET,CACF;AAEA,MAAM,cAAc;;AAGpB,IAAM,aAAa,QAAM,YAGtB,EAAE,WAAW,UAAU,GAAG,SAAS,QACpC,oBAAC,MAAD;CACO;CACL,aAAU;CACV,WAAW,GAAG,yBAAyB,SAAS;CAChD,GAAI;CAEH;AACC,CAAA,CACL;AAED,WAAW,cAAc;;AAGzB,IAAM,mBAAmB,QAAM,YAG5B,EAAE,WAAW,UAAU,GAAG,SAAS,QACpC,oBAAC,KAAD;CACO;CACL,aAAU;CACV,WAAW,GAAG,gCAAgC,SAAS;CACvD,GAAI;CAEH;AACA,CAAA,CACJ;AAED,iBAAiB,cAAc"}
|
package/dist/index134.js
CHANGED
|
@@ -43,10 +43,10 @@ var sizeMap = {
|
|
|
43
43
|
};
|
|
44
44
|
var activeColorMap = {
|
|
45
45
|
primary: "bg-primary text-primary-foreground",
|
|
46
|
-
info: "bg-info text-
|
|
47
|
-
warning: "bg-warning text-
|
|
48
|
-
success: "bg-success text-
|
|
49
|
-
destructive: "bg-destructive text-
|
|
46
|
+
info: "bg-info text-info-foreground",
|
|
47
|
+
warning: "bg-warning text-warning-foreground",
|
|
48
|
+
success: "bg-success text-success-foreground",
|
|
49
|
+
destructive: "bg-destructive text-destructive-foreground"
|
|
50
50
|
};
|
|
51
51
|
function getPaginationSize(size) {
|
|
52
52
|
switch (size) {
|
package/dist/index134.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index134.js","names":[],"sources":["../src/components/molecules/navigation/Pagination/Pagination.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport {\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n MoreHorizontal,\n} from 'lucide-react';\nimport type * as React from 'react';\nimport { cn } from '@/lib/utils';\n\n/* ============================================\n Types\n ============================================ */\n\ntype PaginationSize = 'xs' | 'sm' | 'md' | 'lg';\n\ntype PaginationVariant = 'default' | 'outlined';\n\ntype PaginationShape = 'square' | 'rounded' | 'circle';\n\ntype PrevNextStyle = 'icon-text' | 'icon-only';\n\ntype PaginationAlignment = 'left' | 'center' | 'right';\n\ntype ActiveColor = 'primary' | 'info' | 'warning' | 'success' | 'destructive';\n\ntype PaginationType =\n | 'default'\n | 'previous-next'\n | 'with-buttons'\n | 'combine'\n | 'combine-steps'\n | 'minimal'\n | 'first-last'\n | 'page-number'\n | 'left-right-chevron'\n | 'page-dropdown'\n | 'page-dropdown-nav'\n | 'with-underline'\n | 'outline'\n | 'box-style'\n // Legacy compat\n | 'page-default'\n | 'page-minimal'\n | 'card-default'\n | 'card-minimal'\n | 'card-button-group';\n\n/* ============================================\n Size & Color Maps\n ============================================ */\n\nconst sizeMap = {\n xs: {\n h: 'h-[26px]',\n sq: 'size-[26px]',\n px: 'px-2',\n pxNav: 'px-2',\n gap: 'gap-1.5',\n text: 'text-xs',\n icon: 'size-4',\n },\n sm: {\n h: 'h-8',\n sq: 'size-8',\n px: 'px-3',\n pxNav: 'px-3',\n gap: 'gap-1.5',\n text: 'text-sm',\n icon: 'size-4',\n },\n md: {\n h: 'h-9',\n sq: 'size-9',\n px: 'px-3.5',\n pxNav: 'px-4',\n gap: 'gap-2',\n text: 'text-sm',\n icon: 'size-4',\n },\n lg: {\n h: 'h-10',\n sq: 'size-10',\n px: 'px-4',\n pxNav: 'px-6',\n gap: 'gap-2',\n text: 'text-sm',\n icon: 'size-4',\n },\n} as const;\n\nconst activeColorMap: Record<ActiveColor, string> = {\n primary: 'bg-primary text-primary-foreground',\n info: 'bg-info text-primary-foreground',\n warning: 'bg-warning text-primary-foreground',\n success: 'bg-success text-primary-foreground',\n destructive: 'bg-destructive text-primary-foreground',\n};\n\nfunction getPaginationSize(size: PaginationSize): PaginationSize {\n switch (size) {\n case 'xs':\n case 'sm':\n case 'md':\n case 'lg':\n return size;\n default:\n return 'md';\n }\n}\n\nconst variantClasses = (v: PaginationVariant) =>\n v === 'outlined'\n ? 'border border-border bg-background/60 backdrop-blur-sm text-secondary-foreground hover:bg-muted'\n : 'text-secondary-foreground hover:bg-muted';\n\nconst shapeRadius = (shape: PaginationShape) =>\n shape === 'rounded' ? 'rounded-full' : 'rounded-xl';\n\nconst iconNavIcons = {\n previous: ChevronLeft,\n next: ChevronRight,\n first: ChevronsLeft,\n last: ChevronsRight,\n} as const;\n\nconst iconNavLabels = {\n previous: 'Go to previous page',\n next: 'Go to next page',\n first: 'Go to first page',\n last: 'Go to last page',\n} as const;\n\nconst DEFAULT_DOT_TOTAL = 3;\nconst DEFAULT_PAGE_TOTAL = 10;\nconst DEFAULT_CURRENT_PAGE = 1;\nconst DEFAULT_SIBLING_COUNT = 1;\nconst DEFAULT_PER_PAGE_OPTIONS = [10, 20, 50];\n\nfunction getPositiveInteger(value: number | undefined, fallback: number) {\n return typeof value === 'number' && Number.isFinite(value) && value > 0\n ? Math.floor(value)\n : fallback;\n}\n\nfunction getNonNegativeInteger(value: number | undefined, fallback: number) {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0\n ? Math.floor(value)\n : fallback;\n}\n\nfunction clampInteger(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, Math.floor(value)));\n}\n\nfunction getCurrentPage(value: number | undefined, totalPages: number) {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return DEFAULT_CURRENT_PAGE;\n }\n\n return clampInteger(value, 1, totalPages);\n}\n\nfunction getDotCurrent(value: number | undefined, total: number) {\n if (total <= 0) {\n return 0;\n }\n\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return 0;\n }\n\n return clampInteger(value, 0, total - 1);\n}\n\nfunction getPerPageOptions(options: number[] | undefined) {\n if (!options) {\n return DEFAULT_PER_PAGE_OPTIONS;\n }\n\n const normalizedOptions = Array.from(\n new Set(\n options\n .filter((option) => Number.isFinite(option) && option > 0)\n .map((option) => Math.floor(option)),\n ),\n );\n\n return normalizedOptions.length > 0\n ? normalizedOptions\n : DEFAULT_PER_PAGE_OPTIONS;\n}\n\nfunction getItemsPerPage(value: number | undefined, options: number[]) {\n if (typeof value === 'number' && Number.isFinite(value) && value > 0) {\n return Math.floor(value);\n }\n\n return options[0] ?? DEFAULT_PER_PAGE_OPTIONS[0];\n}\n\n/* ============================================\n PaginationDots (unchanged)\n ============================================ */\n\nconst paginationDotsVariants = cva('flex items-center justify-center', {\n variants: {\n size: {\n md: '',\n lg: '',\n },\n style: {\n dot: '',\n line: '',\n },\n framed: {\n true: 'rounded-full bg-card dark:bg-muted',\n false: '',\n },\n },\n compoundVariants: [\n { size: 'md', style: 'dot', framed: true, className: 'gap-3 p-2' },\n { size: 'md', style: 'line', framed: true, className: 'w-40 gap-2 p-2' },\n { size: 'lg', style: 'dot', framed: true, className: 'gap-4 p-3' },\n { size: 'lg', style: 'line', framed: true, className: 'w-44 gap-3 p-3' },\n { size: 'md', style: 'dot', framed: false, className: 'gap-3' },\n { size: 'md', style: 'line', framed: false, className: 'w-36 gap-2' },\n { size: 'lg', style: 'dot', framed: false, className: 'gap-4' },\n { size: 'lg', style: 'line', framed: false, className: 'w-38 gap-3' },\n ],\n defaultVariants: {\n size: 'md',\n style: 'dot',\n framed: false,\n },\n});\n\nconst paginationDotIndicatorVariants = cva('shrink-0 rounded-full', {\n variants: {\n size: {\n md: '',\n lg: '',\n },\n style: {\n dot: '',\n line: 'min-h-px min-w-px grow basis-0',\n },\n current: {\n true: 'bg-primary/10 dark:bg-primary',\n false: 'bg-surface-2 dark:bg-muted',\n },\n },\n compoundVariants: [\n { size: 'md', style: 'dot', className: 'size-2' },\n { size: 'lg', style: 'dot', className: 'size-2.5' },\n { size: 'md', style: 'line', className: 'h-1.5' },\n { size: 'lg', style: 'line', className: 'h-2' },\n ],\n defaultVariants: {\n size: 'md',\n style: 'dot',\n current: false,\n },\n});\n\ntype PaginationDotsStyle = 'dot' | 'line';\ntype PaginationDotsSize = 'md' | 'lg';\n\ninterface PaginationDotsProps\n extends Omit<React.ComponentProps<'div'>, 'style'> {\n total?: number;\n current?: number;\n variant?: PaginationDotsStyle;\n size?: PaginationDotsSize;\n framed?: boolean;\n onDotClick?: (index: number) => void;\n}\n\nfunction PaginationDots({\n className,\n total = 3,\n current = 0,\n variant = 'dot',\n size = 'md',\n framed = false,\n onDotClick,\n ...props\n}: PaginationDotsProps) {\n const safeTotal = getNonNegativeInteger(total, DEFAULT_DOT_TOTAL);\n const safeCurrent = getDotCurrent(current, safeTotal);\n\n return (\n <div\n className={cn(\n paginationDotsVariants({ size, style: variant, framed }),\n className,\n )}\n role=\"tablist\"\n aria-label=\"Pagination dots\"\n {...props}\n >\n {Array.from({ length: safeTotal }, (_, index) => index + 1).map(\n (pageNumber) => {\n const pageIndex = pageNumber - 1;\n return (\n <button\n key={pageNumber}\n type=\"button\"\n role=\"tab\"\n aria-selected={pageIndex === safeCurrent}\n aria-label={`Go to page ${pageNumber}`}\n onClick={() => onDotClick?.(pageIndex)}\n className={cn(\n paginationDotIndicatorVariants({\n size,\n style: variant,\n current: pageIndex === safeCurrent,\n }),\n onDotClick &&\n 'cursor-pointer transition-colors duration-200 ease-smooth motion-reduce:transition-none',\n !onDotClick && 'cursor-default',\n )}\n />\n );\n },\n )}\n </div>\n );\n}\n\nPaginationDots.displayName = 'PaginationDots';\n\n/* ============================================\n Helper: generatePageNumbers\n ============================================ */\n\ntype PaginationPageItem = number | 'ellipsis';\n\nfunction generatePageNumbers(\n currentPage: number,\n totalPages: number,\n siblingCount: number,\n): PaginationPageItem[] {\n const safeTotalPages = getPositiveInteger(totalPages, DEFAULT_CURRENT_PAGE);\n const safeCurrentPage = getCurrentPage(currentPage, safeTotalPages);\n const safeSiblingCount = getNonNegativeInteger(\n siblingCount,\n DEFAULT_SIBLING_COUNT,\n );\n const totalPageNumbers = safeSiblingCount * 2 + 5;\n\n if (safeTotalPages <= totalPageNumbers) {\n return Array.from({ length: safeTotalPages }, (_, i) => i + 1);\n }\n\n const leftSiblingIndex = Math.max(safeCurrentPage - safeSiblingCount, 1);\n const rightSiblingIndex = Math.min(\n safeCurrentPage + safeSiblingCount,\n safeTotalPages,\n );\n\n const shouldShowLeftEllipsis = leftSiblingIndex > 2;\n const shouldShowRightEllipsis = rightSiblingIndex < safeTotalPages - 1;\n\n if (!shouldShowLeftEllipsis && shouldShowRightEllipsis) {\n const leftItemCount = 3 + 2 * safeSiblingCount;\n const leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1);\n return [...leftRange, 'ellipsis', safeTotalPages];\n }\n\n if (shouldShowLeftEllipsis && !shouldShowRightEllipsis) {\n const rightItemCount = 3 + 2 * safeSiblingCount;\n const rightRange = Array.from(\n { length: rightItemCount },\n (_, i) => safeTotalPages - rightItemCount + i + 1,\n );\n return [1, 'ellipsis', ...rightRange];\n }\n\n const middleRange = Array.from(\n { length: rightSiblingIndex - leftSiblingIndex + 1 },\n (_, i) => leftSiblingIndex + i,\n );\n return [1, 'ellipsis', ...middleRange, 'ellipsis', safeTotalPages];\n}\n\nfunction getPaginationPageKey(\n page: PaginationPageItem,\n pages: PaginationPageItem[],\n position: number,\n): React.Key {\n if (page !== 'ellipsis') return page;\n\n return `ellipsis:${pages[position - 1] ?? 'start'}:${pages[position + 1] ?? 'end'}`;\n}\n\n/* ============================================\n Shared Sub-components\n ============================================ */\n\nconst btnBase =\n 'relative inline-flex items-center justify-center font-medium shrink-0 select-none outline-none transition-[color,background-color,border-color,box-shadow] duration-150 ease-out focus-visible:ring-2 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50';\n\nconst expandedHitAreaClass =\n 'before:absolute before:left-1/2 before:top-1/2 before:h-full before:min-h-11 before:w-full before:min-w-11 before:-translate-x-1/2 before:-translate-y-1/2 before:rounded-[inherit] before:content-[\"\"]';\n\ninterface PageButtonProps {\n page: number;\n isActive: boolean;\n size: PaginationSize;\n variant: PaginationVariant;\n shape: PaginationShape;\n activeColor: ActiveColor;\n onClick: () => void;\n}\n\nfunction PageButton({\n page,\n isActive,\n size,\n variant,\n shape,\n activeColor,\n onClick,\n}: PageButtonProps) {\n const s = sizeMap[size];\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-current={isActive ? 'page' : undefined}\n className={cn(\n btnBase,\n expandedHitAreaClass,\n s.sq,\n s.text,\n shapeRadius(shape),\n isActive ? activeColorMap[activeColor] : variantClasses(variant),\n )}\n >\n {page}\n </button>\n );\n}\n\nPageButton.displayName = 'PageButton';\n\nfunction EllipsisIndicator({\n size,\n shape,\n}: {\n size: PaginationSize;\n shape: PaginationShape;\n}) {\n const s = sizeMap[size];\n return (\n <span\n aria-hidden\n className={cn(\n 'inline-flex items-center justify-center text-muted-foreground shrink-0',\n s.sq,\n shapeRadius(shape),\n )}\n >\n <MoreHorizontal className={s.icon} />\n </span>\n );\n}\n\nEllipsisIndicator.displayName = 'EllipsisIndicator';\n\ninterface NavButtonProps {\n direction: 'previous' | 'next';\n disabled: boolean;\n size: PaginationSize;\n variant: PaginationVariant;\n prevNextStyle: PrevNextStyle;\n text: string;\n onClick: () => void;\n}\n\nfunction NavButton({\n direction,\n disabled,\n size,\n variant,\n prevNextStyle,\n text,\n onClick,\n}: NavButtonProps) {\n const s = sizeMap[size];\n const isIconOnly = prevNextStyle === 'icon-only';\n const Icon = direction === 'previous' ? ChevronLeft : ChevronRight;\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={\n direction === 'previous' ? 'Go to previous page' : 'Go to next page'\n }\n className={cn(\n btnBase,\n expandedHitAreaClass,\n 'rounded-xl',\n isIconOnly ? s.sq : [s.h, s.pxNav, s.gap],\n s.text,\n variantClasses(variant),\n )}\n >\n {direction === 'previous' && (\n <Icon className={cn(s.icon, 'rtl:rotate-180')} />\n )}\n {!isIconOnly && <span>{text}</span>}\n {direction === 'next' && (\n <Icon className={cn(s.icon, 'rtl:rotate-180')} />\n )}\n </button>\n );\n}\n\nNavButton.displayName = 'NavButton';\n\nfunction IconNavButton({\n direction,\n disabled,\n size,\n onClick,\n className: extraClassName,\n}: {\n direction: 'previous' | 'next' | 'first' | 'last';\n disabled: boolean;\n size: PaginationSize;\n onClick: () => void;\n className?: string;\n}) {\n const s = sizeMap[size];\n const Icon = iconNavIcons[direction];\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={iconNavLabels[direction]}\n className={cn(\n btnBase,\n expandedHitAreaClass,\n 'rounded-xl text-secondary-foreground hover:bg-muted',\n s.sq,\n extraClassName,\n )}\n >\n <Icon className={cn(s.icon, 'rtl:rotate-180')} />\n </button>\n );\n}\n\nIconNavButton.displayName = 'IconNavButton';\n\nfunction PageInfo({\n currentPage,\n totalPages,\n size,\n}: {\n currentPage: number;\n totalPages: number;\n size: PaginationSize;\n}) {\n const s = sizeMap[size];\n return (\n <span className={cn('text-muted-foreground whitespace-nowrap', s.text)}>\n Page <span className=\"text-foreground\">{currentPage}</span> of{' '}\n <span className=\"text-foreground\">{totalPages}</span>\n </span>\n );\n}\n\nPageInfo.displayName = 'PageInfo';\n\nfunction PageNumberButtons({\n currentPage,\n totalPages,\n siblingCount,\n size,\n variant,\n shape,\n activeColor,\n onPageChange,\n}: {\n currentPage: number;\n totalPages: number;\n siblingCount: number;\n size: PaginationSize;\n variant: PaginationVariant;\n shape: PaginationShape;\n activeColor: ActiveColor;\n onPageChange: (page: number) => void;\n}) {\n const pages = generatePageNumbers(currentPage, totalPages, siblingCount);\n return (\n <>\n {pages.map((page, position) =>\n page === 'ellipsis' ? (\n <EllipsisIndicator\n key={getPaginationPageKey(page, pages, position)}\n size={size}\n shape={shape}\n />\n ) : (\n <PageButton\n key={page}\n page={page}\n isActive={page === currentPage}\n size={size}\n variant={variant}\n shape={shape}\n activeColor={activeColor}\n onClick={() => onPageChange(page)}\n />\n ),\n )}\n </>\n );\n}\n\n/* ============================================\n Shared Props for Type Components\n ============================================ */\n\ninterface TypeComponentProps {\n currentPage: number;\n totalPages: number;\n siblingCount: number;\n size: PaginationSize;\n variant: PaginationVariant;\n shape: PaginationShape;\n prevNextStyle: PrevNextStyle;\n activeColor: ActiveColor;\n previousText: string;\n nextText: string;\n onPageChange: (page: number) => void;\n showPageNumbers: boolean;\n itemsPerPage?: number;\n perPageOptions?: number[];\n onPerPageChange?: (perPage: number) => void;\n}\n\n/* ============================================\n Type: default\n < Previous 1 2 [3] 4 ... Next >\n ============================================ */\n\nfunction DefaultPagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n variant,\n shape,\n prevNextStyle,\n activeColor,\n previousText,\n nextText,\n onPageChange,\n showPageNumbers,\n}: TypeComponentProps) {\n return (\n <div className=\"flex items-center gap-1\">\n <NavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n variant={variant}\n prevNextStyle={prevNextStyle}\n text={previousText}\n onClick={() => onPageChange(currentPage - 1)}\n />\n {showPageNumbers && (\n <PageNumberButtons\n currentPage={currentPage}\n totalPages={totalPages}\n siblingCount={siblingCount}\n size={size}\n variant={variant}\n shape={shape}\n activeColor={activeColor}\n onPageChange={onPageChange}\n />\n )}\n <NavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n variant={variant}\n prevNextStyle={prevNextStyle}\n text={nextText}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n );\n}\n\n/* ============================================\n Type: previous-next\n < Previous Next >\n ============================================ */\n\nfunction PreviousNextPagination({\n currentPage,\n totalPages,\n size,\n variant,\n previousText,\n nextText,\n onPageChange,\n}: TypeComponentProps) {\n return (\n <div className=\"flex w-full items-center justify-between\">\n <NavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n variant={variant}\n prevNextStyle=\"icon-text\"\n text={previousText}\n onClick={() => onPageChange(currentPage - 1)}\n />\n <NavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n variant={variant}\n prevNextStyle=\"icon-text\"\n text={nextText}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n );\n}\n\n/* ============================================\n Type: with-buttons\n [< Previous] [1] [2] [3] [4] [Next >]\n ============================================ */\n\nfunction WithButtonsPagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n shape,\n activeColor,\n previousText,\n nextText,\n onPageChange,\n showPageNumbers,\n}: TypeComponentProps) {\n return (\n <div className=\"flex items-start gap-1.5\">\n <NavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n variant=\"outlined\"\n prevNextStyle=\"icon-text\"\n text={previousText}\n onClick={() => onPageChange(currentPage - 1)}\n />\n {showPageNumbers && (\n <PageNumberButtons\n currentPage={currentPage}\n totalPages={totalPages}\n siblingCount={siblingCount}\n size={size}\n variant=\"outlined\"\n shape={shape}\n activeColor={activeColor}\n onPageChange={onPageChange}\n />\n )}\n <NavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n variant=\"outlined\"\n prevNextStyle=\"icon-text\"\n text={nextText}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n );\n}\n\n/* ============================================\n Type: combine\n [< | 1 | 2 | 3 | 4 | >]\n ============================================ */\n\nfunction CombinePagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n onPageChange,\n}: TypeComponentProps) {\n const pages = generatePageNumbers(currentPage, totalPages, siblingCount);\n const s = sizeMap[size];\n\n const cellBase = cn(btnBase, 'border-y border-s border-input', s.sq, s.text);\n\n return (\n <div className=\"inline-flex items-start\">\n <button\n type=\"button\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage <= 1}\n aria-label=\"Go to previous page\"\n className={cn(\n cellBase,\n 'rounded-s-lg text-secondary-foreground hover:bg-muted',\n )}\n >\n <ChevronLeft className={cn(s.icon, 'rtl:rotate-180')} />\n </button>\n\n {pages.map((page, position) => (\n <button\n key={getPaginationPageKey(page, pages, position)}\n type=\"button\"\n onClick={() => page !== 'ellipsis' && onPageChange(page as number)}\n disabled={page === 'ellipsis'}\n aria-current={page === currentPage ? 'page' : undefined}\n aria-label={page === 'ellipsis' ? 'More pages' : `Go to page ${page}`}\n className={cn(\n cellBase,\n page === currentPage\n ? 'bg-accent text-accent-foreground'\n : 'text-foreground hover:bg-muted',\n page === 'ellipsis' && 'pointer-events-none',\n )}\n >\n {page === 'ellipsis' ? <MoreHorizontal className={s.icon} /> : page}\n </button>\n ))}\n\n <button\n type=\"button\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage >= totalPages}\n aria-label=\"Go to next page\"\n className={cn(\n cellBase,\n 'rounded-e-lg border-e text-secondary-foreground hover:bg-muted',\n )}\n >\n <ChevronRight className={cn(s.icon, 'rtl:rotate-180')} />\n </button>\n </div>\n );\n}\n\n/* ============================================\n Type: combine-steps\n [< | 5/25 | >]\n ============================================ */\n\nfunction CombineStepsPagination({\n currentPage,\n totalPages,\n size,\n onPageChange,\n}: TypeComponentProps) {\n const s = sizeMap[size];\n\n const cellBase = cn(btnBase, 'border-y border-s border-border', s.sq);\n\n return (\n <div className=\"inline-flex items-start\">\n <button\n type=\"button\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage <= 1}\n aria-label=\"Go to previous page\"\n className={cn(\n cellBase,\n 'rounded-s-md text-secondary-foreground hover:bg-muted',\n )}\n >\n <ChevronLeft className={cn(s.icon, 'rtl:rotate-180')} />\n </button>\n\n <div\n className={cn(\n 'inline-flex items-center justify-center border-y border-s border-input',\n s.h,\n 'px-4',\n s.text,\n 'font-medium text-foreground',\n )}\n >\n <span>{currentPage}</span>\n <span className=\"text-muted-foreground\">/{totalPages}</span>\n </div>\n\n <button\n type=\"button\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage >= totalPages}\n aria-label=\"Go to next page\"\n className={cn(\n cellBase,\n 'rounded-e-md border-e text-secondary-foreground hover:bg-muted',\n )}\n >\n <ChevronRight className={cn(s.icon, 'rtl:rotate-180')} />\n </button>\n </div>\n );\n}\n\n/* ============================================\n Type: minimal\n < 1 2 [3] 4 >\n ============================================ */\n\nfunction MinimalPagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n shape,\n activeColor,\n onPageChange,\n showPageNumbers,\n}: TypeComponentProps) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <IconNavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n onClick={() => onPageChange(currentPage - 1)}\n />\n {showPageNumbers && (\n <PageNumberButtons\n currentPage={currentPage}\n totalPages={totalPages}\n siblingCount={siblingCount}\n size={size}\n variant=\"default\"\n shape={shape}\n activeColor={activeColor}\n onPageChange={onPageChange}\n />\n )}\n <IconNavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n );\n}\n\n/* ============================================\n Type: first-last\n << First < 1 2 [3] 4 > Last >>\n ============================================ */\n\nfunction FirstLastPagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n shape,\n activeColor,\n onPageChange,\n showPageNumbers,\n}: TypeComponentProps) {\n const s = sizeMap[size];\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <button\n type=\"button\"\n onClick={() => onPageChange(1)}\n disabled={currentPage <= 1}\n className={cn(\n btnBase,\n expandedHitAreaClass,\n 'rounded-md text-secondary-foreground hover:bg-muted',\n s.h,\n s.pxNav,\n s.gap,\n s.text,\n )}\n >\n <ChevronsLeft className={cn(s.icon, 'rtl:rotate-180')} />\n <span>First</span>\n </button>\n\n <IconNavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n onClick={() => onPageChange(currentPage - 1)}\n />\n\n {showPageNumbers && (\n <PageNumberButtons\n currentPage={currentPage}\n totalPages={totalPages}\n siblingCount={siblingCount}\n size={size}\n variant=\"default\"\n shape={shape}\n activeColor={activeColor}\n onPageChange={onPageChange}\n />\n )}\n\n <IconNavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n onClick={() => onPageChange(currentPage + 1)}\n />\n\n <button\n type=\"button\"\n onClick={() => onPageChange(totalPages)}\n disabled={currentPage >= totalPages}\n className={cn(\n btnBase,\n expandedHitAreaClass,\n 'rounded-md text-secondary-foreground hover:bg-muted',\n s.h,\n s.pxNav,\n s.gap,\n s.text,\n )}\n >\n <span>Last</span>\n <ChevronsRight className={cn(s.icon, 'rtl:rotate-180')} />\n </button>\n </div>\n );\n}\n\n/* ============================================\n Type: page-number\n Page 1 of 10 [< Previous] 1 2 3 4 [Next >]\n ============================================ */\n\nfunction PageNumberPagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n shape,\n activeColor,\n previousText,\n nextText,\n onPageChange,\n showPageNumbers,\n}: TypeComponentProps) {\n return (\n <div className=\"flex w-full items-center justify-between\">\n <PageInfo currentPage={currentPage} totalPages={totalPages} size={size} />\n <div className=\"flex items-center gap-1\">\n <NavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n variant=\"default\"\n prevNextStyle=\"icon-text\"\n text={previousText}\n onClick={() => onPageChange(currentPage - 1)}\n />\n {showPageNumbers && (\n <PageNumberButtons\n currentPage={currentPage}\n totalPages={totalPages}\n siblingCount={siblingCount}\n size={size}\n variant=\"default\"\n shape={shape}\n activeColor={activeColor}\n onPageChange={onPageChange}\n />\n )}\n <NavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n variant=\"default\"\n prevNextStyle=\"icon-text\"\n text={nextText}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n </div>\n );\n}\n\n/* ============================================\n Type: left-right-chevron\n < Page 1 of 10 >\n ============================================ */\n\nfunction LeftRightChevronPagination({\n currentPage,\n totalPages,\n size,\n onPageChange,\n}: TypeComponentProps) {\n return (\n <div className=\"flex w-full items-center justify-between gap-1\">\n <IconNavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n onClick={() => onPageChange(currentPage - 1)}\n />\n <PageInfo currentPage={currentPage} totalPages={totalPages} size={size} />\n <IconNavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n );\n}\n\n/* ============================================\n Type: page-dropdown\n Page 1 of 10 < Previous 1 2 [3] 4 [10/page v]\n ============================================ */\n\nfunction PageDropdownPagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n shape,\n activeColor,\n previousText,\n onPageChange,\n showPageNumbers,\n itemsPerPage,\n perPageOptions,\n onPerPageChange,\n}: TypeComponentProps) {\n const s = sizeMap[size];\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <PageInfo currentPage={currentPage} totalPages={totalPages} size={size} />\n\n <NavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n variant=\"default\"\n prevNextStyle=\"icon-text\"\n text={previousText}\n onClick={() => onPageChange(currentPage - 1)}\n />\n\n {showPageNumbers && (\n <PageNumberButtons\n currentPage={currentPage}\n totalPages={totalPages}\n siblingCount={siblingCount}\n size={size}\n variant=\"default\"\n shape={shape}\n activeColor={activeColor}\n onPageChange={onPageChange}\n />\n )}\n\n {onPerPageChange && (\n <div\n className={cn(\n 'relative inline-flex items-center justify-center rounded-md border border-border font-medium',\n s.h,\n 'px-4',\n s.gap,\n s.text,\n 'text-foreground',\n )}\n >\n <select\n value={itemsPerPage}\n onChange={(e) => onPerPageChange(Number(e.target.value))}\n className=\"absolute inset-0 cursor-pointer opacity-0\"\n aria-label=\"Items per page\"\n >\n {(perPageOptions ?? [10, 20, 50]).map((opt) => (\n <option key={opt} value={opt}>\n {opt}/page\n </option>\n ))}\n </select>\n <span>{itemsPerPage ?? 10}/page</span>\n <ChevronDown className={s.icon} />\n </div>\n )}\n </div>\n );\n}\n\n/* ============================================\n Type: page-dropdown-nav\n < [Page 1 v] >\n ============================================ */\n\nfunction PageDropdownNavPagination({\n currentPage,\n totalPages,\n size,\n onPageChange,\n}: TypeComponentProps) {\n const s = sizeMap[size];\n\n return (\n <div className=\"flex items-center gap-1\">\n <IconNavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n onClick={() => onPageChange(currentPage - 1)}\n />\n\n <div\n className={cn(\n 'relative inline-flex items-center justify-center rounded-xl border border-border font-medium',\n s.h,\n 'px-4',\n s.gap,\n s.text,\n 'text-foreground',\n )}\n >\n <select\n value={currentPage}\n onChange={(e) => onPageChange(Number(e.target.value))}\n className=\"absolute inset-0 cursor-pointer opacity-0\"\n aria-label=\"Select page\"\n >\n {Array.from({ length: totalPages }, (_, i) => (\n <option key={i + 1} value={i + 1}>\n Page {i + 1}\n </option>\n ))}\n </select>\n <span>Page {currentPage}</span>\n <ChevronDown className={s.icon} />\n </div>\n\n <IconNavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n );\n}\n\n/* ============================================\n Type: with-underline\n 1 2 _3_ 4 5 6\n ============================================ */\n\nfunction WithUnderlinePagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n onPageChange,\n}: TypeComponentProps) {\n const pages = generatePageNumbers(currentPage, totalPages, siblingCount);\n const s = sizeMap[size];\n\n return (\n <div className=\"flex items-start gap-1\">\n {pages.map((page, position) =>\n page === 'ellipsis' ? (\n <EllipsisIndicator\n key={getPaginationPageKey(page, pages, position)}\n size={size}\n shape=\"square\"\n />\n ) : (\n <button\n key={page}\n type=\"button\"\n onClick={() => onPageChange(page)}\n aria-current={page === currentPage ? 'page' : undefined}\n className={cn(\n btnBase,\n expandedHitAreaClass,\n s.sq,\n s.text,\n page === currentPage\n ? 'border-b-2 border-foreground text-foreground'\n : 'text-foreground hover:bg-muted',\n )}\n >\n {page}\n </button>\n ),\n )}\n </div>\n );\n}\n\n/* ============================================\n Type: outline\n [< Previous] [Next >]\n ============================================ */\n\nfunction OutlinePagination({\n currentPage,\n totalPages,\n size,\n previousText,\n nextText,\n onPageChange,\n}: TypeComponentProps) {\n return (\n <div className=\"flex items-center gap-1\">\n <NavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n variant=\"outlined\"\n prevNextStyle=\"icon-text\"\n text={previousText}\n onClick={() => onPageChange(currentPage - 1)}\n />\n <NavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n variant=\"outlined\"\n prevNextStyle=\"icon-text\"\n text={nextText}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n );\n}\n\n/* ============================================\n Type: box-style\n [Previous | Next]\n ============================================ */\n\nfunction BoxStylePagination({\n currentPage,\n totalPages,\n size,\n previousText,\n nextText,\n onPageChange,\n}: TypeComponentProps) {\n const s = sizeMap[size];\n\n return (\n <div className=\"inline-flex items-center\">\n <button\n type=\"button\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage <= 1}\n className={cn(\n btnBase,\n 'rounded-s-md border border-border bg-background text-foreground hover:bg-muted',\n s.h,\n s.pxNav,\n s.gap,\n s.text,\n )}\n >\n {previousText}\n </button>\n <button\n type=\"button\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage >= totalPages}\n className={cn(\n btnBase,\n 'rounded-e-md border border-s-0 border-border bg-primary/10 text-foreground hover:bg-muted',\n s.h,\n s.pxNav,\n s.gap,\n s.text,\n )}\n >\n {nextText}\n </button>\n </div>\n );\n}\n\n/* ============================================\n Legacy Type Mapping\n ============================================ */\n\ntype ResolvedType = Exclude<\n PaginationType,\n | 'page-default'\n | 'page-minimal'\n | 'card-default'\n | 'card-minimal'\n | 'card-button-group'\n>;\n\nfunction resolveLegacyProps(type: PaginationType): {\n resolvedType: ResolvedType;\n card: boolean;\n overrideVariant?: PaginationVariant;\n} {\n switch (type) {\n case 'page-default':\n return { resolvedType: 'default', card: false };\n case 'page-minimal':\n return {\n resolvedType: 'outline',\n card: false,\n overrideVariant: 'outlined',\n };\n case 'card-default':\n return {\n resolvedType: 'default',\n card: true,\n overrideVariant: 'outlined',\n };\n case 'card-minimal':\n return { resolvedType: 'page-number', card: true };\n case 'card-button-group':\n return { resolvedType: 'combine', card: false };\n default:\n return { resolvedType: type, card: false };\n }\n}\n\n/* ============================================\n Type Component Registry\n ============================================ */\n\nconst typeComponents: Record<\n ResolvedType,\n React.ComponentType<TypeComponentProps>\n> = {\n default: DefaultPagination,\n 'previous-next': PreviousNextPagination,\n 'with-buttons': WithButtonsPagination,\n combine: CombinePagination,\n 'combine-steps': CombineStepsPagination,\n minimal: MinimalPagination,\n 'first-last': FirstLastPagination,\n 'page-number': PageNumberPagination,\n 'left-right-chevron': LeftRightChevronPagination,\n 'page-dropdown': PageDropdownPagination,\n 'page-dropdown-nav': PageDropdownNavPagination,\n 'with-underline': WithUnderlinePagination,\n outline: OutlinePagination,\n 'box-style': BoxStylePagination,\n};\n\n/* ============================================\n Main Pagination Component\n ============================================ */\n\ninterface PaginationProps extends React.ComponentProps<'nav'> {\n /** Pagination layout type */\n type?: PaginationType;\n /** Size of pagination elements */\n size?: PaginationSize;\n /** Visual variant of inactive buttons */\n variant?: PaginationVariant;\n /** Shape of page number buttons */\n shape?: PaginationShape;\n /** Style of previous/next buttons */\n prevNextStyle?: PrevNextStyle;\n /** Current active page (1-indexed) */\n currentPage?: number;\n /** Total number of pages */\n totalPages?: number;\n /** Number of sibling pages to show around current page */\n siblingCount?: number;\n /** Callback when page changes */\n onPageChange?: (page: number) => void;\n /** Show page numbers */\n showPageNumbers?: boolean;\n /** Previous button text */\n previousText?: string;\n /** Next button text */\n nextText?: string;\n /** Items per page (for page-dropdown type display) */\n itemsPerPage?: number;\n /** Items per page options */\n perPageOptions?: number[];\n /** Callback when items per page changes */\n onPerPageChange?: (perPage: number) => void;\n /** Color of the active page indicator */\n activeColor?: ActiveColor;\n}\n\nfunction Pagination({\n className,\n type = 'default',\n size = 'md',\n variant = 'default',\n shape = 'square',\n prevNextStyle = 'icon-text',\n currentPage = 1,\n totalPages = 10,\n siblingCount = 1,\n onPageChange,\n showPageNumbers = true,\n previousText = 'Previous',\n nextText = 'Next',\n itemsPerPage,\n perPageOptions,\n onPerPageChange,\n activeColor = 'primary',\n ...props\n}: PaginationProps) {\n const safeSize = getPaginationSize(size);\n const safeTotalPages = getPositiveInteger(totalPages, DEFAULT_PAGE_TOTAL);\n const safeCurrentPage = getCurrentPage(currentPage, safeTotalPages);\n const safeSiblingCount = getNonNegativeInteger(\n siblingCount,\n DEFAULT_SIBLING_COUNT,\n );\n const safePerPageOptions = getPerPageOptions(perPageOptions);\n const safeItemsPerPage = getItemsPerPage(itemsPerPage, safePerPageOptions);\n const { resolvedType, card, overrideVariant } = resolveLegacyProps(type);\n const finalVariant = overrideVariant ?? variant;\n const finalShape: PaginationShape = shape === 'circle' ? 'rounded' : shape;\n\n const handlePageChange = (page: number) => {\n if (!onPageChange || !Number.isFinite(page)) {\n return;\n }\n\n const nextPage = Math.floor(page);\n if (nextPage >= 1 && nextPage <= safeTotalPages) {\n onPageChange(nextPage);\n }\n };\n\n const typeProps: TypeComponentProps = {\n currentPage: safeCurrentPage,\n totalPages: safeTotalPages,\n siblingCount: safeSiblingCount,\n size: safeSize,\n variant: finalVariant,\n shape: finalShape,\n prevNextStyle,\n activeColor,\n previousText,\n nextText,\n onPageChange: handlePageChange,\n showPageNumbers,\n itemsPerPage: safeItemsPerPage,\n perPageOptions: safePerPageOptions,\n onPerPageChange,\n };\n\n const TypeComponent =\n typeComponents[resolvedType as ResolvedType] ?? DefaultPagination;\n\n return (\n <nav\n aria-label=\"pagination\"\n data-slot=\"pagination\"\n className={cn(\n 'flex w-full',\n card &&\n 'rounded-xl border border-border bg-background p-4 dark:border-border dark:bg-muted',\n className,\n )}\n {...props}\n >\n <TypeComponent {...typeProps} />\n </nav>\n );\n}\n\n/* ============================================\n Display Names\n ============================================ */\n\nPagination.displayName = 'Pagination';\n\n/* ============================================\n Exports\n ============================================ */\n\nexport type {\n ActiveColor,\n PaginationAlignment,\n PaginationDotsProps,\n PaginationDotsSize,\n PaginationDotsStyle,\n PaginationProps,\n PaginationShape,\n PaginationSize,\n PaginationType,\n PaginationVariant,\n PrevNextStyle,\n};\n\nexport {\n Pagination,\n PaginationDots,\n paginationDotIndicatorVariants,\n paginationDotsVariants,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index134.js","names":[],"sources":["../src/components/molecules/navigation/Pagination/Pagination.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport {\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n MoreHorizontal,\n} from 'lucide-react';\nimport type * as React from 'react';\nimport { cn } from '@/lib/utils';\n\n/* ============================================\n Types\n ============================================ */\n\ntype PaginationSize = 'xs' | 'sm' | 'md' | 'lg';\n\ntype PaginationVariant = 'default' | 'outlined';\n\ntype PaginationShape = 'square' | 'rounded' | 'circle';\n\ntype PrevNextStyle = 'icon-text' | 'icon-only';\n\ntype PaginationAlignment = 'left' | 'center' | 'right';\n\ntype ActiveColor = 'primary' | 'info' | 'warning' | 'success' | 'destructive';\n\ntype PaginationType =\n | 'default'\n | 'previous-next'\n | 'with-buttons'\n | 'combine'\n | 'combine-steps'\n | 'minimal'\n | 'first-last'\n | 'page-number'\n | 'left-right-chevron'\n | 'page-dropdown'\n | 'page-dropdown-nav'\n | 'with-underline'\n | 'outline'\n | 'box-style'\n // Legacy compat\n | 'page-default'\n | 'page-minimal'\n | 'card-default'\n | 'card-minimal'\n | 'card-button-group';\n\n/* ============================================\n Size & Color Maps\n ============================================ */\n\nconst sizeMap = {\n xs: {\n h: 'h-[26px]',\n sq: 'size-[26px]',\n px: 'px-2',\n pxNav: 'px-2',\n gap: 'gap-1.5',\n text: 'text-xs',\n icon: 'size-4',\n },\n sm: {\n h: 'h-8',\n sq: 'size-8',\n px: 'px-3',\n pxNav: 'px-3',\n gap: 'gap-1.5',\n text: 'text-sm',\n icon: 'size-4',\n },\n md: {\n h: 'h-9',\n sq: 'size-9',\n px: 'px-3.5',\n pxNav: 'px-4',\n gap: 'gap-2',\n text: 'text-sm',\n icon: 'size-4',\n },\n lg: {\n h: 'h-10',\n sq: 'size-10',\n px: 'px-4',\n pxNav: 'px-6',\n gap: 'gap-2',\n text: 'text-sm',\n icon: 'size-4',\n },\n} as const;\n\nconst activeColorMap: Record<ActiveColor, string> = {\n primary: 'bg-primary text-primary-foreground',\n info: 'bg-info text-info-foreground',\n warning: 'bg-warning text-warning-foreground',\n success: 'bg-success text-success-foreground',\n destructive: 'bg-destructive text-destructive-foreground',\n};\n\nfunction getPaginationSize(size: PaginationSize): PaginationSize {\n switch (size) {\n case 'xs':\n case 'sm':\n case 'md':\n case 'lg':\n return size;\n default:\n return 'md';\n }\n}\n\nconst variantClasses = (v: PaginationVariant) =>\n v === 'outlined'\n ? 'border border-border bg-background/60 backdrop-blur-sm text-secondary-foreground hover:bg-muted'\n : 'text-secondary-foreground hover:bg-muted';\n\nconst shapeRadius = (shape: PaginationShape) =>\n shape === 'rounded' ? 'rounded-full' : 'rounded-xl';\n\nconst iconNavIcons = {\n previous: ChevronLeft,\n next: ChevronRight,\n first: ChevronsLeft,\n last: ChevronsRight,\n} as const;\n\nconst iconNavLabels = {\n previous: 'Go to previous page',\n next: 'Go to next page',\n first: 'Go to first page',\n last: 'Go to last page',\n} as const;\n\nconst DEFAULT_DOT_TOTAL = 3;\nconst DEFAULT_PAGE_TOTAL = 10;\nconst DEFAULT_CURRENT_PAGE = 1;\nconst DEFAULT_SIBLING_COUNT = 1;\nconst DEFAULT_PER_PAGE_OPTIONS = [10, 20, 50];\n\nfunction getPositiveInteger(value: number | undefined, fallback: number) {\n return typeof value === 'number' && Number.isFinite(value) && value > 0\n ? Math.floor(value)\n : fallback;\n}\n\nfunction getNonNegativeInteger(value: number | undefined, fallback: number) {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0\n ? Math.floor(value)\n : fallback;\n}\n\nfunction clampInteger(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, Math.floor(value)));\n}\n\nfunction getCurrentPage(value: number | undefined, totalPages: number) {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return DEFAULT_CURRENT_PAGE;\n }\n\n return clampInteger(value, 1, totalPages);\n}\n\nfunction getDotCurrent(value: number | undefined, total: number) {\n if (total <= 0) {\n return 0;\n }\n\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return 0;\n }\n\n return clampInteger(value, 0, total - 1);\n}\n\nfunction getPerPageOptions(options: number[] | undefined) {\n if (!options) {\n return DEFAULT_PER_PAGE_OPTIONS;\n }\n\n const normalizedOptions = Array.from(\n new Set(\n options\n .filter((option) => Number.isFinite(option) && option > 0)\n .map((option) => Math.floor(option)),\n ),\n );\n\n return normalizedOptions.length > 0\n ? normalizedOptions\n : DEFAULT_PER_PAGE_OPTIONS;\n}\n\nfunction getItemsPerPage(value: number | undefined, options: number[]) {\n if (typeof value === 'number' && Number.isFinite(value) && value > 0) {\n return Math.floor(value);\n }\n\n return options[0] ?? DEFAULT_PER_PAGE_OPTIONS[0];\n}\n\n/* ============================================\n PaginationDots (unchanged)\n ============================================ */\n\nconst paginationDotsVariants = cva('flex items-center justify-center', {\n variants: {\n size: {\n md: '',\n lg: '',\n },\n style: {\n dot: '',\n line: '',\n },\n framed: {\n true: 'rounded-full bg-card dark:bg-muted',\n false: '',\n },\n },\n compoundVariants: [\n { size: 'md', style: 'dot', framed: true, className: 'gap-3 p-2' },\n { size: 'md', style: 'line', framed: true, className: 'w-40 gap-2 p-2' },\n { size: 'lg', style: 'dot', framed: true, className: 'gap-4 p-3' },\n { size: 'lg', style: 'line', framed: true, className: 'w-44 gap-3 p-3' },\n { size: 'md', style: 'dot', framed: false, className: 'gap-3' },\n { size: 'md', style: 'line', framed: false, className: 'w-36 gap-2' },\n { size: 'lg', style: 'dot', framed: false, className: 'gap-4' },\n { size: 'lg', style: 'line', framed: false, className: 'w-38 gap-3' },\n ],\n defaultVariants: {\n size: 'md',\n style: 'dot',\n framed: false,\n },\n});\n\nconst paginationDotIndicatorVariants = cva('shrink-0 rounded-full', {\n variants: {\n size: {\n md: '',\n lg: '',\n },\n style: {\n dot: '',\n line: 'min-h-px min-w-px grow basis-0',\n },\n current: {\n true: 'bg-primary/10 dark:bg-primary',\n false: 'bg-surface-2 dark:bg-muted',\n },\n },\n compoundVariants: [\n { size: 'md', style: 'dot', className: 'size-2' },\n { size: 'lg', style: 'dot', className: 'size-2.5' },\n { size: 'md', style: 'line', className: 'h-1.5' },\n { size: 'lg', style: 'line', className: 'h-2' },\n ],\n defaultVariants: {\n size: 'md',\n style: 'dot',\n current: false,\n },\n});\n\ntype PaginationDotsStyle = 'dot' | 'line';\ntype PaginationDotsSize = 'md' | 'lg';\n\ninterface PaginationDotsProps\n extends Omit<React.ComponentProps<'div'>, 'style'> {\n total?: number;\n current?: number;\n variant?: PaginationDotsStyle;\n size?: PaginationDotsSize;\n framed?: boolean;\n onDotClick?: (index: number) => void;\n}\n\nfunction PaginationDots({\n className,\n total = 3,\n current = 0,\n variant = 'dot',\n size = 'md',\n framed = false,\n onDotClick,\n ...props\n}: PaginationDotsProps) {\n const safeTotal = getNonNegativeInteger(total, DEFAULT_DOT_TOTAL);\n const safeCurrent = getDotCurrent(current, safeTotal);\n\n return (\n <div\n className={cn(\n paginationDotsVariants({ size, style: variant, framed }),\n className,\n )}\n role=\"tablist\"\n aria-label=\"Pagination dots\"\n {...props}\n >\n {Array.from({ length: safeTotal }, (_, index) => index + 1).map(\n (pageNumber) => {\n const pageIndex = pageNumber - 1;\n return (\n <button\n key={pageNumber}\n type=\"button\"\n role=\"tab\"\n aria-selected={pageIndex === safeCurrent}\n aria-label={`Go to page ${pageNumber}`}\n onClick={() => onDotClick?.(pageIndex)}\n className={cn(\n paginationDotIndicatorVariants({\n size,\n style: variant,\n current: pageIndex === safeCurrent,\n }),\n onDotClick &&\n 'cursor-pointer transition-colors duration-200 ease-smooth motion-reduce:transition-none',\n !onDotClick && 'cursor-default',\n )}\n />\n );\n },\n )}\n </div>\n );\n}\n\nPaginationDots.displayName = 'PaginationDots';\n\n/* ============================================\n Helper: generatePageNumbers\n ============================================ */\n\ntype PaginationPageItem = number | 'ellipsis';\n\nfunction generatePageNumbers(\n currentPage: number,\n totalPages: number,\n siblingCount: number,\n): PaginationPageItem[] {\n const safeTotalPages = getPositiveInteger(totalPages, DEFAULT_CURRENT_PAGE);\n const safeCurrentPage = getCurrentPage(currentPage, safeTotalPages);\n const safeSiblingCount = getNonNegativeInteger(\n siblingCount,\n DEFAULT_SIBLING_COUNT,\n );\n const totalPageNumbers = safeSiblingCount * 2 + 5;\n\n if (safeTotalPages <= totalPageNumbers) {\n return Array.from({ length: safeTotalPages }, (_, i) => i + 1);\n }\n\n const leftSiblingIndex = Math.max(safeCurrentPage - safeSiblingCount, 1);\n const rightSiblingIndex = Math.min(\n safeCurrentPage + safeSiblingCount,\n safeTotalPages,\n );\n\n const shouldShowLeftEllipsis = leftSiblingIndex > 2;\n const shouldShowRightEllipsis = rightSiblingIndex < safeTotalPages - 1;\n\n if (!shouldShowLeftEllipsis && shouldShowRightEllipsis) {\n const leftItemCount = 3 + 2 * safeSiblingCount;\n const leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1);\n return [...leftRange, 'ellipsis', safeTotalPages];\n }\n\n if (shouldShowLeftEllipsis && !shouldShowRightEllipsis) {\n const rightItemCount = 3 + 2 * safeSiblingCount;\n const rightRange = Array.from(\n { length: rightItemCount },\n (_, i) => safeTotalPages - rightItemCount + i + 1,\n );\n return [1, 'ellipsis', ...rightRange];\n }\n\n const middleRange = Array.from(\n { length: rightSiblingIndex - leftSiblingIndex + 1 },\n (_, i) => leftSiblingIndex + i,\n );\n return [1, 'ellipsis', ...middleRange, 'ellipsis', safeTotalPages];\n}\n\nfunction getPaginationPageKey(\n page: PaginationPageItem,\n pages: PaginationPageItem[],\n position: number,\n): React.Key {\n if (page !== 'ellipsis') return page;\n\n return `ellipsis:${pages[position - 1] ?? 'start'}:${pages[position + 1] ?? 'end'}`;\n}\n\n/* ============================================\n Shared Sub-components\n ============================================ */\n\nconst btnBase =\n 'relative inline-flex items-center justify-center font-medium shrink-0 select-none outline-none transition-[color,background-color,border-color,box-shadow] duration-150 ease-out focus-visible:ring-2 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50';\n\nconst expandedHitAreaClass =\n 'before:absolute before:left-1/2 before:top-1/2 before:h-full before:min-h-11 before:w-full before:min-w-11 before:-translate-x-1/2 before:-translate-y-1/2 before:rounded-[inherit] before:content-[\"\"]';\n\ninterface PageButtonProps {\n page: number;\n isActive: boolean;\n size: PaginationSize;\n variant: PaginationVariant;\n shape: PaginationShape;\n activeColor: ActiveColor;\n onClick: () => void;\n}\n\nfunction PageButton({\n page,\n isActive,\n size,\n variant,\n shape,\n activeColor,\n onClick,\n}: PageButtonProps) {\n const s = sizeMap[size];\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-current={isActive ? 'page' : undefined}\n className={cn(\n btnBase,\n expandedHitAreaClass,\n s.sq,\n s.text,\n shapeRadius(shape),\n isActive ? activeColorMap[activeColor] : variantClasses(variant),\n )}\n >\n {page}\n </button>\n );\n}\n\nPageButton.displayName = 'PageButton';\n\nfunction EllipsisIndicator({\n size,\n shape,\n}: {\n size: PaginationSize;\n shape: PaginationShape;\n}) {\n const s = sizeMap[size];\n return (\n <span\n aria-hidden\n className={cn(\n 'inline-flex items-center justify-center text-muted-foreground shrink-0',\n s.sq,\n shapeRadius(shape),\n )}\n >\n <MoreHorizontal className={s.icon} />\n </span>\n );\n}\n\nEllipsisIndicator.displayName = 'EllipsisIndicator';\n\ninterface NavButtonProps {\n direction: 'previous' | 'next';\n disabled: boolean;\n size: PaginationSize;\n variant: PaginationVariant;\n prevNextStyle: PrevNextStyle;\n text: string;\n onClick: () => void;\n}\n\nfunction NavButton({\n direction,\n disabled,\n size,\n variant,\n prevNextStyle,\n text,\n onClick,\n}: NavButtonProps) {\n const s = sizeMap[size];\n const isIconOnly = prevNextStyle === 'icon-only';\n const Icon = direction === 'previous' ? ChevronLeft : ChevronRight;\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={\n direction === 'previous' ? 'Go to previous page' : 'Go to next page'\n }\n className={cn(\n btnBase,\n expandedHitAreaClass,\n 'rounded-xl',\n isIconOnly ? s.sq : [s.h, s.pxNav, s.gap],\n s.text,\n variantClasses(variant),\n )}\n >\n {direction === 'previous' && (\n <Icon className={cn(s.icon, 'rtl:rotate-180')} />\n )}\n {!isIconOnly && <span>{text}</span>}\n {direction === 'next' && (\n <Icon className={cn(s.icon, 'rtl:rotate-180')} />\n )}\n </button>\n );\n}\n\nNavButton.displayName = 'NavButton';\n\nfunction IconNavButton({\n direction,\n disabled,\n size,\n onClick,\n className: extraClassName,\n}: {\n direction: 'previous' | 'next' | 'first' | 'last';\n disabled: boolean;\n size: PaginationSize;\n onClick: () => void;\n className?: string;\n}) {\n const s = sizeMap[size];\n const Icon = iconNavIcons[direction];\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={iconNavLabels[direction]}\n className={cn(\n btnBase,\n expandedHitAreaClass,\n 'rounded-xl text-secondary-foreground hover:bg-muted',\n s.sq,\n extraClassName,\n )}\n >\n <Icon className={cn(s.icon, 'rtl:rotate-180')} />\n </button>\n );\n}\n\nIconNavButton.displayName = 'IconNavButton';\n\nfunction PageInfo({\n currentPage,\n totalPages,\n size,\n}: {\n currentPage: number;\n totalPages: number;\n size: PaginationSize;\n}) {\n const s = sizeMap[size];\n return (\n <span className={cn('text-muted-foreground whitespace-nowrap', s.text)}>\n Page <span className=\"text-foreground\">{currentPage}</span> of{' '}\n <span className=\"text-foreground\">{totalPages}</span>\n </span>\n );\n}\n\nPageInfo.displayName = 'PageInfo';\n\nfunction PageNumberButtons({\n currentPage,\n totalPages,\n siblingCount,\n size,\n variant,\n shape,\n activeColor,\n onPageChange,\n}: {\n currentPage: number;\n totalPages: number;\n siblingCount: number;\n size: PaginationSize;\n variant: PaginationVariant;\n shape: PaginationShape;\n activeColor: ActiveColor;\n onPageChange: (page: number) => void;\n}) {\n const pages = generatePageNumbers(currentPage, totalPages, siblingCount);\n return (\n <>\n {pages.map((page, position) =>\n page === 'ellipsis' ? (\n <EllipsisIndicator\n key={getPaginationPageKey(page, pages, position)}\n size={size}\n shape={shape}\n />\n ) : (\n <PageButton\n key={page}\n page={page}\n isActive={page === currentPage}\n size={size}\n variant={variant}\n shape={shape}\n activeColor={activeColor}\n onClick={() => onPageChange(page)}\n />\n ),\n )}\n </>\n );\n}\n\n/* ============================================\n Shared Props for Type Components\n ============================================ */\n\ninterface TypeComponentProps {\n currentPage: number;\n totalPages: number;\n siblingCount: number;\n size: PaginationSize;\n variant: PaginationVariant;\n shape: PaginationShape;\n prevNextStyle: PrevNextStyle;\n activeColor: ActiveColor;\n previousText: string;\n nextText: string;\n onPageChange: (page: number) => void;\n showPageNumbers: boolean;\n itemsPerPage?: number;\n perPageOptions?: number[];\n onPerPageChange?: (perPage: number) => void;\n}\n\n/* ============================================\n Type: default\n < Previous 1 2 [3] 4 ... Next >\n ============================================ */\n\nfunction DefaultPagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n variant,\n shape,\n prevNextStyle,\n activeColor,\n previousText,\n nextText,\n onPageChange,\n showPageNumbers,\n}: TypeComponentProps) {\n return (\n <div className=\"flex items-center gap-1\">\n <NavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n variant={variant}\n prevNextStyle={prevNextStyle}\n text={previousText}\n onClick={() => onPageChange(currentPage - 1)}\n />\n {showPageNumbers && (\n <PageNumberButtons\n currentPage={currentPage}\n totalPages={totalPages}\n siblingCount={siblingCount}\n size={size}\n variant={variant}\n shape={shape}\n activeColor={activeColor}\n onPageChange={onPageChange}\n />\n )}\n <NavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n variant={variant}\n prevNextStyle={prevNextStyle}\n text={nextText}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n );\n}\n\n/* ============================================\n Type: previous-next\n < Previous Next >\n ============================================ */\n\nfunction PreviousNextPagination({\n currentPage,\n totalPages,\n size,\n variant,\n previousText,\n nextText,\n onPageChange,\n}: TypeComponentProps) {\n return (\n <div className=\"flex w-full items-center justify-between\">\n <NavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n variant={variant}\n prevNextStyle=\"icon-text\"\n text={previousText}\n onClick={() => onPageChange(currentPage - 1)}\n />\n <NavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n variant={variant}\n prevNextStyle=\"icon-text\"\n text={nextText}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n );\n}\n\n/* ============================================\n Type: with-buttons\n [< Previous] [1] [2] [3] [4] [Next >]\n ============================================ */\n\nfunction WithButtonsPagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n shape,\n activeColor,\n previousText,\n nextText,\n onPageChange,\n showPageNumbers,\n}: TypeComponentProps) {\n return (\n <div className=\"flex items-start gap-1.5\">\n <NavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n variant=\"outlined\"\n prevNextStyle=\"icon-text\"\n text={previousText}\n onClick={() => onPageChange(currentPage - 1)}\n />\n {showPageNumbers && (\n <PageNumberButtons\n currentPage={currentPage}\n totalPages={totalPages}\n siblingCount={siblingCount}\n size={size}\n variant=\"outlined\"\n shape={shape}\n activeColor={activeColor}\n onPageChange={onPageChange}\n />\n )}\n <NavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n variant=\"outlined\"\n prevNextStyle=\"icon-text\"\n text={nextText}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n );\n}\n\n/* ============================================\n Type: combine\n [< | 1 | 2 | 3 | 4 | >]\n ============================================ */\n\nfunction CombinePagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n onPageChange,\n}: TypeComponentProps) {\n const pages = generatePageNumbers(currentPage, totalPages, siblingCount);\n const s = sizeMap[size];\n\n const cellBase = cn(btnBase, 'border-y border-s border-input', s.sq, s.text);\n\n return (\n <div className=\"inline-flex items-start\">\n <button\n type=\"button\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage <= 1}\n aria-label=\"Go to previous page\"\n className={cn(\n cellBase,\n 'rounded-s-lg text-secondary-foreground hover:bg-muted',\n )}\n >\n <ChevronLeft className={cn(s.icon, 'rtl:rotate-180')} />\n </button>\n\n {pages.map((page, position) => (\n <button\n key={getPaginationPageKey(page, pages, position)}\n type=\"button\"\n onClick={() => page !== 'ellipsis' && onPageChange(page as number)}\n disabled={page === 'ellipsis'}\n aria-current={page === currentPage ? 'page' : undefined}\n aria-label={page === 'ellipsis' ? 'More pages' : `Go to page ${page}`}\n className={cn(\n cellBase,\n page === currentPage\n ? 'bg-accent text-accent-foreground'\n : 'text-foreground hover:bg-muted',\n page === 'ellipsis' && 'pointer-events-none',\n )}\n >\n {page === 'ellipsis' ? <MoreHorizontal className={s.icon} /> : page}\n </button>\n ))}\n\n <button\n type=\"button\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage >= totalPages}\n aria-label=\"Go to next page\"\n className={cn(\n cellBase,\n 'rounded-e-lg border-e text-secondary-foreground hover:bg-muted',\n )}\n >\n <ChevronRight className={cn(s.icon, 'rtl:rotate-180')} />\n </button>\n </div>\n );\n}\n\n/* ============================================\n Type: combine-steps\n [< | 5/25 | >]\n ============================================ */\n\nfunction CombineStepsPagination({\n currentPage,\n totalPages,\n size,\n onPageChange,\n}: TypeComponentProps) {\n const s = sizeMap[size];\n\n const cellBase = cn(btnBase, 'border-y border-s border-border', s.sq);\n\n return (\n <div className=\"inline-flex items-start\">\n <button\n type=\"button\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage <= 1}\n aria-label=\"Go to previous page\"\n className={cn(\n cellBase,\n 'rounded-s-md text-secondary-foreground hover:bg-muted',\n )}\n >\n <ChevronLeft className={cn(s.icon, 'rtl:rotate-180')} />\n </button>\n\n <div\n className={cn(\n 'inline-flex items-center justify-center border-y border-s border-input',\n s.h,\n 'px-4',\n s.text,\n 'font-medium text-foreground',\n )}\n >\n <span>{currentPage}</span>\n <span className=\"text-muted-foreground\">/{totalPages}</span>\n </div>\n\n <button\n type=\"button\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage >= totalPages}\n aria-label=\"Go to next page\"\n className={cn(\n cellBase,\n 'rounded-e-md border-e text-secondary-foreground hover:bg-muted',\n )}\n >\n <ChevronRight className={cn(s.icon, 'rtl:rotate-180')} />\n </button>\n </div>\n );\n}\n\n/* ============================================\n Type: minimal\n < 1 2 [3] 4 >\n ============================================ */\n\nfunction MinimalPagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n shape,\n activeColor,\n onPageChange,\n showPageNumbers,\n}: TypeComponentProps) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <IconNavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n onClick={() => onPageChange(currentPage - 1)}\n />\n {showPageNumbers && (\n <PageNumberButtons\n currentPage={currentPage}\n totalPages={totalPages}\n siblingCount={siblingCount}\n size={size}\n variant=\"default\"\n shape={shape}\n activeColor={activeColor}\n onPageChange={onPageChange}\n />\n )}\n <IconNavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n );\n}\n\n/* ============================================\n Type: first-last\n << First < 1 2 [3] 4 > Last >>\n ============================================ */\n\nfunction FirstLastPagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n shape,\n activeColor,\n onPageChange,\n showPageNumbers,\n}: TypeComponentProps) {\n const s = sizeMap[size];\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <button\n type=\"button\"\n onClick={() => onPageChange(1)}\n disabled={currentPage <= 1}\n className={cn(\n btnBase,\n expandedHitAreaClass,\n 'rounded-md text-secondary-foreground hover:bg-muted',\n s.h,\n s.pxNav,\n s.gap,\n s.text,\n )}\n >\n <ChevronsLeft className={cn(s.icon, 'rtl:rotate-180')} />\n <span>First</span>\n </button>\n\n <IconNavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n onClick={() => onPageChange(currentPage - 1)}\n />\n\n {showPageNumbers && (\n <PageNumberButtons\n currentPage={currentPage}\n totalPages={totalPages}\n siblingCount={siblingCount}\n size={size}\n variant=\"default\"\n shape={shape}\n activeColor={activeColor}\n onPageChange={onPageChange}\n />\n )}\n\n <IconNavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n onClick={() => onPageChange(currentPage + 1)}\n />\n\n <button\n type=\"button\"\n onClick={() => onPageChange(totalPages)}\n disabled={currentPage >= totalPages}\n className={cn(\n btnBase,\n expandedHitAreaClass,\n 'rounded-md text-secondary-foreground hover:bg-muted',\n s.h,\n s.pxNav,\n s.gap,\n s.text,\n )}\n >\n <span>Last</span>\n <ChevronsRight className={cn(s.icon, 'rtl:rotate-180')} />\n </button>\n </div>\n );\n}\n\n/* ============================================\n Type: page-number\n Page 1 of 10 [< Previous] 1 2 3 4 [Next >]\n ============================================ */\n\nfunction PageNumberPagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n shape,\n activeColor,\n previousText,\n nextText,\n onPageChange,\n showPageNumbers,\n}: TypeComponentProps) {\n return (\n <div className=\"flex w-full items-center justify-between\">\n <PageInfo currentPage={currentPage} totalPages={totalPages} size={size} />\n <div className=\"flex items-center gap-1\">\n <NavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n variant=\"default\"\n prevNextStyle=\"icon-text\"\n text={previousText}\n onClick={() => onPageChange(currentPage - 1)}\n />\n {showPageNumbers && (\n <PageNumberButtons\n currentPage={currentPage}\n totalPages={totalPages}\n siblingCount={siblingCount}\n size={size}\n variant=\"default\"\n shape={shape}\n activeColor={activeColor}\n onPageChange={onPageChange}\n />\n )}\n <NavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n variant=\"default\"\n prevNextStyle=\"icon-text\"\n text={nextText}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n </div>\n );\n}\n\n/* ============================================\n Type: left-right-chevron\n < Page 1 of 10 >\n ============================================ */\n\nfunction LeftRightChevronPagination({\n currentPage,\n totalPages,\n size,\n onPageChange,\n}: TypeComponentProps) {\n return (\n <div className=\"flex w-full items-center justify-between gap-1\">\n <IconNavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n onClick={() => onPageChange(currentPage - 1)}\n />\n <PageInfo currentPage={currentPage} totalPages={totalPages} size={size} />\n <IconNavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n );\n}\n\n/* ============================================\n Type: page-dropdown\n Page 1 of 10 < Previous 1 2 [3] 4 [10/page v]\n ============================================ */\n\nfunction PageDropdownPagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n shape,\n activeColor,\n previousText,\n onPageChange,\n showPageNumbers,\n itemsPerPage,\n perPageOptions,\n onPerPageChange,\n}: TypeComponentProps) {\n const s = sizeMap[size];\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <PageInfo currentPage={currentPage} totalPages={totalPages} size={size} />\n\n <NavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n variant=\"default\"\n prevNextStyle=\"icon-text\"\n text={previousText}\n onClick={() => onPageChange(currentPage - 1)}\n />\n\n {showPageNumbers && (\n <PageNumberButtons\n currentPage={currentPage}\n totalPages={totalPages}\n siblingCount={siblingCount}\n size={size}\n variant=\"default\"\n shape={shape}\n activeColor={activeColor}\n onPageChange={onPageChange}\n />\n )}\n\n {onPerPageChange && (\n <div\n className={cn(\n 'relative inline-flex items-center justify-center rounded-md border border-border font-medium',\n s.h,\n 'px-4',\n s.gap,\n s.text,\n 'text-foreground',\n )}\n >\n <select\n value={itemsPerPage}\n onChange={(e) => onPerPageChange(Number(e.target.value))}\n className=\"absolute inset-0 cursor-pointer opacity-0\"\n aria-label=\"Items per page\"\n >\n {(perPageOptions ?? [10, 20, 50]).map((opt) => (\n <option key={opt} value={opt}>\n {opt}/page\n </option>\n ))}\n </select>\n <span>{itemsPerPage ?? 10}/page</span>\n <ChevronDown className={s.icon} />\n </div>\n )}\n </div>\n );\n}\n\n/* ============================================\n Type: page-dropdown-nav\n < [Page 1 v] >\n ============================================ */\n\nfunction PageDropdownNavPagination({\n currentPage,\n totalPages,\n size,\n onPageChange,\n}: TypeComponentProps) {\n const s = sizeMap[size];\n\n return (\n <div className=\"flex items-center gap-1\">\n <IconNavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n onClick={() => onPageChange(currentPage - 1)}\n />\n\n <div\n className={cn(\n 'relative inline-flex items-center justify-center rounded-xl border border-border font-medium',\n s.h,\n 'px-4',\n s.gap,\n s.text,\n 'text-foreground',\n )}\n >\n <select\n value={currentPage}\n onChange={(e) => onPageChange(Number(e.target.value))}\n className=\"absolute inset-0 cursor-pointer opacity-0\"\n aria-label=\"Select page\"\n >\n {Array.from({ length: totalPages }, (_, i) => (\n <option key={i + 1} value={i + 1}>\n Page {i + 1}\n </option>\n ))}\n </select>\n <span>Page {currentPage}</span>\n <ChevronDown className={s.icon} />\n </div>\n\n <IconNavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n );\n}\n\n/* ============================================\n Type: with-underline\n 1 2 _3_ 4 5 6\n ============================================ */\n\nfunction WithUnderlinePagination({\n currentPage,\n totalPages,\n siblingCount,\n size,\n onPageChange,\n}: TypeComponentProps) {\n const pages = generatePageNumbers(currentPage, totalPages, siblingCount);\n const s = sizeMap[size];\n\n return (\n <div className=\"flex items-start gap-1\">\n {pages.map((page, position) =>\n page === 'ellipsis' ? (\n <EllipsisIndicator\n key={getPaginationPageKey(page, pages, position)}\n size={size}\n shape=\"square\"\n />\n ) : (\n <button\n key={page}\n type=\"button\"\n onClick={() => onPageChange(page)}\n aria-current={page === currentPage ? 'page' : undefined}\n className={cn(\n btnBase,\n expandedHitAreaClass,\n s.sq,\n s.text,\n page === currentPage\n ? 'border-b-2 border-foreground text-foreground'\n : 'text-foreground hover:bg-muted',\n )}\n >\n {page}\n </button>\n ),\n )}\n </div>\n );\n}\n\n/* ============================================\n Type: outline\n [< Previous] [Next >]\n ============================================ */\n\nfunction OutlinePagination({\n currentPage,\n totalPages,\n size,\n previousText,\n nextText,\n onPageChange,\n}: TypeComponentProps) {\n return (\n <div className=\"flex items-center gap-1\">\n <NavButton\n direction=\"previous\"\n disabled={currentPage <= 1}\n size={size}\n variant=\"outlined\"\n prevNextStyle=\"icon-text\"\n text={previousText}\n onClick={() => onPageChange(currentPage - 1)}\n />\n <NavButton\n direction=\"next\"\n disabled={currentPage >= totalPages}\n size={size}\n variant=\"outlined\"\n prevNextStyle=\"icon-text\"\n text={nextText}\n onClick={() => onPageChange(currentPage + 1)}\n />\n </div>\n );\n}\n\n/* ============================================\n Type: box-style\n [Previous | Next]\n ============================================ */\n\nfunction BoxStylePagination({\n currentPage,\n totalPages,\n size,\n previousText,\n nextText,\n onPageChange,\n}: TypeComponentProps) {\n const s = sizeMap[size];\n\n return (\n <div className=\"inline-flex items-center\">\n <button\n type=\"button\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage <= 1}\n className={cn(\n btnBase,\n 'rounded-s-md border border-border bg-background text-foreground hover:bg-muted',\n s.h,\n s.pxNav,\n s.gap,\n s.text,\n )}\n >\n {previousText}\n </button>\n <button\n type=\"button\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage >= totalPages}\n className={cn(\n btnBase,\n 'rounded-e-md border border-s-0 border-border bg-primary/10 text-foreground hover:bg-muted',\n s.h,\n s.pxNav,\n s.gap,\n s.text,\n )}\n >\n {nextText}\n </button>\n </div>\n );\n}\n\n/* ============================================\n Legacy Type Mapping\n ============================================ */\n\ntype ResolvedType = Exclude<\n PaginationType,\n | 'page-default'\n | 'page-minimal'\n | 'card-default'\n | 'card-minimal'\n | 'card-button-group'\n>;\n\nfunction resolveLegacyProps(type: PaginationType): {\n resolvedType: ResolvedType;\n card: boolean;\n overrideVariant?: PaginationVariant;\n} {\n switch (type) {\n case 'page-default':\n return { resolvedType: 'default', card: false };\n case 'page-minimal':\n return {\n resolvedType: 'outline',\n card: false,\n overrideVariant: 'outlined',\n };\n case 'card-default':\n return {\n resolvedType: 'default',\n card: true,\n overrideVariant: 'outlined',\n };\n case 'card-minimal':\n return { resolvedType: 'page-number', card: true };\n case 'card-button-group':\n return { resolvedType: 'combine', card: false };\n default:\n return { resolvedType: type, card: false };\n }\n}\n\n/* ============================================\n Type Component Registry\n ============================================ */\n\nconst typeComponents: Record<\n ResolvedType,\n React.ComponentType<TypeComponentProps>\n> = {\n default: DefaultPagination,\n 'previous-next': PreviousNextPagination,\n 'with-buttons': WithButtonsPagination,\n combine: CombinePagination,\n 'combine-steps': CombineStepsPagination,\n minimal: MinimalPagination,\n 'first-last': FirstLastPagination,\n 'page-number': PageNumberPagination,\n 'left-right-chevron': LeftRightChevronPagination,\n 'page-dropdown': PageDropdownPagination,\n 'page-dropdown-nav': PageDropdownNavPagination,\n 'with-underline': WithUnderlinePagination,\n outline: OutlinePagination,\n 'box-style': BoxStylePagination,\n};\n\n/* ============================================\n Main Pagination Component\n ============================================ */\n\ninterface PaginationProps extends React.ComponentProps<'nav'> {\n /** Pagination layout type */\n type?: PaginationType;\n /** Size of pagination elements */\n size?: PaginationSize;\n /** Visual variant of inactive buttons */\n variant?: PaginationVariant;\n /** Shape of page number buttons */\n shape?: PaginationShape;\n /** Style of previous/next buttons */\n prevNextStyle?: PrevNextStyle;\n /** Current active page (1-indexed) */\n currentPage?: number;\n /** Total number of pages */\n totalPages?: number;\n /** Number of sibling pages to show around current page */\n siblingCount?: number;\n /** Callback when page changes */\n onPageChange?: (page: number) => void;\n /** Show page numbers */\n showPageNumbers?: boolean;\n /** Previous button text */\n previousText?: string;\n /** Next button text */\n nextText?: string;\n /** Items per page (for page-dropdown type display) */\n itemsPerPage?: number;\n /** Items per page options */\n perPageOptions?: number[];\n /** Callback when items per page changes */\n onPerPageChange?: (perPage: number) => void;\n /** Color of the active page indicator */\n activeColor?: ActiveColor;\n}\n\nfunction Pagination({\n className,\n type = 'default',\n size = 'md',\n variant = 'default',\n shape = 'square',\n prevNextStyle = 'icon-text',\n currentPage = 1,\n totalPages = 10,\n siblingCount = 1,\n onPageChange,\n showPageNumbers = true,\n previousText = 'Previous',\n nextText = 'Next',\n itemsPerPage,\n perPageOptions,\n onPerPageChange,\n activeColor = 'primary',\n ...props\n}: PaginationProps) {\n const safeSize = getPaginationSize(size);\n const safeTotalPages = getPositiveInteger(totalPages, DEFAULT_PAGE_TOTAL);\n const safeCurrentPage = getCurrentPage(currentPage, safeTotalPages);\n const safeSiblingCount = getNonNegativeInteger(\n siblingCount,\n DEFAULT_SIBLING_COUNT,\n );\n const safePerPageOptions = getPerPageOptions(perPageOptions);\n const safeItemsPerPage = getItemsPerPage(itemsPerPage, safePerPageOptions);\n const { resolvedType, card, overrideVariant } = resolveLegacyProps(type);\n const finalVariant = overrideVariant ?? variant;\n const finalShape: PaginationShape = shape === 'circle' ? 'rounded' : shape;\n\n const handlePageChange = (page: number) => {\n if (!onPageChange || !Number.isFinite(page)) {\n return;\n }\n\n const nextPage = Math.floor(page);\n if (nextPage >= 1 && nextPage <= safeTotalPages) {\n onPageChange(nextPage);\n }\n };\n\n const typeProps: TypeComponentProps = {\n currentPage: safeCurrentPage,\n totalPages: safeTotalPages,\n siblingCount: safeSiblingCount,\n size: safeSize,\n variant: finalVariant,\n shape: finalShape,\n prevNextStyle,\n activeColor,\n previousText,\n nextText,\n onPageChange: handlePageChange,\n showPageNumbers,\n itemsPerPage: safeItemsPerPage,\n perPageOptions: safePerPageOptions,\n onPerPageChange,\n };\n\n const TypeComponent =\n typeComponents[resolvedType as ResolvedType] ?? DefaultPagination;\n\n return (\n <nav\n aria-label=\"pagination\"\n data-slot=\"pagination\"\n className={cn(\n 'flex w-full',\n card &&\n 'rounded-xl border border-border bg-background p-4 dark:border-border dark:bg-muted',\n className,\n )}\n {...props}\n >\n <TypeComponent {...typeProps} />\n </nav>\n );\n}\n\n/* ============================================\n Display Names\n ============================================ */\n\nPagination.displayName = 'Pagination';\n\n/* ============================================\n Exports\n ============================================ */\n\nexport type {\n ActiveColor,\n PaginationAlignment,\n PaginationDotsProps,\n PaginationDotsSize,\n PaginationDotsStyle,\n PaginationProps,\n PaginationShape,\n PaginationSize,\n PaginationType,\n PaginationVariant,\n PrevNextStyle,\n};\n\nexport {\n Pagination,\n PaginationDots,\n paginationDotIndicatorVariants,\n paginationDotsVariants,\n};\n"],"mappings":"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"}
|
package/dist/index135.js
CHANGED
|
@@ -135,11 +135,11 @@ var tabsTriggerVariants = cva([
|
|
|
135
135
|
"group-data-[size=lg]/tabs-list:[&_svg:not([class*='size-'])]:size-5",
|
|
136
136
|
"group-data-[variant=boxed]/tabs-list:rounded-[10px] group-data-[variant=boxed]/tabs-list:flex-1 group-data-[variant=boxed]/tabs-list:h-[calc(100%-1px)]",
|
|
137
137
|
"group-data-[variant=boxed]/tabs-list:data-active:bg-secondary group-data-[variant=boxed]/tabs-list:data-active:shadow-sm group-data-[variant=boxed]/tabs-list:data-active:text-foreground",
|
|
138
|
-
"group-data-[variant=boxed]/tabs-list:hover:bg-
|
|
138
|
+
"group-data-[variant=boxed]/tabs-list:hover:bg-accent",
|
|
139
139
|
"group-data-[orientation=vertical]/tabs:group-data-[variant=boxed]/tabs-list:flex-initial group-data-[orientation=vertical]/tabs:group-data-[variant=boxed]/tabs-list:justify-center",
|
|
140
140
|
"group-data-[variant=pill]/tabs-list:rounded-full group-data-[variant=pill]/tabs-list:flex-1 group-data-[variant=pill]/tabs-list:h-[calc(100%-1px)]",
|
|
141
141
|
"group-data-[variant=pill]/tabs-list:data-active:bg-background group-data-[variant=pill]/tabs-list:data-active:shadow-sm group-data-[variant=pill]/tabs-list:data-active:text-foreground",
|
|
142
|
-
"group-data-[variant=pill]/tabs-list:hover:bg-
|
|
142
|
+
"group-data-[variant=pill]/tabs-list:hover:bg-accent",
|
|
143
143
|
"dark:group-data-[variant=pill]/tabs-list:data-active:bg-accent dark:group-data-[variant=pill]/tabs-list:data-active:text-accent-foreground dark:group-data-[variant=pill]/tabs-list:data-active:border-input",
|
|
144
144
|
"group-data-[orientation=vertical]/tabs:group-data-[variant=pill]/tabs-list:flex-initial group-data-[orientation=vertical]/tabs:group-data-[variant=pill]/tabs-list:justify-center",
|
|
145
145
|
"group-data-[variant=bordered]/tabs-list:bg-transparent group-data-[variant=bordered]/tabs-list:rounded-none",
|