@andreagiugni/tailwind-dashboard-ui 1.0.26 → 1.0.28

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/README.md CHANGED
@@ -185,7 +185,7 @@ Legend: **(+native)** = also extends the element's native HTML attributes.
185
185
  | `PollResults` | `options` (`{ label, value?, series? }[]`), `maxValue?`, `size` (sm/md/lg), `color`, `trackColor?`, `showValueLabel?`, `showSeriesLabels?`, `valueFormatter?`, `labelTextSize?`/`labelTextColor?`/`labelTextWeight?`, `valueTextSize?`/`valueTextColor?`/`valueTextWeight?`, `seriesLabelTextSize?`/`seriesLabelTextColor?`/`seriesLabelTextWeight?`, `seriesValueTextSize?`/`seriesValueTextColor?`/`seriesValueTextWeight?`, (+native div) (+override) |
186
186
  | `Spinner` | `size` (sm/md/lg), `color`, `label?` |
187
187
  | `Skeleton` | `isLoaded`, `width?`, `height?`, `className`, `children?` |
188
- | `Toast` | `variant` (success/danger/warning/info), `title`, `message?`, `icon?`, `hideIcon?`, `showCloseButton?`, `onClose?`, `hideAccentBar?`, (+native div) (+override) |
188
+ | `Toast` | `variant` (success/danger/warning/info), `position?` (left/center/right), `duration?` (ms), `title`, `message?`, `icon?`, `hideIcon?`, `showCloseButton?`, `onClose?`, `hideAccentBar?`, (+native div) (+override) |
189
189
 
190
190
  ### Overlays
191
191
 
package/dist/index.cjs CHANGED
@@ -10,14 +10,14 @@ var chunkTF3G3E72_cjs = require('./chunk-TF3G3E72.cjs');
10
10
  var chunkYERNSNT4_cjs = require('./chunk-YERNSNT4.cjs');
11
11
  var jsxRuntime = require('react/jsx-runtime');
12
12
  var lucideReact = require('lucide-react');
13
- var React5 = require('react');
13
+ var React6 = require('react');
14
14
  var reactDom = require('react-dom');
15
15
  var flatpickr = require('flatpickr');
16
16
  require('flatpickr/dist/flatpickr.css');
17
17
 
18
18
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
19
19
 
20
- var React5__default = /*#__PURE__*/_interopDefault(React5);
20
+ var React6__default = /*#__PURE__*/_interopDefault(React6);
21
21
  var flatpickr__default = /*#__PURE__*/_interopDefault(flatpickr);
22
22
 
23
23
  // src/lib/styleOverride.ts
