asterui 0.12.55 → 0.12.57

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.
Files changed (40) hide show
  1. package/dist/components/DatePicker.d.ts +3 -1
  2. package/dist/components/DatePicker.js +85 -83
  3. package/dist/components/DatePicker.js.map +1 -1
  4. package/dist/components/Dropdown.d.ts +5 -4
  5. package/dist/components/Dropdown.js +228 -222
  6. package/dist/components/Dropdown.js.map +1 -1
  7. package/dist/components/InputNumber.d.ts +2 -0
  8. package/dist/components/InputNumber.js +92 -88
  9. package/dist/components/InputNumber.js.map +1 -1
  10. package/dist/components/Menu.d.ts +3 -1
  11. package/dist/components/Menu.js +38 -37
  12. package/dist/components/Menu.js.map +1 -1
  13. package/dist/components/Modal.d.ts +40 -18
  14. package/dist/components/Modal.js +180 -156
  15. package/dist/components/Modal.js.map +1 -1
  16. package/dist/components/OTPInput.d.ts +2 -0
  17. package/dist/components/OTPInput.js +55 -53
  18. package/dist/components/OTPInput.js.map +1 -1
  19. package/dist/components/Pagination.d.ts +3 -1
  20. package/dist/components/Pagination.js +104 -90
  21. package/dist/components/Pagination.js.map +1 -1
  22. package/dist/components/Popconfirm.d.ts +3 -1
  23. package/dist/components/Popconfirm.js +63 -59
  24. package/dist/components/Popconfirm.js.map +1 -1
  25. package/dist/components/Tabs.d.ts +3 -2
  26. package/dist/components/Tabs.js +74 -72
  27. package/dist/components/Tabs.js.map +1 -1
  28. package/dist/components/ThemeController.js +102 -88
  29. package/dist/components/ThemeController.js.map +1 -1
  30. package/dist/components/ThemeProvider.js +17 -15
  31. package/dist/components/ThemeProvider.js.map +1 -1
  32. package/dist/components/Transfer.d.ts +3 -1
  33. package/dist/components/Transfer.js +127 -120
  34. package/dist/components/Transfer.js.map +1 -1
  35. package/dist/components/Upload.d.ts +3 -1
  36. package/dist/components/Upload.js +144 -142
  37. package/dist/components/Upload.js.map +1 -1
  38. package/dist/hooks/useTheme.js +8 -6
  39. package/dist/hooks/useTheme.js.map +1 -1
  40. package/package.json +1 -1
@@ -1,105 +1,107 @@
1
- import { jsx as A } from "react/jsx-runtime";
2
- import { forwardRef as K, useState as M, useRef as V, useImperativeHandle as Z, useEffect as O, useCallback as l } from "react";
3
- import { useConfig as B } from "./ConfigProvider.js";
4
- const F = "input", H = "input-xs", X = "input-sm", q = "input-lg", G = "input-error", J = "input-disabled", Q = K(
1
+ import { jsx as O } from "react/jsx-runtime";
2
+ import { forwardRef as M, useState as V, useRef as Z, useImperativeHandle as B, useEffect as j, useCallback as l } from "react";
3
+ import { useConfig as F } from "./ConfigProvider.js";
4
+ const H = "input", X = "input-xs", q = "input-sm", G = "input-lg", J = "input-error", Q = "input-disabled", U = M(
5
5
  ({
6
6
  length: r = 6,
7
7
  value: p = "",
8
8
  onChange: o,
9
9
  onComplete: m,
10
- size: j,
10
+ size: k,
11
11
  type: u = "number",
12
- mask: k = !1,
12
+ mask: y = !1,
13
13
  disabled: c = !1,
14
- error: y = !1,
15
- autoFocus: $ = !1,
16
- placeholder: z = "",
17
- className: P = ""
18
- }, b) => {
19
- const { componentSize: R } = B(), S = j ?? R ?? "md", [f, a] = M(() => {
14
+ error: z = !1,
15
+ autoFocus: I = !1,
16
+ placeholder: P = "",
17
+ className: b = "",
18
+ "data-testid": w
19
+ }, g) => {
20
+ const { componentSize: R } = F(), S = (t) => w ? `${w}-${t}` : void 0, T = k ?? R ?? "md", [a, f] = V(() => {
20
21
  const t = p.split("").slice(0, r);
21
22
  return [...t, ...Array(r - t.length).fill("")];
22
- }), n = V([]), g = {
23
- xs: `${H} w-8 h-8 text-sm`,
24
- sm: `${X} w-10 h-10 text-base`,
23
+ }), n = Z([]), E = {
24
+ xs: `${X} w-8 h-8 text-sm`,
25
+ sm: `${q} w-10 h-10 text-base`,
25
26
  md: "w-12 h-12 text-lg",
26
- lg: `${q} w-14 h-14 text-xl`,
27
+ lg: `${G} w-14 h-14 text-xl`,
27
28
  xl: "w-16 h-16 text-2xl"
28
29
  };
29
- Z(b, () => ({
30
+ B(g, () => ({
30
31
  focus: () => {
31
32
  n.current[0]?.focus();
32
33
  },
33
34
  clear: () => {
34
- a(Array(r).fill("")), n.current[0]?.focus();
35
+ f(Array(r).fill("")), n.current[0]?.focus();
35
36
  }
36
- })), O(() => {
37
- $ && n.current[0]?.focus();
38
- }, [$]), O(() => {
37
+ })), j(() => {
38
+ I && n.current[0]?.focus();
39
+ }, [I]), j(() => {
39
40
  const t = p.split("").slice(0, r);
40
- a([...t, ...Array(r - t.length).fill("")]);
41
+ f([...t, ...Array(r - t.length).fill("")]);
41
42
  }, [p, r]);
42
- const w = l(
43
+ const $ = l(
43
44
  (t, e) => {
44
45
  if (c || u === "number" && !/^\d*$/.test(e) || u === "text" && !/^[a-zA-Z0-9]*$/.test(e)) return;
45
- const s = [...f];
46
+ const s = [...a];
46
47
  if (e.length > 1) {
47
- const I = e.slice(0, r - t).split("");
48
- I.forEach((T, v) => {
49
- t + v < r && (s[t + v] = T);
50
- }), a(s);
48
+ const v = e.slice(0, r - t).split("");
49
+ v.forEach((K, A) => {
50
+ t + A < r && (s[t + A] = K);
51
+ }), f(s);
51
52
  const D = s.join("");
52
53
  o?.(D);
53
- const N = Math.min(t + I.length, r - 1);
54
- n.current[N]?.focus(), D.length === r && m?.(D);
54
+ const x = Math.min(t + v.length, r - 1);
55
+ n.current[x]?.focus(), D.length === r && m?.(D);
55
56
  return;
56
57
  }
57
- s[t] = e, a(s);
58
+ s[t] = e, f(s);
58
59
  const i = s.join("");
59
60
  o?.(i), e && t < r - 1 && n.current[t + 1]?.focus(), i.length === r && !i.includes("") && m?.(i);
60
61
  },
61
- [f, r, u, c, o, m]
62
- ), x = l(
62
+ [a, r, u, c, o, m]
63
+ ), L = l(
63
64
  (t, e) => {
64
65
  if (!c)
65
66
  if (e.key === "Backspace") {
66
67
  e.preventDefault();
67
- const s = [...f];
68
- f[t] ? (s[t] = "", a(s), o?.(s.join(""))) : t > 0 && (s[t - 1] = "", a(s), o?.(s.join("")), n.current[t - 1]?.focus());
68
+ const s = [...a];
69
+ a[t] ? (s[t] = "", f(s), o?.(s.join(""))) : t > 0 && (s[t - 1] = "", f(s), o?.(s.join("")), n.current[t - 1]?.focus());
69
70
  } else e.key === "ArrowLeft" && t > 0 ? (e.preventDefault(), n.current[t - 1]?.focus()) : e.key === "ArrowRight" && t < r - 1 && (e.preventDefault(), n.current[t + 1]?.focus());
70
71
  },
71
- [f, r, c, o]
72
- ), E = l(
72
+ [a, r, c, o]
73
+ ), N = l(
73
74
  (t) => {
74
75
  if (t.preventDefault(), c) return;
75
76
  const e = t.clipboardData.getData("text"), s = u === "number" ? e.replace(/\D/g, "") : e.replace(/[^a-zA-Z0-9]/g, "");
76
- s && w(0, s);
77
+ s && $(0, s);
77
78
  },
78
- [u, c, w]
79
- ), L = l((t) => {
79
+ [u, c, $]
80
+ ), d = l((t) => {
80
81
  t.target.select();
81
82
  }, []);
82
- return /* @__PURE__ */ A("div", { className: `flex gap-2 ${P}`, children: f.map((t, e) => /* @__PURE__ */ A(
83
+ return /* @__PURE__ */ O("div", { className: `flex gap-2 ${b}`, "data-testid": w, children: a.map((t, e) => /* @__PURE__ */ O(
83
84
  "input",
84
85
  {
85
86
  ref: (s) => {
86
87
  n.current[e] = s;
87
88
  },
88
- type: k ? "password" : u === "number" ? "tel" : "text",
89
+ "data-testid": S(`input-${e}`),
90
+ type: y ? "password" : u === "number" ? "tel" : "text",
89
91
  inputMode: u === "number" ? "numeric" : "text",
90
92
  maxLength: 1,
91
93
  value: t,
92
- placeholder: z,
94
+ placeholder: P,
93
95
  disabled: c,
94
- onChange: (s) => w(e, s.target.value),
95
- onKeyDown: (s) => x(e, s),
96
- onPaste: E,
97
- onFocus: L,
96
+ onChange: (s) => $(e, s.target.value),
97
+ onKeyDown: (s) => L(e, s),
98
+ onPaste: N,
99
+ onFocus: d,
98
100
  className: `
99
- ${F} text-center font-mono
100
- ${g[S]}
101
- ${y ? G : ""}
102
- ${c ? `${J} opacity-50` : ""}
101
+ ${H} text-center font-mono
102
+ ${E[T]}
103
+ ${z ? J : ""}
104
+ ${c ? `${Q} opacity-50` : ""}
103
105
  `,
104
106
  "aria-label": `OTP digit ${e + 1}`
105
107
  },
@@ -107,8 +109,8 @@ const F = "input", H = "input-xs", X = "input-sm", q = "input-lg", G = "input-er
107
109
  )) });
108
110
  }
109
111
  );
110
- Q.displayName = "OTPInput";
112
+ U.displayName = "OTPInput";
111
113
  export {
112
- Q as OTPInput
114
+ U as OTPInput
113
115
  };
114
116
  //# sourceMappingURL=OTPInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OTPInput.js","sources":["../../src/components/OTPInput.tsx"],"sourcesContent":["import React, { useRef, useState, useEffect, useCallback, forwardRef, useImperativeHandle } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dInput = 'input'\nconst dInputXs = 'input-xs'\nconst dInputSm = 'input-sm'\nconst dInputLg = 'input-lg'\nconst dInputError = 'input-error'\nconst dInputDisabled = 'input-disabled'\n\nexport interface OTPInputProps {\n /** Number of input fields */\n length?: number\n /** Current value */\n value?: string\n /** Callback when value changes */\n onChange?: (value: string) => void\n /** Callback when all fields are filled */\n onComplete?: (value: string) => void\n /** Input size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Input type - number only or alphanumeric */\n type?: 'number' | 'text'\n /** Mask input (show dots instead of characters) */\n mask?: boolean\n /** Disabled state */\n disabled?: boolean\n /** Error state */\n error?: boolean\n /** Auto focus first input on mount */\n autoFocus?: boolean\n /** Placeholder character */\n placeholder?: string\n /** Additional CSS classes */\n className?: string\n}\n\nexport interface OTPInputRef {\n focus: () => void\n clear: () => void\n}\n\nexport const OTPInput = forwardRef<OTPInputRef, OTPInputProps>(\n (\n {\n length = 6,\n value = '',\n onChange,\n onComplete,\n size,\n type = 'number',\n mask = false,\n disabled = false,\n error = false,\n autoFocus = false,\n placeholder = '',\n className = '',\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const [otp, setOtp] = useState<string[]>(() => {\n const initial = value.split('').slice(0, length)\n return [...initial, ...Array(length - initial.length).fill('')]\n })\n\n const inputRefs = useRef<(HTMLInputElement | null)[]>([])\n\n const sizeClasses = {\n xs: `${dInputXs} w-8 h-8 text-sm`,\n sm: `${dInputSm} w-10 h-10 text-base`,\n md: 'w-12 h-12 text-lg',\n lg: `${dInputLg} w-14 h-14 text-xl`,\n xl: 'w-16 h-16 text-2xl',\n }\n\n useImperativeHandle(ref, () => ({\n focus: () => {\n inputRefs.current[0]?.focus()\n },\n clear: () => {\n setOtp(Array(length).fill(''))\n inputRefs.current[0]?.focus()\n },\n }))\n\n useEffect(() => {\n if (autoFocus) {\n inputRefs.current[0]?.focus()\n }\n }, [autoFocus])\n\n useEffect(() => {\n const newOtp = value.split('').slice(0, length)\n setOtp([...newOtp, ...Array(length - newOtp.length).fill('')])\n }, [value, length])\n\n const handleChange = useCallback(\n (index: number, char: string) => {\n if (disabled) return\n\n // Validate input\n if (type === 'number' && !/^\\d*$/.test(char)) return\n if (type === 'text' && !/^[a-zA-Z0-9]*$/.test(char)) return\n\n const newOtp = [...otp]\n\n // Handle paste of multiple characters\n if (char.length > 1) {\n const chars = char.slice(0, length - index).split('')\n chars.forEach((c, i) => {\n if (index + i < length) {\n newOtp[index + i] = c\n }\n })\n setOtp(newOtp)\n\n const newValue = newOtp.join('')\n onChange?.(newValue)\n\n // Focus appropriate field\n const nextIndex = Math.min(index + chars.length, length - 1)\n inputRefs.current[nextIndex]?.focus()\n\n if (newValue.length === length) {\n onComplete?.(newValue)\n }\n return\n }\n\n // Single character\n newOtp[index] = char\n setOtp(newOtp)\n\n const newValue = newOtp.join('')\n onChange?.(newValue)\n\n // Move to next input\n if (char && index < length - 1) {\n inputRefs.current[index + 1]?.focus()\n }\n\n if (newValue.length === length && !newValue.includes('')) {\n onComplete?.(newValue)\n }\n },\n [otp, length, type, disabled, onChange, onComplete]\n )\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return\n\n if (e.key === 'Backspace') {\n e.preventDefault()\n const newOtp = [...otp]\n\n if (otp[index]) {\n // Clear current field\n newOtp[index] = ''\n setOtp(newOtp)\n onChange?.(newOtp.join(''))\n } else if (index > 0) {\n // Move to previous field and clear it\n newOtp[index - 1] = ''\n setOtp(newOtp)\n onChange?.(newOtp.join(''))\n inputRefs.current[index - 1]?.focus()\n }\n } else if (e.key === 'ArrowLeft' && index > 0) {\n e.preventDefault()\n inputRefs.current[index - 1]?.focus()\n } else if (e.key === 'ArrowRight' && index < length - 1) {\n e.preventDefault()\n inputRefs.current[index + 1]?.focus()\n }\n },\n [otp, length, disabled, onChange]\n )\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n e.preventDefault()\n if (disabled) return\n\n const pastedData = e.clipboardData.getData('text')\n const filteredData =\n type === 'number'\n ? pastedData.replace(/\\D/g, '')\n : pastedData.replace(/[^a-zA-Z0-9]/g, '')\n\n if (filteredData) {\n handleChange(0, filteredData)\n }\n },\n [type, disabled, handleChange]\n )\n\n const handleFocus = useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.target.select()\n }, [])\n\n return (\n <div className={`flex gap-2 ${className}`}>\n {otp.map((digit, index) => (\n <input\n key={index}\n ref={(el) => {\n inputRefs.current[index] = el\n }}\n type={mask ? 'password' : type === 'number' ? 'tel' : 'text'}\n inputMode={type === 'number' ? 'numeric' : 'text'}\n maxLength={1}\n value={digit}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => handleChange(index, e.target.value)}\n onKeyDown={(e) => handleKeyDown(index, e)}\n onPaste={handlePaste}\n onFocus={handleFocus}\n className={`\n ${dInput} text-center font-mono\n ${sizeClasses[effectiveSize]}\n ${error ? dInputError : ''}\n ${disabled ? `${dInputDisabled} opacity-50` : ''}\n `}\n aria-label={`OTP digit ${index + 1}`}\n />\n ))}\n </div>\n )\n }\n)\n\nOTPInput.displayName = 'OTPInput'\n"],"names":["dInput","dInputXs","dInputSm","dInputLg","dInputError","dInputDisabled","OTPInput","forwardRef","length","value","onChange","onComplete","size","type","mask","disabled","error","autoFocus","placeholder","className","ref","componentSize","useConfig","effectiveSize","otp","setOtp","useState","initial","inputRefs","useRef","sizeClasses","useImperativeHandle","useEffect","newOtp","handleChange","useCallback","index","char","chars","c","i","newValue","nextIndex","handleKeyDown","handlePaste","e","pastedData","filteredData","handleFocus","jsx","digit","el"],"mappings":"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"}
1
+ {"version":3,"file":"OTPInput.js","sources":["../../src/components/OTPInput.tsx"],"sourcesContent":["import React, { useRef, useState, useEffect, useCallback, forwardRef, useImperativeHandle } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dInput = 'input'\nconst dInputXs = 'input-xs'\nconst dInputSm = 'input-sm'\nconst dInputLg = 'input-lg'\nconst dInputError = 'input-error'\nconst dInputDisabled = 'input-disabled'\n\nexport interface OTPInputProps {\n /** Number of input fields */\n length?: number\n /** Current value */\n value?: string\n /** Callback when value changes */\n onChange?: (value: string) => void\n /** Callback when all fields are filled */\n onComplete?: (value: string) => void\n /** Input size */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Input type - number only or alphanumeric */\n type?: 'number' | 'text'\n /** Mask input (show dots instead of characters) */\n mask?: boolean\n /** Disabled state */\n disabled?: boolean\n /** Error state */\n error?: boolean\n /** Auto focus first input on mount */\n autoFocus?: boolean\n /** Placeholder character */\n placeholder?: string\n /** Additional CSS classes */\n className?: string\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport interface OTPInputRef {\n focus: () => void\n clear: () => void\n}\n\nexport const OTPInput = forwardRef<OTPInputRef, OTPInputProps>(\n (\n {\n length = 6,\n value = '',\n onChange,\n onComplete,\n size,\n type = 'number',\n mask = false,\n disabled = false,\n error = false,\n autoFocus = false,\n placeholder = '',\n className = '',\n 'data-testid': testId,\n },\n ref\n ) => {\n const { componentSize } = useConfig()\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n const effectiveSize = size ?? componentSize ?? 'md'\n const [otp, setOtp] = useState<string[]>(() => {\n const initial = value.split('').slice(0, length)\n return [...initial, ...Array(length - initial.length).fill('')]\n })\n\n const inputRefs = useRef<(HTMLInputElement | null)[]>([])\n\n const sizeClasses = {\n xs: `${dInputXs} w-8 h-8 text-sm`,\n sm: `${dInputSm} w-10 h-10 text-base`,\n md: 'w-12 h-12 text-lg',\n lg: `${dInputLg} w-14 h-14 text-xl`,\n xl: 'w-16 h-16 text-2xl',\n }\n\n useImperativeHandle(ref, () => ({\n focus: () => {\n inputRefs.current[0]?.focus()\n },\n clear: () => {\n setOtp(Array(length).fill(''))\n inputRefs.current[0]?.focus()\n },\n }))\n\n useEffect(() => {\n if (autoFocus) {\n inputRefs.current[0]?.focus()\n }\n }, [autoFocus])\n\n useEffect(() => {\n const newOtp = value.split('').slice(0, length)\n setOtp([...newOtp, ...Array(length - newOtp.length).fill('')])\n }, [value, length])\n\n const handleChange = useCallback(\n (index: number, char: string) => {\n if (disabled) return\n\n // Validate input\n if (type === 'number' && !/^\\d*$/.test(char)) return\n if (type === 'text' && !/^[a-zA-Z0-9]*$/.test(char)) return\n\n const newOtp = [...otp]\n\n // Handle paste of multiple characters\n if (char.length > 1) {\n const chars = char.slice(0, length - index).split('')\n chars.forEach((c, i) => {\n if (index + i < length) {\n newOtp[index + i] = c\n }\n })\n setOtp(newOtp)\n\n const newValue = newOtp.join('')\n onChange?.(newValue)\n\n // Focus appropriate field\n const nextIndex = Math.min(index + chars.length, length - 1)\n inputRefs.current[nextIndex]?.focus()\n\n if (newValue.length === length) {\n onComplete?.(newValue)\n }\n return\n }\n\n // Single character\n newOtp[index] = char\n setOtp(newOtp)\n\n const newValue = newOtp.join('')\n onChange?.(newValue)\n\n // Move to next input\n if (char && index < length - 1) {\n inputRefs.current[index + 1]?.focus()\n }\n\n if (newValue.length === length && !newValue.includes('')) {\n onComplete?.(newValue)\n }\n },\n [otp, length, type, disabled, onChange, onComplete]\n )\n\n const handleKeyDown = useCallback(\n (index: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return\n\n if (e.key === 'Backspace') {\n e.preventDefault()\n const newOtp = [...otp]\n\n if (otp[index]) {\n // Clear current field\n newOtp[index] = ''\n setOtp(newOtp)\n onChange?.(newOtp.join(''))\n } else if (index > 0) {\n // Move to previous field and clear it\n newOtp[index - 1] = ''\n setOtp(newOtp)\n onChange?.(newOtp.join(''))\n inputRefs.current[index - 1]?.focus()\n }\n } else if (e.key === 'ArrowLeft' && index > 0) {\n e.preventDefault()\n inputRefs.current[index - 1]?.focus()\n } else if (e.key === 'ArrowRight' && index < length - 1) {\n e.preventDefault()\n inputRefs.current[index + 1]?.focus()\n }\n },\n [otp, length, disabled, onChange]\n )\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent) => {\n e.preventDefault()\n if (disabled) return\n\n const pastedData = e.clipboardData.getData('text')\n const filteredData =\n type === 'number'\n ? pastedData.replace(/\\D/g, '')\n : pastedData.replace(/[^a-zA-Z0-9]/g, '')\n\n if (filteredData) {\n handleChange(0, filteredData)\n }\n },\n [type, disabled, handleChange]\n )\n\n const handleFocus = useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.target.select()\n }, [])\n\n return (\n <div className={`flex gap-2 ${className}`} data-testid={testId}>\n {otp.map((digit, index) => (\n <input\n key={index}\n ref={(el) => {\n inputRefs.current[index] = el\n }}\n data-testid={getTestId(`input-${index}`)}\n type={mask ? 'password' : type === 'number' ? 'tel' : 'text'}\n inputMode={type === 'number' ? 'numeric' : 'text'}\n maxLength={1}\n value={digit}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => handleChange(index, e.target.value)}\n onKeyDown={(e) => handleKeyDown(index, e)}\n onPaste={handlePaste}\n onFocus={handleFocus}\n className={`\n ${dInput} text-center font-mono\n ${sizeClasses[effectiveSize]}\n ${error ? dInputError : ''}\n ${disabled ? `${dInputDisabled} opacity-50` : ''}\n `}\n aria-label={`OTP digit ${index + 1}`}\n />\n ))}\n </div>\n )\n }\n)\n\nOTPInput.displayName = 'OTPInput'\n"],"names":["dInput","dInputXs","dInputSm","dInputLg","dInputError","dInputDisabled","OTPInput","forwardRef","length","value","onChange","onComplete","size","type","mask","disabled","error","autoFocus","placeholder","className","testId","ref","componentSize","useConfig","getTestId","suffix","effectiveSize","otp","setOtp","useState","initial","inputRefs","useRef","sizeClasses","useImperativeHandle","useEffect","newOtp","handleChange","useCallback","index","char","chars","c","i","newValue","nextIndex","handleKeyDown","handlePaste","e","pastedData","filteredData","handleFocus","jsx","digit","el"],"mappings":"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"}
@@ -14,5 +14,7 @@ export interface PaginationProps extends Omit<React.HTMLAttributes<HTMLDivElemen
14
14
  simple?: boolean;
15
15
  size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
16
16
  disabled?: boolean;
17
+ /** Test ID prefix for child elements */
18
+ 'data-testid'?: string;
17
19
  }
18
- export declare const Pagination: React.FC<PaginationProps>;
20
+ export declare const Pagination: React.ForwardRefExoticComponent<PaginationProps & React.RefAttributes<HTMLDivElement>>;
@@ -1,35 +1,36 @@
1
- import { jsxs as m, jsx as i } from "react/jsx-runtime";
2
- import g from "react";
3
- import { useConfig as R } from "./ConfigProvider.js";
4
- const r = "btn", B = "btn-ghost", q = "btn-active", H = "btn-disabled", O = "btn-xs", Q = "btn-sm", T = "btn-lg", U = "btn-xl", V = "select", W = "select-bordered", Y = "join", u = "join-item", Z = "input", se = ({
5
- current: h,
6
- defaultCurrent: S = 1,
7
- total: p,
8
- pageSize: $,
9
- defaultPageSize: k = 10,
10
- pageSizeOptions: j = [10, 20, 50, 100],
1
+ import { jsxs as u, jsx as a } from "react/jsx-runtime";
2
+ import x, { forwardRef as V } from "react";
3
+ import { useConfig as W } from "./ConfigProvider.js";
4
+ const d = "btn", T = "btn-ghost", Y = "btn-active", Z = "btn-disabled", _ = "btn-xs", ee = "btn-sm", te = "btn-lg", se = "btn-xl", ne = "select", ae = "select-bordered", ie = "join", p = "join-item", le = "input", me = V(function({
5
+ current: f,
6
+ defaultCurrent: y = 1,
7
+ total: h,
8
+ pageSize: b,
9
+ defaultPageSize: J = 10,
10
+ pageSizeOptions: w = [10, 20, 50, 100],
11
11
  onChange: N,
12
12
  onShowSizeChange: I,
13
- showSizeChanger: y = !1,
14
- showQuickJumper: J = !1,
15
- showTotal: f = !1,
16
- simple: M = !1,
17
- size: w,
18
- disabled: a = !1,
19
- className: b = "",
20
- ...v
21
- }) => {
22
- const { componentSize: D } = R(), G = w ?? D ?? "md", [L, x] = g.useState(S), [X, z] = g.useState(k), [C, P] = g.useState(""), t = h !== void 0 ? h : L, d = $ !== void 0 ? $ : X, n = Math.ceil(p / d), o = (e) => {
23
- e < 1 || e > n || a || (h === void 0 && x(e), N?.(e, d));
24
- }, A = (e) => {
25
- const l = Math.ceil(p / e), s = t > l ? l : t;
26
- $ === void 0 && z(e), h === void 0 && s !== t && x(s), I?.(s, e), N?.(s, e);
27
- }, E = (e) => {
13
+ showSizeChanger: M = !1,
14
+ showQuickJumper: z = !1,
15
+ showTotal: v = !1,
16
+ simple: D = !1,
17
+ size: G,
18
+ disabled: l = !1,
19
+ "data-testid": g,
20
+ className: P = "",
21
+ ...C
22
+ }, B) {
23
+ const { componentSize: L, locale: R } = W(), X = G ?? L ?? "md", i = (e) => g ? `${g}-${e}` : void 0, m = R.Pagination ?? {}, A = m.itemsPerPage ?? "/ page", E = m.goTo ?? "Go to", [F, S] = x.useState(y), [K, q] = x.useState(J), [k, j] = x.useState(""), t = f !== void 0 ? f : F, $ = b !== void 0 ? b : K, n = Math.ceil(h / $), r = (e) => {
24
+ e < 1 || e > n || l || (f === void 0 && S(e), N?.(e, $));
25
+ }, H = (e) => {
26
+ const o = Math.ceil(h / e), s = t > o ? o : t;
27
+ b === void 0 && q(e), f === void 0 && s !== t && S(s), I?.(s, e), N?.(s, e);
28
+ }, O = (e) => {
28
29
  if (e.key === "Enter") {
29
- const l = parseInt(C);
30
- !isNaN(l) && l >= 1 && l <= n && (o(l), P(""));
30
+ const o = parseInt(k);
31
+ !isNaN(o) && o >= 1 && o <= n && (r(o), j(""));
31
32
  }
32
- }, F = () => {
33
+ }, Q = () => {
33
34
  const e = [];
34
35
  if (n <= 7)
35
36
  for (let s = 1; s <= n; s++)
@@ -50,126 +51,139 @@ const r = "btn", B = "btn-ghost", q = "btn-active", H = "btn-disabled", O = "btn
50
51
  }
51
52
  return e;
52
53
  }, c = {
53
- xs: O,
54
- sm: Q,
54
+ xs: _,
55
+ sm: ee,
55
56
  md: "",
56
- lg: T,
57
- xl: U
58
- }[G], K = [
59
- (t - 1) * d + 1,
60
- Math.min(t * d, p)
57
+ lg: te,
58
+ xl: se
59
+ }[X], U = [
60
+ (t - 1) * $ + 1,
61
+ Math.min(t * $, h)
61
62
  ];
62
- return M ? /* @__PURE__ */ m("div", { className: `flex items-center gap-2 ${b}`, ...v, children: [
63
- /* @__PURE__ */ i(
63
+ return D ? /* @__PURE__ */ u("div", { ref: B, className: `flex items-center gap-2 ${P}`, "data-testid": g, ...C, children: [
64
+ /* @__PURE__ */ a(
64
65
  "button",
65
66
  {
66
- className: `${r} ${B} ${c}`,
67
- onClick: () => o(t - 1),
68
- disabled: a || t === 1,
67
+ className: `${d} ${T} ${c}`,
68
+ onClick: () => r(t - 1),
69
+ disabled: l || t === 1,
70
+ "data-testid": i("prev"),
71
+ "aria-label": m.prev ?? "Previous",
69
72
  children: "‹"
70
73
  }
71
74
  ),
72
- /* @__PURE__ */ m("span", { className: "text-sm", children: [
75
+ /* @__PURE__ */ u("span", { className: "text-sm", children: [
73
76
  t,
74
77
  " / ",
75
78
  n
76
79
  ] }),
77
- /* @__PURE__ */ i(
80
+ /* @__PURE__ */ a(
78
81
  "button",
79
82
  {
80
- className: `${r} ${B} ${c}`,
81
- onClick: () => o(t + 1),
82
- disabled: a || t === n,
83
+ className: `${d} ${T} ${c}`,
84
+ onClick: () => r(t + 1),
85
+ disabled: l || t === n,
86
+ "data-testid": i("next"),
87
+ "aria-label": m.next ?? "Next",
83
88
  children: "›"
84
89
  }
85
90
  )
86
- ] }) : /* @__PURE__ */ m("div", { className: `flex flex-wrap items-center gap-4 ${b}`, ...v, children: [
87
- f && /* @__PURE__ */ i("div", { className: "text-sm text-base-content/70", children: typeof f == "function" ? f(p, K) : `Total ${p} items` }),
88
- y && /* @__PURE__ */ i(
91
+ ] }) : /* @__PURE__ */ u("div", { ref: B, className: `flex flex-wrap items-center gap-4 ${P}`, "data-testid": g, ...C, children: [
92
+ v && /* @__PURE__ */ a("div", { className: "text-sm text-base-content/70", "data-testid": i("total"), children: typeof v == "function" ? v(h, U) : `Total ${h} ${m.items ?? "items"}` }),
93
+ M && /* @__PURE__ */ a(
89
94
  "select",
90
95
  {
91
- className: `${V} ${W} ${c}`,
92
- value: d,
93
- onChange: (e) => A(Number(e.target.value)),
94
- disabled: a,
95
- children: j.map((e) => /* @__PURE__ */ m("option", { value: e, children: [
96
+ className: `${ne} ${ae} ${c}`,
97
+ value: $,
98
+ onChange: (e) => H(Number(e.target.value)),
99
+ disabled: l,
100
+ "data-testid": i("size-changer"),
101
+ children: w.map((e) => /* @__PURE__ */ u("option", { value: e, children: [
96
102
  e,
97
- " / page"
103
+ " ",
104
+ A
98
105
  ] }, e))
99
106
  }
100
107
  ),
101
- /* @__PURE__ */ m("div", { className: Y, children: [
102
- /* @__PURE__ */ i(
108
+ /* @__PURE__ */ u("div", { className: ie, "data-testid": i("controls"), children: [
109
+ /* @__PURE__ */ a(
103
110
  "button",
104
111
  {
105
- className: `${u} ${r} ${c}`,
106
- onClick: () => o(1),
107
- disabled: a || t === 1,
108
- title: "First page",
112
+ className: `${p} ${d} ${c}`,
113
+ onClick: () => r(1),
114
+ disabled: l || t === 1,
115
+ "aria-label": "First page",
116
+ "data-testid": i("first"),
109
117
  children: "«"
110
118
  }
111
119
  ),
112
- /* @__PURE__ */ i(
120
+ /* @__PURE__ */ a(
113
121
  "button",
114
122
  {
115
- className: `${u} ${r} ${c}`,
116
- onClick: () => o(t - 1),
117
- disabled: a || t === 1,
118
- title: "Previous page",
123
+ className: `${p} ${d} ${c}`,
124
+ onClick: () => r(t - 1),
125
+ disabled: l || t === 1,
126
+ "aria-label": m.prev ?? "Previous",
127
+ "data-testid": i("prev"),
119
128
  children: "‹"
120
129
  }
121
130
  ),
122
- F().map((e, l) => e === "ellipsis" ? /* @__PURE__ */ i("button", { className: `${u} ${r} ${H} ${c}`, children: "..." }, `ellipsis-${l}`) : /* @__PURE__ */ i(
131
+ Q().map((e, o) => e === "ellipsis" ? /* @__PURE__ */ a("button", { className: `${p} ${d} ${Z} ${c}`, children: "..." }, `ellipsis-${o}`) : /* @__PURE__ */ a(
123
132
  "button",
124
133
  {
125
- className: `${u} ${r} ${c} ${t === e ? q : ""}`,
126
- onClick: () => o(e),
127
- disabled: a,
134
+ className: `${p} ${d} ${c} ${t === e ? Y : ""}`,
135
+ onClick: () => r(e),
136
+ disabled: l,
137
+ "data-testid": i(`page-${e}`),
138
+ "aria-current": t === e ? "page" : void 0,
128
139
  children: e
129
140
  },
130
141
  e
131
142
  )),
132
- /* @__PURE__ */ i(
143
+ /* @__PURE__ */ a(
133
144
  "button",
134
145
  {
135
- className: `${u} ${r} ${c}`,
136
- onClick: () => o(t + 1),
137
- disabled: a || t === n,
138
- title: "Next page",
146
+ className: `${p} ${d} ${c}`,
147
+ onClick: () => r(t + 1),
148
+ disabled: l || t === n,
149
+ "aria-label": m.next ?? "Next",
150
+ "data-testid": i("next"),
139
151
  children: "›"
140
152
  }
141
153
  ),
142
- /* @__PURE__ */ i(
154
+ /* @__PURE__ */ a(
143
155
  "button",
144
156
  {
145
- className: `${u} ${r} ${c}`,
146
- onClick: () => o(n),
147
- disabled: a || t === n,
148
- title: "Last page",
157
+ className: `${p} ${d} ${c}`,
158
+ onClick: () => r(n),
159
+ disabled: l || t === n,
160
+ "aria-label": "Last page",
161
+ "data-testid": i("last"),
149
162
  children: "»"
150
163
  }
151
164
  )
152
165
  ] }),
153
- J && /* @__PURE__ */ m("div", { className: "flex items-center gap-2", children: [
154
- /* @__PURE__ */ i("span", { className: "text-sm", children: "Go to" }),
155
- /* @__PURE__ */ i(
166
+ z && /* @__PURE__ */ u("div", { className: "flex items-center gap-2", children: [
167
+ /* @__PURE__ */ a("span", { className: "text-sm", children: E }),
168
+ /* @__PURE__ */ a(
156
169
  "input",
157
170
  {
158
171
  type: "number",
159
- className: `${Z} w-16 ${c}`,
172
+ className: `${le} w-16 ${c}`,
160
173
  min: 1,
161
174
  max: n,
162
- value: C,
163
- onChange: (e) => P(e.target.value),
164
- onKeyDown: E,
165
- disabled: a,
166
- placeholder: String(t)
175
+ value: k,
176
+ onChange: (e) => j(e.target.value),
177
+ onKeyDown: O,
178
+ disabled: l,
179
+ placeholder: String(t),
180
+ "data-testid": i("jumper")
167
181
  }
168
182
  )
169
183
  ] })
170
184
  ] });
171
- };
185
+ });
172
186
  export {
173
- se as Pagination
187
+ me as Pagination
174
188
  };
175
189
  //# sourceMappingURL=Pagination.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.js","sources":["../../src/components/Pagination.tsx"],"sourcesContent":["import React from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnActive = 'btn-active'\nconst dBtnDisabled = 'btn-disabled'\nconst dBtnXs = 'btn-xs'\nconst dBtnSm = 'btn-sm'\nconst dBtnLg = 'btn-lg'\nconst dBtnXl = 'btn-xl'\nconst dSelect = 'select'\nconst dSelectBordered = 'select-bordered'\nconst dJoin = 'join'\nconst dJoinItem = 'join-item'\nconst dInput = 'input'\n\nexport interface PaginationProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n current?: number\n defaultCurrent?: number\n total: number\n pageSize?: number\n defaultPageSize?: number\n pageSizeOptions?: number[]\n onChange?: (page: number, pageSize: number) => void\n onShowSizeChange?: (current: number, size: number) => void\n showSizeChanger?: boolean\n showQuickJumper?: boolean\n showTotal?: boolean | ((total: number, range: [number, number]) => React.ReactNode)\n simple?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n disabled?: boolean\n}\n\nexport const Pagination: React.FC<PaginationProps> = ({\n current: controlledCurrent,\n defaultCurrent = 1,\n total,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n pageSizeOptions = [10, 20, 50, 100],\n onChange,\n onShowSizeChange,\n showSizeChanger = false,\n showQuickJumper = false,\n showTotal = false,\n simple = false,\n size,\n disabled = false,\n className = '',\n ...rest\n}) => {\n const { componentSize } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n const [internalCurrent, setInternalCurrent] = React.useState(defaultCurrent)\n const [internalPageSize, setInternalPageSize] = React.useState(defaultPageSize)\n const [jumpPage, setJumpPage] = React.useState('')\n\n const current = controlledCurrent !== undefined ? controlledCurrent : internalCurrent\n const pageSize = controlledPageSize !== undefined ? controlledPageSize : internalPageSize\n const totalPages = Math.ceil(total / pageSize)\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || disabled) return\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page)\n }\n onChange?.(page, pageSize)\n }\n\n const handlePageSizeChange = (newSize: number) => {\n const newTotalPages = Math.ceil(total / newSize)\n const newCurrent = current > newTotalPages ? newTotalPages : current\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newSize)\n }\n if (controlledCurrent === undefined && newCurrent !== current) {\n setInternalCurrent(newCurrent)\n }\n\n onShowSizeChange?.(newCurrent, newSize)\n onChange?.(newCurrent, newSize)\n }\n\n const handleJumpPage = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n const page = parseInt(jumpPage)\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n handlePageChange(page)\n setJumpPage('')\n }\n }\n }\n\n const getPageNumbers = (): (number | 'ellipsis')[] => {\n const pages: (number | 'ellipsis')[] = []\n const showPages = 7\n\n if (totalPages <= showPages) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (current <= 3) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n } else if (current >= totalPages - 2) {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n }\n }\n\n return pages\n }\n\n const sizeClass = {\n xs: dBtnXs,\n sm: dBtnSm,\n md: '',\n lg: dBtnLg,\n xl: dBtnXl,\n }[effectiveSize]\n\n const range: [number, number] = [\n (current - 1) * pageSize + 1,\n Math.min(current * pageSize, total),\n ]\n\n if (simple) {\n return (\n <div className={`flex items-center gap-2 ${className}`} {...rest}>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n >\n ‹\n </button>\n <span className=\"text-sm\">\n {current} / {totalPages}\n </span>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n >\n ›\n </button>\n </div>\n )\n }\n\n return (\n <div className={`flex flex-wrap items-center gap-4 ${className}`} {...rest}>\n {/* Total */}\n {showTotal && (\n <div className=\"text-sm text-base-content/70\">\n {typeof showTotal === 'function'\n ? showTotal(total, range)\n : `Total ${total} items`}\n </div>\n )}\n\n {/* Page Size Changer */}\n {showSizeChanger && (\n <select\n className={`${dSelect} ${dSelectBordered} ${sizeClass}`}\n value={pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n disabled={disabled}\n >\n {pageSizeOptions.map((size) => (\n <option key={size} value={size}>\n {size} / page\n </option>\n ))}\n </select>\n )}\n\n {/* Pagination Controls */}\n <div className={dJoin}>\n {/* First */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(1)}\n disabled={disabled || current === 1}\n title=\"First page\"\n >\n «\n </button>\n\n {/* Previous */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n title=\"Previous page\"\n >\n ‹\n </button>\n\n {/* Page Numbers */}\n {getPageNumbers().map((page, index) => {\n if (page === 'ellipsis') {\n return (\n <button key={`ellipsis-${index}`} className={`${dJoinItem} ${dBtn} ${dBtnDisabled} ${sizeClass}`}>\n ...\n </button>\n )\n }\n\n return (\n <button\n key={page}\n className={`${dJoinItem} ${dBtn} ${sizeClass} ${current === page ? dBtnActive : ''}`}\n onClick={() => handlePageChange(page)}\n disabled={disabled}\n >\n {page}\n </button>\n )\n })}\n\n {/* Next */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n title=\"Next page\"\n >\n ›\n </button>\n\n {/* Last */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(totalPages)}\n disabled={disabled || current === totalPages}\n title=\"Last page\"\n >\n »\n </button>\n </div>\n\n {/* Quick Jumper */}\n {showQuickJumper && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">Go to</span>\n <input\n type=\"number\"\n className={`${dInput} w-16 ${sizeClass}`}\n min={1}\n max={totalPages}\n value={jumpPage}\n onChange={(e) => setJumpPage(e.target.value)}\n onKeyDown={handleJumpPage}\n disabled={disabled}\n placeholder={String(current)}\n />\n </div>\n )}\n </div>\n )\n}\n"],"names":["dBtn","dBtnGhost","dBtnActive","dBtnDisabled","dBtnXs","dBtnSm","dBtnLg","dBtnXl","dSelect","dSelectBordered","dJoin","dJoinItem","dInput","Pagination","controlledCurrent","defaultCurrent","total","controlledPageSize","defaultPageSize","pageSizeOptions","onChange","onShowSizeChange","showSizeChanger","showQuickJumper","showTotal","simple","size","disabled","className","rest","componentSize","useConfig","effectiveSize","internalCurrent","setInternalCurrent","React","internalPageSize","setInternalPageSize","jumpPage","setJumpPage","current","pageSize","totalPages","handlePageChange","page","handlePageSizeChange","newSize","newTotalPages","newCurrent","handleJumpPage","getPageNumbers","pages","i","sizeClass","range","jsx","jsxs","index"],"mappings":"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"}
1
+ {"version":3,"file":"Pagination.js","sources":["../../src/components/Pagination.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\nimport { useConfig } from './ConfigProvider'\n\n// DaisyUI classes\nconst dBtn = 'btn'\nconst dBtnGhost = 'btn-ghost'\nconst dBtnActive = 'btn-active'\nconst dBtnDisabled = 'btn-disabled'\nconst dBtnXs = 'btn-xs'\nconst dBtnSm = 'btn-sm'\nconst dBtnLg = 'btn-lg'\nconst dBtnXl = 'btn-xl'\nconst dSelect = 'select'\nconst dSelectBordered = 'select-bordered'\nconst dJoin = 'join'\nconst dJoinItem = 'join-item'\nconst dInput = 'input'\n\nexport interface PaginationProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n current?: number\n defaultCurrent?: number\n total: number\n pageSize?: number\n defaultPageSize?: number\n pageSizeOptions?: number[]\n onChange?: (page: number, pageSize: number) => void\n onShowSizeChange?: (current: number, size: number) => void\n showSizeChanger?: boolean\n showQuickJumper?: boolean\n showTotal?: boolean | ((total: number, range: [number, number]) => React.ReactNode)\n simple?: boolean\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n disabled?: boolean\n /** Test ID prefix for child elements */\n 'data-testid'?: string\n}\n\nexport const Pagination = forwardRef<HTMLDivElement, PaginationProps>(function Pagination(\n {\n current: controlledCurrent,\n defaultCurrent = 1,\n total,\n pageSize: controlledPageSize,\n defaultPageSize = 10,\n pageSizeOptions = [10, 20, 50, 100],\n onChange,\n onShowSizeChange,\n showSizeChanger = false,\n showQuickJumper = false,\n showTotal = false,\n simple = false,\n size,\n disabled = false,\n 'data-testid': testId,\n className = '',\n ...rest\n },\n ref\n) {\n const { componentSize, locale } = useConfig()\n const effectiveSize = size ?? componentSize ?? 'md'\n\n // Helper for test IDs\n const getTestId = (suffix: string) => (testId ? `${testId}-${suffix}` : undefined)\n\n // Locale strings with fallbacks\n const l = locale.Pagination ?? {}\n const itemsPerPageText = l.itemsPerPage ?? '/ page'\n const goToText = l.goTo ?? 'Go to'\n const [internalCurrent, setInternalCurrent] = React.useState(defaultCurrent)\n const [internalPageSize, setInternalPageSize] = React.useState(defaultPageSize)\n const [jumpPage, setJumpPage] = React.useState('')\n\n const current = controlledCurrent !== undefined ? controlledCurrent : internalCurrent\n const pageSize = controlledPageSize !== undefined ? controlledPageSize : internalPageSize\n const totalPages = Math.ceil(total / pageSize)\n\n const handlePageChange = (page: number) => {\n if (page < 1 || page > totalPages || disabled) return\n\n if (controlledCurrent === undefined) {\n setInternalCurrent(page)\n }\n onChange?.(page, pageSize)\n }\n\n const handlePageSizeChange = (newSize: number) => {\n const newTotalPages = Math.ceil(total / newSize)\n const newCurrent = current > newTotalPages ? newTotalPages : current\n\n if (controlledPageSize === undefined) {\n setInternalPageSize(newSize)\n }\n if (controlledCurrent === undefined && newCurrent !== current) {\n setInternalCurrent(newCurrent)\n }\n\n onShowSizeChange?.(newCurrent, newSize)\n onChange?.(newCurrent, newSize)\n }\n\n const handleJumpPage = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n const page = parseInt(jumpPage)\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n handlePageChange(page)\n setJumpPage('')\n }\n }\n }\n\n const getPageNumbers = (): (number | 'ellipsis')[] => {\n const pages: (number | 'ellipsis')[] = []\n const showPages = 7\n\n if (totalPages <= showPages) {\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n if (current <= 3) {\n for (let i = 1; i <= 5; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n } else if (current >= totalPages - 2) {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = totalPages - 4; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n pages.push(1)\n pages.push('ellipsis')\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i)\n }\n pages.push('ellipsis')\n pages.push(totalPages)\n }\n }\n\n return pages\n }\n\n const sizeClass = {\n xs: dBtnXs,\n sm: dBtnSm,\n md: '',\n lg: dBtnLg,\n xl: dBtnXl,\n }[effectiveSize]\n\n const range: [number, number] = [\n (current - 1) * pageSize + 1,\n Math.min(current * pageSize, total),\n ]\n\n if (simple) {\n return (\n <div ref={ref} className={`flex items-center gap-2 ${className}`} data-testid={testId} {...rest}>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n data-testid={getTestId('prev')}\n aria-label={l.prev ?? 'Previous'}\n >\n ‹\n </button>\n <span className=\"text-sm\">\n {current} / {totalPages}\n </span>\n <button\n className={`${dBtn} ${dBtnGhost} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n data-testid={getTestId('next')}\n aria-label={l.next ?? 'Next'}\n >\n ›\n </button>\n </div>\n )\n }\n\n return (\n <div ref={ref} className={`flex flex-wrap items-center gap-4 ${className}`} data-testid={testId} {...rest}>\n {/* Total */}\n {showTotal && (\n <div className=\"text-sm text-base-content/70\" data-testid={getTestId('total')}>\n {typeof showTotal === 'function'\n ? showTotal(total, range)\n : `Total ${total} ${l.items ?? 'items'}`}\n </div>\n )}\n\n {/* Page Size Changer */}\n {showSizeChanger && (\n <select\n className={`${dSelect} ${dSelectBordered} ${sizeClass}`}\n value={pageSize}\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\n disabled={disabled}\n data-testid={getTestId('size-changer')}\n >\n {pageSizeOptions.map((sz) => (\n <option key={sz} value={sz}>\n {sz} {itemsPerPageText}\n </option>\n ))}\n </select>\n )}\n\n {/* Pagination Controls */}\n <div className={dJoin} data-testid={getTestId('controls')}>\n {/* First */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(1)}\n disabled={disabled || current === 1}\n aria-label=\"First page\"\n data-testid={getTestId('first')}\n >\n «\n </button>\n\n {/* Previous */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current - 1)}\n disabled={disabled || current === 1}\n aria-label={l.prev ?? 'Previous'}\n data-testid={getTestId('prev')}\n >\n ‹\n </button>\n\n {/* Page Numbers */}\n {getPageNumbers().map((page, index) => {\n if (page === 'ellipsis') {\n return (\n <button key={`ellipsis-${index}`} className={`${dJoinItem} ${dBtn} ${dBtnDisabled} ${sizeClass}`}>\n ...\n </button>\n )\n }\n\n return (\n <button\n key={page}\n className={`${dJoinItem} ${dBtn} ${sizeClass} ${current === page ? dBtnActive : ''}`}\n onClick={() => handlePageChange(page)}\n disabled={disabled}\n data-testid={getTestId(`page-${page}`)}\n aria-current={current === page ? 'page' : undefined}\n >\n {page}\n </button>\n )\n })}\n\n {/* Next */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(current + 1)}\n disabled={disabled || current === totalPages}\n aria-label={l.next ?? 'Next'}\n data-testid={getTestId('next')}\n >\n ›\n </button>\n\n {/* Last */}\n <button\n className={`${dJoinItem} ${dBtn} ${sizeClass}`}\n onClick={() => handlePageChange(totalPages)}\n disabled={disabled || current === totalPages}\n aria-label=\"Last page\"\n data-testid={getTestId('last')}\n >\n »\n </button>\n </div>\n\n {/* Quick Jumper */}\n {showQuickJumper && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{goToText}</span>\n <input\n type=\"number\"\n className={`${dInput} w-16 ${sizeClass}`}\n min={1}\n max={totalPages}\n value={jumpPage}\n onChange={(e) => setJumpPage(e.target.value)}\n onKeyDown={handleJumpPage}\n disabled={disabled}\n placeholder={String(current)}\n data-testid={getTestId('jumper')}\n />\n </div>\n )}\n </div>\n )\n})\n"],"names":["dBtn","dBtnGhost","dBtnActive","dBtnDisabled","dBtnXs","dBtnSm","dBtnLg","dBtnXl","dSelect","dSelectBordered","dJoin","dJoinItem","dInput","Pagination","forwardRef","controlledCurrent","defaultCurrent","total","controlledPageSize","defaultPageSize","pageSizeOptions","onChange","onShowSizeChange","showSizeChanger","showQuickJumper","showTotal","simple","size","disabled","testId","className","rest","ref","componentSize","locale","useConfig","effectiveSize","getTestId","suffix","l","itemsPerPageText","goToText","internalCurrent","setInternalCurrent","React","internalPageSize","setInternalPageSize","jumpPage","setJumpPage","current","pageSize","totalPages","handlePageChange","page","handlePageSizeChange","newSize","newTotalPages","newCurrent","handleJumpPage","getPageNumbers","pages","i","sizeClass","range","jsxs","jsx","sz","index"],"mappings":";;;AAIA,MAAMA,IAAO,OACPC,IAAY,aACZC,IAAa,cACbC,IAAe,gBACfC,IAAS,UACTC,KAAS,UACTC,KAAS,UACTC,KAAS,UACTC,KAAU,UACVC,KAAkB,mBAClBC,KAAQ,QACRC,IAAY,aACZC,KAAS,SAqBFC,KAAaC,EAA4C,SACpE;AAAA,EACE,SAASC;AAAA,EACT,gBAAAC,IAAiB;AAAA,EACjB,OAAAC;AAAA,EACA,UAAUC;AAAA,EACV,iBAAAC,IAAkB;AAAA,EAClB,iBAAAC,IAAkB,CAAC,IAAI,IAAI,IAAI,GAAG;AAAA,EAClC,UAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,iBAAAC,IAAkB;AAAA,EAClB,WAAAC,IAAY;AAAA,EACZ,QAAAC,IAAS;AAAA,EACT,MAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,eAAeC;AAAA,EACf,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,GACAC,GACA;AACA,QAAM,EAAE,eAAAC,GAAe,QAAAC,EAAA,IAAWC,EAAA,GAC5BC,IAAgBT,KAAQM,KAAiB,MAGzCI,IAAY,CAACC,MAAoBT,IAAS,GAAGA,CAAM,IAAIS,CAAM,KAAK,QAGlEC,IAAIL,EAAO,cAAc,CAAA,GACzBM,IAAmBD,EAAE,gBAAgB,UACrCE,IAAWF,EAAE,QAAQ,SACrB,CAACG,GAAiBC,CAAkB,IAAIC,EAAM,SAAS5B,CAAc,GACrE,CAAC6B,GAAkBC,CAAmB,IAAIF,EAAM,SAASzB,CAAe,GACxE,CAAC4B,GAAUC,CAAW,IAAIJ,EAAM,SAAS,EAAE,GAE3CK,IAAUlC,MAAsB,SAAYA,IAAoB2B,GAChEQ,IAAWhC,MAAuB,SAAYA,IAAqB2B,GACnEM,IAAa,KAAK,KAAKlC,IAAQiC,CAAQ,GAEvCE,IAAmB,CAACC,MAAiB;AACzC,IAAIA,IAAO,KAAKA,IAAOF,KAAcvB,MAEjCb,MAAsB,UACxB4B,EAAmBU,CAAI,GAEzBhC,IAAWgC,GAAMH,CAAQ;AAAA,EAC3B,GAEMI,IAAuB,CAACC,MAAoB;AAChD,UAAMC,IAAgB,KAAK,KAAKvC,IAAQsC,CAAO,GACzCE,IAAaR,IAAUO,IAAgBA,IAAgBP;AAE7D,IAAI/B,MAAuB,UACzB4B,EAAoBS,CAAO,GAEzBxC,MAAsB,UAAa0C,MAAeR,KACpDN,EAAmBc,CAAU,GAG/BnC,IAAmBmC,GAAYF,CAAO,GACtClC,IAAWoC,GAAYF,CAAO;AAAA,EAChC,GAEMG,IAAiB,CAAC,MAA6C;AACnE,QAAI,EAAE,QAAQ,SAAS;AACrB,YAAML,IAAO,SAASN,CAAQ;AAC9B,MAAI,CAAC,MAAMM,CAAI,KAAKA,KAAQ,KAAKA,KAAQF,MACvCC,EAAiBC,CAAI,GACrBL,EAAY,EAAE;AAAA,IAElB;AAAA,EACF,GAEMW,IAAiB,MAA+B;AACpD,UAAMC,IAAiC,CAAA;AAGvC,QAAIT,KAAc;AAChB,eAASU,IAAI,GAAGA,KAAKV,GAAYU;AAC/B,QAAAD,EAAM,KAAKC,CAAC;AAAA,aAGVZ,KAAW,GAAG;AAChB,eAASY,IAAI,GAAGA,KAAK,GAAGA;AACtB,QAAAD,EAAM,KAAKC,CAAC;AAEd,MAAAD,EAAM,KAAK,UAAU,GACrBA,EAAM,KAAKT,CAAU;AAAA,IACvB,WAAWF,KAAWE,IAAa,GAAG;AACpC,MAAAS,EAAM,KAAK,CAAC,GACZA,EAAM,KAAK,UAAU;AACrB,eAASC,IAAIV,IAAa,GAAGU,KAAKV,GAAYU;AAC5C,QAAAD,EAAM,KAAKC,CAAC;AAAA,IAEhB,OAAO;AACL,MAAAD,EAAM,KAAK,CAAC,GACZA,EAAM,KAAK,UAAU;AACrB,eAASC,IAAIZ,IAAU,GAAGY,KAAKZ,IAAU,GAAGY;AAC1C,QAAAD,EAAM,KAAKC,CAAC;AAEd,MAAAD,EAAM,KAAK,UAAU,GACrBA,EAAM,KAAKT,CAAU;AAAA,IACvB;AAGF,WAAOS;AAAA,EACT,GAEME,IAAY;AAAA,IAChB,IAAI1D;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAI;AAAA,IACJ,IAAIC;AAAA,IACJ,IAAIC;AAAA,EAAA,EACJ6B,CAAa,GAET2B,IAA0B;AAAA,KAC7Bd,IAAU,KAAKC,IAAW;AAAA,IAC3B,KAAK,IAAID,IAAUC,GAAUjC,CAAK;AAAA,EAAA;AAGpC,SAAIS,IAEA,gBAAAsC,EAAC,OAAA,EAAI,KAAAhC,GAAU,WAAW,2BAA2BF,CAAS,IAAI,eAAaD,GAAS,GAAGE,GACzF,UAAA;AAAA,IAAA,gBAAAkC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAGjE,CAAI,IAAIC,CAAS,IAAI6D,CAAS;AAAA,QAC5C,SAAS,MAAMV,EAAiBH,IAAU,CAAC;AAAA,QAC3C,UAAUrB,KAAYqB,MAAY;AAAA,QAClC,eAAaZ,EAAU,MAAM;AAAA,QAC7B,cAAYE,EAAE,QAAQ;AAAA,QACvB,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGD,gBAAAyB,EAAC,QAAA,EAAK,WAAU,WACb,UAAA;AAAA,MAAAf;AAAA,MAAQ;AAAA,MAAIE;AAAA,IAAA,GACf;AAAA,IACA,gBAAAc;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAGjE,CAAI,IAAIC,CAAS,IAAI6D,CAAS;AAAA,QAC5C,SAAS,MAAMV,EAAiBH,IAAU,CAAC;AAAA,QAC3C,UAAUrB,KAAYqB,MAAYE;AAAA,QAClC,eAAad,EAAU,MAAM;AAAA,QAC7B,cAAYE,EAAE,QAAQ;AAAA,QACvB,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GACF,IAKF,gBAAAyB,EAAC,OAAA,EAAI,KAAAhC,GAAU,WAAW,qCAAqCF,CAAS,IAAI,eAAaD,GAAS,GAAGE,GAElG,UAAA;AAAA,IAAAN,KACC,gBAAAwC,EAAC,SAAI,WAAU,gCAA+B,eAAa5B,EAAU,OAAO,GACzE,UAAA,OAAOZ,KAAc,aAClBA,EAAUR,GAAO8C,CAAK,IACtB,SAAS9C,CAAK,IAAIsB,EAAE,SAAS,OAAO,GAAA,CAC1C;AAAA,IAIDhB,KACC,gBAAA0C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAGzD,EAAO,IAAIC,EAAe,IAAIqD,CAAS;AAAA,QACrD,OAAOZ;AAAA,QACP,UAAU,CAAC,MAAMI,EAAqB,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,QAC5D,UAAA1B;AAAA,QACA,eAAaS,EAAU,cAAc;AAAA,QAEpC,YAAgB,IAAI,CAAC6B,MACpB,gBAAAF,EAAC,UAAA,EAAgB,OAAOE,GACrB,UAAA;AAAA,UAAAA;AAAA,UAAG;AAAA,UAAE1B;AAAA,QAAA,EAAA,GADK0B,CAEb,CACD;AAAA,MAAA;AAAA,IAAA;AAAA,sBAKJ,OAAA,EAAI,WAAWxD,IAAO,eAAa2B,EAAU,UAAU,GAEtD,UAAA;AAAA,MAAA,gBAAA4B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,GAAGtD,CAAS,IAAIX,CAAI,IAAI8D,CAAS;AAAA,UAC5C,SAAS,MAAMV,EAAiB,CAAC;AAAA,UACjC,UAAUxB,KAAYqB,MAAY;AAAA,UAClC,cAAW;AAAA,UACX,eAAaZ,EAAU,OAAO;AAAA,UAC/B,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAKD,gBAAA4B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,GAAGtD,CAAS,IAAIX,CAAI,IAAI8D,CAAS;AAAA,UAC5C,SAAS,MAAMV,EAAiBH,IAAU,CAAC;AAAA,UAC3C,UAAUrB,KAAYqB,MAAY;AAAA,UAClC,cAAYV,EAAE,QAAQ;AAAA,UACtB,eAAaF,EAAU,MAAM;AAAA,UAC9B,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAKAsB,IAAiB,IAAI,CAACN,GAAMc,MACvBd,MAAS,aAET,gBAAAY,EAAC,UAAA,EAAiC,WAAW,GAAGtD,CAAS,IAAIX,CAAI,IAAIG,CAAY,IAAI2D,CAAS,IAAI,UAAA,MAAA,GAArF,YAAYK,CAAK,EAE9B,IAKF,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW,GAAGtD,CAAS,IAAIX,CAAI,IAAI8D,CAAS,IAAIb,MAAYI,IAAOnD,IAAa,EAAE;AAAA,UAClF,SAAS,MAAMkD,EAAiBC,CAAI;AAAA,UACpC,UAAAzB;AAAA,UACA,eAAaS,EAAU,QAAQgB,CAAI,EAAE;AAAA,UACrC,gBAAcJ,MAAYI,IAAO,SAAS;AAAA,UAEzC,UAAAA;AAAA,QAAA;AAAA,QAPIA;AAAA,MAAA,CAUV;AAAA,MAGD,gBAAAY;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,GAAGtD,CAAS,IAAIX,CAAI,IAAI8D,CAAS;AAAA,UAC5C,SAAS,MAAMV,EAAiBH,IAAU,CAAC;AAAA,UAC3C,UAAUrB,KAAYqB,MAAYE;AAAA,UAClC,cAAYZ,EAAE,QAAQ;AAAA,UACtB,eAAaF,EAAU,MAAM;AAAA,UAC9B,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAKD,gBAAA4B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,GAAGtD,CAAS,IAAIX,CAAI,IAAI8D,CAAS;AAAA,UAC5C,SAAS,MAAMV,EAAiBD,CAAU;AAAA,UAC1C,UAAUvB,KAAYqB,MAAYE;AAAA,UAClC,cAAW;AAAA,UACX,eAAad,EAAU,MAAM;AAAA,UAC9B,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAED,GACF;AAAA,IAGCb,KACC,gBAAAwC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,WAAW,UAAAxB,GAAS;AAAA,MACpC,gBAAAwB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,GAAGrD,EAAM,SAASkD,CAAS;AAAA,UACtC,KAAK;AAAA,UACL,KAAKX;AAAA,UACL,OAAOJ;AAAA,UACP,UAAU,CAAC,MAAMC,EAAY,EAAE,OAAO,KAAK;AAAA,UAC3C,WAAWU;AAAA,UACX,UAAA9B;AAAA,UACA,aAAa,OAAOqB,CAAO;AAAA,UAC3B,eAAaZ,EAAU,QAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IACjC,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ,CAAC;"}
@@ -13,5 +13,7 @@ export interface PopconfirmProps extends Omit<React.HTMLAttributes<HTMLDivElemen
13
13
  disabled?: boolean;
14
14
  icon?: React.ReactNode;
15
15
  showCancel?: boolean;
16
+ /** Test ID prefix for child elements */
17
+ 'data-testid'?: string;
16
18
  }
17
- export declare const Popconfirm: React.FC<PopconfirmProps>;
19
+ export declare const Popconfirm: React.ForwardRefExoticComponent<PopconfirmProps & React.RefAttributes<HTMLDivElement>>;