@@ -360,10 +360,10 @@ var Dropdown = ({
360
360
  style,
361
361
  ...rest
362
362
  }) => {
363
- const dropdownRef = React5.useRef(null);
364
- const anchorRef = React5.useRef(null);
365
- const [position, setPosition] = React5.useState();
366
- React5.useEffect(() => {
363
+ const dropdownRef = React6.useRef(null);
364
+ const anchorRef = React6.useRef(null);
365
+ const [position, setPosition] = React6.useState();
366
+ React6.useEffect(() => {
367
367
  const handleClickOutside = (event) => {
368
368
  const trigger = getTriggerElement(anchorRef.current, triggerRef);
369
369
  if (dropdownRef.current && !dropdownRef.current.contains(event.target) && !trigger?.contains(event.target)) {
@@ -375,7 +375,7 @@ var Dropdown = ({
375
375
  document.removeEventListener("mousedown", handleClickOutside);
376
376
  };
377
377
  }, [onClose, triggerRef]);
378
- React5.useLayoutEffect(() => {
378
+ React6.useLayoutEffect(() => {
379
379
  if (!isOpen || !portal) return;
380
380
  const updatePosition = () => {
381
381
  const anchor = anchorRef.current;
@@ -481,8 +481,8 @@ var Dropzone = ({
481
481
  browseLabel = "Browse File",
482
482
  className
483
483
  }) => {
484
- const inputRef = React5.useRef(null);
485
- const [isDragActive, setIsDragActive] = React5.useState(false);
484
+ const inputRef = React6.useRef(null);
485
+ const [isDragActive, setIsDragActive] = React6.useState(false);
486
486
  const handleFiles = (list) => {
487
487
  if (list && list.length) onDrop?.(Array.from(list));
488
488
  };
@@ -721,13 +721,13 @@ function DataDrivenTable({
721
721
  emptyContent = "No matching records",
722
722
  className
723
723
  }) {
724
- const [search, setSearch] = React5.useState("");
725
- const [pageSize, setPageSize] = React5.useState(rowsPerPage);
726
- const [sortKey, setSortKey] = React5.useState(defaultSortKey);
727
- const [sortDir, setSortDir] = React5.useState(defaultSortDirection);
728
- const [page, setPage] = React5.useState(1);
724
+ const [search, setSearch] = React6.useState("");
725
+ const [pageSize, setPageSize] = React6.useState(rowsPerPage);
726
+ const [sortKey, setSortKey] = React6.useState(defaultSortKey);
727
+ const [sortDir, setSortDir] = React6.useState(defaultSortDirection);
728
+ const [page, setPage] = React6.useState(1);
729
729
  const showSearch = !!(searchKeys && searchKeys.length > 0);
730
- const filtered = React5.useMemo(() => {
730
+ const filtered = React6.useMemo(() => {
731
731
  const q = search.trim().toLowerCase();
732
732
  let rows = data;
733
733
  if (showSearch && q) {
@@ -1000,7 +1000,7 @@ var ThemeToggleButton = ({
1000
1000
  onClick,
1001
1001
  ...rest
1002
1002
  }) => {
1003
- const [internalTheme, setInternalTheme] = React5.useState("light");
1003
+ const [internalTheme, setInternalTheme] = React6.useState("light");
1004
1004
  const isControlled = theme !== void 0;
1005
1005
  const currentTheme = isControlled ? theme : internalTheme;
1006
1006
  const handleClick = (e) => {
@@ -1102,6 +1102,11 @@ var variantIcons2 = {
1102
1102
  warning: lucideReact.CircleAlert,
1103
1103
  info: lucideReact.Info
1104
1104
  };
1105
+ var positionStyles = {
1106
+ left: "bottom-6 left-4 right-4 sm:left-6 sm:right-auto sm:w-full",
1107
+ center: "bottom-6 left-1/2 w-[calc(100%-2rem)] -translate-x-1/2 sm:w-full",
1108
+ right: "bottom-6 left-4 right-4 sm:left-auto sm:right-6 sm:w-full"
1109
+ };
1105
1110
  var Toast = ({
1106
1111
  variant = "success",
1107
1112
  title,
@@ -1111,6 +1116,8 @@ var Toast = ({
1111
1116
  showCloseButton = true,
1112
1117
  onClose,
1113
1118
  hideAccentBar = false,
1119
+ position = "right",
1120
+ duration,
1114
1121
  className,
1115
1122
  bgColor,
1116
1123
  textColor,
@@ -1120,12 +1127,24 @@ var Toast = ({
1120
1127
  }) => {
1121
1128
  const styles = variantStyles[variant];
1122
1129
  const Icon = variantIcons2[variant];
1130
+ const [isVisible, setIsVisible] = React6.useState(true);
1131
+ const handleClose = React6.useCallback(() => {
1132
+ setIsVisible(false);
1133
+ onClose?.();
1134
+ }, [onClose]);
1135
+ React6.useEffect(() => {
1136
+ if (!duration || duration <= 0) return;
1137
+ const timer = window.setTimeout(handleClose, duration);
1138
+ return () => window.clearTimeout(timer);
1139
+ }, [duration, handleClose]);
1140
+ if (!isVisible) return null;
1123
1141
  return /* @__PURE__ */ jsxRuntime.jsxs(
1124
1142
  "div",
1125
1143
  {
1126
1144
  role: "alert",
1127
1145
  className: chunkYERNSNT4_cjs.cn(
1128
- "relative flex items-center gap-3 overflow-hidden rounded-xl border border-gray-200 bg-white px-4 py-3.5 pr-10 shadow-theme-sm dark:border-gray-800 dark:bg-white/[0.03]",
1146
+ "fixed z-9999 flex max-w-md items-center gap-3 overflow-hidden rounded-xl border border-gray-200 bg-white px-4 py-3.5 pr-10 shadow-theme-sm dark:border-gray-800 dark:bg-gray-900",
1147
+ positionStyles[position],
1129
1148
  className
1130
1149
  ),
1131
1150
  style: { ...styleOverride({ bgColor, textColor, borderColor }), ...style },
@@ -1150,7 +1169,7 @@ var Toast = ({
1150
1169
  {
1151
1170
  type: "button",
1152
1171
  "aria-label": "Close",
1153
- onClick: onClose,
1172
+ onClick: handleClose,
1154
1173
  className: "absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 transition hover:text-gray-700 dark:hover:text-gray-200",
1155
1174
  children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "size-4", "aria-hidden": "true" })
1156
1175
  }
@@ -1166,7 +1185,7 @@ var Toast = ({
1166
1185
  }
1167
1186
  );
1168
1187
  };
1169
- var AccordionContext = React5__default.default.createContext(null);
1188
+ var AccordionContext = React6__default.default.createContext(null);
1170
1189
  var ChevronIcon2 = ({ open }) => /* @__PURE__ */ jsxRuntime.jsx(
1171
1190
  lucideReact.ChevronDown,
1172
1191
  {
@@ -1186,7 +1205,7 @@ var AccordionItem = ({
1186
1205
  className,
1187
1206
  ...rest
1188
1207
  }) => {
1189
- const ctx = React5__default.default.useContext(AccordionContext);
1208
+ const ctx = React6__default.default.useContext(AccordionContext);
1190
1209
  if (!ctx) {
1191
1210
  throw new Error("AccordionItem must be used within an Accordion");
1192
1211
  }
@@ -1251,9 +1270,9 @@ var Accordion = ({
1251
1270
  ...rest
1252
1271
  }) => {
1253
1272
  const isControlled = expandedKeys !== void 0;
1254
- const [internal, setInternal] = React5.useState(defaultExpandedKeys);
1273
+ const [internal, setInternal] = React6.useState(defaultExpandedKeys);
1255
1274
  const expanded = isControlled ? expandedKeys : internal;
1256
- const toggle = React5.useCallback(
1275
+ const toggle = React6.useCallback(
1257
1276
  (key) => {
1258
1277
  const isOpen = expanded.includes(key);
1259
1278
  let next;
@@ -1298,16 +1317,16 @@ var Tabs = ({
1298
1317
  className,
1299
1318
  ...rest
1300
1319
  }) => {
1301
- const tabs = React5__default.default.Children.toArray(children).filter(
1302
- React5__default.default.isValidElement
1320
+ const tabs = React6__default.default.Children.toArray(children).filter(
1321
+ React6__default.default.isValidElement
1303
1322
  );
1304
1323
  const firstKey = tabs[0]?.props.tabKey;
1305
1324
  const isControlled = selectedKey !== void 0;
1306
- const [internal, setInternal] = React5.useState(
1325
+ const [internal, setInternal] = React6.useState(
1307
1326
  defaultSelectedKey ?? firstKey
1308
1327
  );
1309
1328
  const active = isControlled ? selectedKey : internal;
1310
- const tabRefs = React5.useRef({});
1329
+ const tabRefs = React6.useRef({});
1311
1330
  const select = (key) => {
1312
1331
  if (!isControlled) setInternal(key);
1313
1332
  onSelectionChange?.(key);
@@ -1425,9 +1444,9 @@ var Tooltip = ({
1425
1444
  style,
1426
1445
  ...rest
1427
1446
  }) => {
1428
- const [visible, setVisible] = React5.useState(false);
1429
- const tooltipId = React5.useId();
1430
- const timeoutRef = React5.useRef(null);
1447
+ const [visible, setVisible] = React6.useState(false);
1448
+ const tooltipId = React6.useId();
1449
+ const timeoutRef = React6.useRef(null);
1431
1450
  const show = () => {
1432
1451
  if (disabled) return;
1433
1452
  if (delay > 0) {
@@ -1502,17 +1521,17 @@ var Popover = ({
1502
1521
  className,
1503
1522
  ...rest
1504
1523
  }) => {
1505
- const [uncontrolledOpen, setUncontrolledOpen] = React5.useState(defaultOpen);
1506
- const [panelPosition, setPanelPosition] = React5.useState();
1524
+ const [uncontrolledOpen, setUncontrolledOpen] = React6.useState(defaultOpen);
1525
+ const [panelPosition, setPanelPosition] = React6.useState();
1507
1526
  const isControlled = controlledOpen !== void 0;
1508
1527
  const open = isControlled ? controlledOpen : uncontrolledOpen;
1509
- const wrapperRef = React5.useRef(null);
1510
- const panelRef = React5.useRef(null);
1528
+ const wrapperRef = React6.useRef(null);
1529
+ const panelRef = React6.useRef(null);
1511
1530
  const setOpen = (next) => {
1512
1531
  if (!isControlled) setUncontrolledOpen(next);
1513
1532
  onOpenChange?.(next);
1514
1533
  };
1515
- React5.useEffect(() => {
1534
+ React6.useEffect(() => {
1516
1535
  if (!open) return;
1517
1536
  const handleClickOutside = (event) => {
1518
1537
  if (closeOnOutsideClick && wrapperRef.current && !wrapperRef.current.contains(event.target) && !panelRef.current?.contains(event.target)) {
@@ -1531,7 +1550,7 @@ var Popover = ({
1531
1550
  document.removeEventListener("keydown", handleEscape);
1532
1551
  };
1533
1552
  }, [open, closeOnOutsideClick, closeOnEsc]);
1534
- const updatePanelPosition = React5.useCallback(() => {
1553
+ const updatePanelPosition = React6.useCallback(() => {
1535
1554
  const trigger2 = wrapperRef.current;
1536
1555
  const panel2 = panelRef.current;
1537
1556
  if (!trigger2 || !panel2) return;
@@ -1579,7 +1598,7 @@ var Popover = ({
1579
1598
  )
1580
1599
  });
1581
1600
  }, [placement]);
1582
- React5.useLayoutEffect(() => {
1601
+ React6.useLayoutEffect(() => {
1583
1602
  if (!open || !portal) return;
1584
1603
  updatePanelPosition();
1585
1604
  window.addEventListener("resize", updatePanelPosition);
@@ -1657,7 +1676,7 @@ var Drawer = ({
1657
1676
  size,
1658
1677
  ...rest
1659
1678
  }) => {
1660
- React5.useEffect(() => {
1679
+ React6.useEffect(() => {
1661
1680
  const handleEscape = (event) => {
1662
1681
  if (event.key === "Escape") {
1663
1682
  onClose();
@@ -1670,7 +1689,7 @@ var Drawer = ({
1670
1689
  document.removeEventListener("keydown", handleEscape);
1671
1690
  };
1672
1691
  }, [isOpen, onClose, closeOnEsc]);
1673
- React5.useEffect(() => {
1692
+ React6.useEffect(() => {
1674
1693
  if (isOpen) {
1675
1694
  document.body.style.overflow = "hidden";
1676
1695
  } else {
@@ -1879,9 +1898,9 @@ var Progress = ({
1879
1898
  ] });
1880
1899
  };
1881
1900
  var trackSizes = {
1882
- sm: "h-2",
1883
- md: "h-2.5",
1884
- lg: "h-3.5"
1901
+ sm: "h-2.5",
1902
+ md: "h-3",
1903
+ lg: "h-4"
1885
1904
  };
1886
1905
  var colorStyles = {
1887
1906
  primary: "bg-brand-500",
@@ -1975,7 +1994,7 @@ var PollResults = ({
1975
1994
  return /* @__PURE__ */ jsxRuntime.jsx(
1976
1995
  "div",
1977
1996
  {
1978
- className: chunkYERNSNT4_cjs.cn("w-full space-y-7 text-gray-800 dark:text-white/90", className),
1997
+ className: chunkYERNSNT4_cjs.cn("w-full space-y-5 text-gray-800 dark:text-white/90", className),
1979
1998
  style: { ...styleOverride({ bgColor, textColor, borderColor }), ...style },
1980
1999
  ...rest,
1981
2000
  children: options.map((option, optionIndex) => {
@@ -1991,7 +2010,7 @@ var PollResults = ({
1991
2010
  const isGrouped = series.length > 1;
1992
2011
  const singlePercent = toPercent(series[0]?.value ?? 0, safeMax);
1993
2012
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1994
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3 flex items-center justify-between gap-4", children: [
2013
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-2 flex items-center justify-between gap-4", children: [
1995
2014
  /* @__PURE__ */ jsxRuntime.jsx(
1996
2015
  "span",
1997
2016
  {
@@ -2009,7 +2028,7 @@ var PollResults = ({
2009
2028
  }
2010
2029
  )
2011
2030
  ] }),
2012
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkYERNSNT4_cjs.cn("flex flex-col", isGrouped ? "gap-3" : "gap-0"), children: series.map((entry, seriesIndex) => {
2031
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkYERNSNT4_cjs.cn("flex flex-col", isGrouped ? "gap-2.5" : "gap-0"), children: series.map((entry, seriesIndex) => {
2013
2032
  const percent = toPercent(entry.value, safeMax);
2014
2033
  const fillColor = entry.fillColor;
2015
2034
  const entryColor = entry.color ?? (isGrouped ? defaultSeriesColorCycle[seriesIndex % defaultSeriesColorCycle.length] : option.color ?? defaultColorCycle[optionIndex % defaultColorCycle.length]) ?? color;
@@ -2203,7 +2222,7 @@ var Snippet = ({
2203
2222
  style,
2204
2223
  ...rest
2205
2224
  }) => {
2206
- const [copied, setCopied] = React5.useState(false);
2225
+ const [copied, setCopied] = React6.useState(false);
2207
2226
  const raw = code ?? children ?? "";
2208
2227
  const lines = Array.isArray(raw) ? raw : raw.split("\n");
2209
2228
  const text = lines.join("\n");
@@ -2485,7 +2504,7 @@ var Switch = ({
2485
2504
  ...rest
2486
2505
  }) => {
2487
2506
  const isControlled = checked !== void 0;
2488
- const [internalChecked, setInternalChecked] = React5.useState(defaultChecked);
2507
+ const [internalChecked, setInternalChecked] = React6.useState(defaultChecked);
2489
2508
  const isChecked = isControlled ? checked : internalChecked;
2490
2509
  const handleToggle = () => {
2491
2510
  if (disabled) return;
@@ -2573,13 +2592,13 @@ var Select = ({
2573
2592
  disabled = false,
2574
2593
  portal = true
2575
2594
  }) => {
2576
- const [selectedValue, setSelectedValue] = React5.useState(defaultValue);
2577
- const [isOpen, setIsOpen] = React5.useState(false);
2578
- const rootRef = React5.useRef(null);
2579
- const triggerRef = React5.useRef(null);
2580
- const menuRef = React5.useRef(null);
2581
- const [menuPosition, setMenuPosition] = React5.useState();
2582
- React5.useEffect(() => {
2595
+ const [selectedValue, setSelectedValue] = React6.useState(defaultValue);
2596
+ const [isOpen, setIsOpen] = React6.useState(false);
2597
+ const rootRef = React6.useRef(null);
2598
+ const triggerRef = React6.useRef(null);
2599
+ const menuRef = React6.useRef(null);
2600
+ const [menuPosition, setMenuPosition] = React6.useState();
2601
+ React6.useEffect(() => {
2583
2602
  if (!isOpen) return;
2584
2603
  const onPointerDown = (e) => {
2585
2604
  const target = e.target;
@@ -2597,7 +2616,7 @@ var Select = ({
2597
2616
  document.removeEventListener("keydown", onKeyDown);
2598
2617
  };
2599
2618
  }, [isOpen]);
2600
- React5.useLayoutEffect(() => {
2619
+ React6.useLayoutEffect(() => {
2601
2620
  if (!isOpen || !portal) return;
2602
2621
  const updatePosition = () => {
2603
2622
  const trigger = triggerRef.current;
@@ -2738,13 +2757,13 @@ var MultiSelect = ({
2738
2757
  disabled = false,
2739
2758
  portal = true
2740
2759
  }) => {
2741
- const [selectedOptions, setSelectedOptions] = React5.useState(defaultSelected);
2742
- const [isOpen, setIsOpen] = React5.useState(false);
2743
- const rootRef = React5.useRef(null);
2744
- const triggerRef = React5.useRef(null);
2745
- const menuRef = React5.useRef(null);
2746
- const [menuPosition, setMenuPosition] = React5.useState();
2747
- React5.useEffect(() => {
2760
+ const [selectedOptions, setSelectedOptions] = React6.useState(defaultSelected);
2761
+ const [isOpen, setIsOpen] = React6.useState(false);
2762
+ const rootRef = React6.useRef(null);
2763
+ const triggerRef = React6.useRef(null);
2764
+ const menuRef = React6.useRef(null);
2765
+ const [menuPosition, setMenuPosition] = React6.useState();
2766
+ React6.useEffect(() => {
2748
2767
  if (!isOpen) return;
2749
2768
  const onPointerDown = (event) => {
2750
2769
  const target = event.target;
@@ -2762,7 +2781,7 @@ var MultiSelect = ({
2762
2781
  document.removeEventListener("keydown", onKeyDown);
2763
2782
  };
2764
2783
  }, [isOpen]);
2765
- React5.useLayoutEffect(() => {
2784
+ React6.useLayoutEffect(() => {
2766
2785
  if (!isOpen || !portal) return;
2767
2786
  const updatePosition = () => {
2768
2787
  const trigger = triggerRef.current;
@@ -2934,7 +2953,7 @@ var DatePicker = ({
2934
2953
  defaultDate,
2935
2954
  placeholder
2936
2955
  }) => {
2937
- React5.useEffect(() => {
2956
+ React6.useEffect(() => {
2938
2957
  const flatPickr = flatpickr__default.default(`#${id}`, {
2939
2958
  mode: mode || "single",
2940
2959
  appendTo: document.body,
@@ -2977,11 +2996,11 @@ var DateTimePicker = ({
2977
2996
  defaultTime = "",
2978
2997
  onChange
2979
2998
  }) => {
2980
- const dateRef = React5.useRef(void 0);
2981
- const [hh, setHh] = React5.useState(defaultTime.split(":")[0] ?? "");
2982
- const [mm, setMm] = React5.useState(defaultTime.split(":")[1] ?? "");
2983
- const hhRef = React5.useRef(hh);
2984
- const mmRef = React5.useRef(mm);
2999
+ const dateRef = React6.useRef(void 0);
3000
+ const [hh, setHh] = React6.useState(defaultTime.split(":")[0] ?? "");
3001
+ const [mm, setMm] = React6.useState(defaultTime.split(":")[1] ?? "");
3002
+ const hhRef = React6.useRef(hh);
3003
+ const mmRef = React6.useRef(mm);
2985
3004
  hhRef.current = hh;
2986
3005
  mmRef.current = mm;
2987
3006
  const emit = () => {
@@ -2990,7 +3009,7 @@ var DateTimePicker = ({
2990
3009
  time: `${(hhRef.current || "0").padStart(2, "0")}:${(mmRef.current || "0").padStart(2, "0")}`
2991
3010
  });
2992
3011
  };
2993
- React5.useEffect(() => {
3012
+ React6.useEffect(() => {
2994
3013
  const flatPickr = flatpickr__default.default(`#${id}-date`, {
2995
3014
  mode: "single",
2996
3015
  appendTo: document.body,
@@ -3075,7 +3094,7 @@ var PasswordInput = ({
3075
3094
  className,
3076
3095
  ...rest
3077
3096
  }) => {
3078
- const [show, setShow] = React5.useState(false);
3097
+ const [show, setShow] = React6.useState(false);
3079
3098
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
3080
3099
  /* @__PURE__ */ jsxRuntime.jsx(
3081
3100
  "input",
@@ -3154,7 +3173,7 @@ var Slider = ({
3154
3173
  ...rest
3155
3174
  }) => {
3156
3175
  const isControlled = value !== void 0;
3157
- const [internalValue, setInternalValue] = React5.useState(defaultValue);
3176
+ const [internalValue, setInternalValue] = React6.useState(defaultValue);
3158
3177
  const currentValue = isControlled ? value : internalValue;
3159
3178
  const handleChange = (e) => {
3160
3179
  const next = Number(e.target.value);