@sustaina/shared-ui 1.33.1 → 1.33.2

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/index.mjs CHANGED
@@ -2,8 +2,8 @@ import * as AccordionPrimitive from '@radix-ui/react-accordion';
2
2
  import clsx2, { clsx } from 'clsx';
3
3
  import { twMerge } from 'tailwind-merge';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
- import * as React4 from 'react';
6
- import React4__default, { forwardRef, useRef, useMemo, useCallback, useState, isValidElement, useEffect, useLayoutEffect, createElement } from 'react';
5
+ import * as React26 from 'react';
6
+ import React26__default, { forwardRef, useRef, useMemo, useCallback, useState, isValidElement, useEffect, useLayoutEffect, createElement } from 'react';
7
7
  import { CircleX, Undo, Redo, Bold, Italic, Underline, Strikethrough, Code, Pilcrow, Heading1, Heading2, Heading3, List as List$1, ListOrdered, Quote, CodeSquare, Link, Link2Off, Image as Image$1, AlignLeft, AlignCenter, AlignRight, CircleHelp, ChevronDown, X, Check, XIcon, SearchIcon, ChevronRight, CheckIcon, Triangle, CalendarIcon, Search, ChevronUp, PanelLeftIcon, Minimize2, Maximize2, Plus, ChevronLeft, CircleUserRound, MoreVertical, Bug, GripVertical, Info, CircleMinus, Minus } from 'lucide-react';
8
8
  import { createPortal } from 'react-dom';
9
9
  import * as SelectPrimitive from '@radix-ui/react-select';
@@ -1203,7 +1203,7 @@ var OPERATOR_LABEL = {
1203
1203
  containsAll: "Contains all of"
1204
1204
  };
1205
1205
  var OperatorSelect = ({ row, operators, onChangeOperator, error }) => {
1206
- React4__default.useEffect(() => {
1206
+ React26__default.useEffect(() => {
1207
1207
  if (!operators.length) return;
1208
1208
  if (!operators.includes(row.operator)) {
1209
1209
  onChangeOperator(operators[0]);
@@ -1239,15 +1239,15 @@ function Label2({ className, ...props }) {
1239
1239
  );
1240
1240
  }
1241
1241
  var Form = FormProvider;
1242
- var FormFieldContext = React4.createContext({});
1242
+ var FormFieldContext = React26.createContext({});
1243
1243
  var FormField = ({
1244
1244
  ...props
1245
1245
  }) => {
1246
1246
  return /* @__PURE__ */ jsx(FormFieldContext.Provider, { value: { name: props.name }, children: /* @__PURE__ */ jsx(Controller, { ...props }) });
1247
1247
  };
1248
1248
  var useFormField = () => {
1249
- const fieldContext = React4.useContext(FormFieldContext);
1250
- const itemContext = React4.useContext(FormItemContext);
1249
+ const fieldContext = React26.useContext(FormFieldContext);
1250
+ const itemContext = React26.useContext(FormItemContext);
1251
1251
  const { getFieldState } = useFormContext();
1252
1252
  const formState = useFormState({ name: fieldContext.name });
1253
1253
  const fieldState = getFieldState(fieldContext.name, formState);
@@ -1264,9 +1264,9 @@ var useFormField = () => {
1264
1264
  ...fieldState
1265
1265
  };
1266
1266
  };
1267
- var FormItemContext = React4.createContext({});
1267
+ var FormItemContext = React26.createContext({});
1268
1268
  function FormItem({ className, ...props }) {
1269
- const id = React4.useId();
1269
+ const id = React26.useId();
1270
1270
  return /* @__PURE__ */ jsx(FormItemContext.Provider, { value: { id }, children: /* @__PURE__ */ jsx("div", { "data-slot": "form-item", className: cn("grid gap-2", className), ...props }) });
1271
1271
  }
1272
1272
  function FormLabel({ className, ...props }) {
@@ -1370,7 +1370,7 @@ var Spinner = ({ className, variant, size = "default", ...props }) => /* @__PURE
1370
1370
  ]
1371
1371
  }
1372
1372
  );
1373
- var InputPrimitive = React4.forwardRef(
1373
+ var InputPrimitive = React26.forwardRef(
1374
1374
  ({ className, type = "text", ...props }, ref) => {
1375
1375
  return /* @__PURE__ */ jsx(
1376
1376
  "input",
@@ -1409,7 +1409,7 @@ var inputVariants = cva("", {
1409
1409
  appearance: "filled"
1410
1410
  }
1411
1411
  });
1412
- var Input = React4.forwardRef(
1412
+ var Input = React26.forwardRef(
1413
1413
  ({
1414
1414
  className,
1415
1415
  wrapperClassName,
@@ -1442,8 +1442,8 @@ var Input = React4.forwardRef(
1442
1442
  onChange: onChangeProp
1443
1443
  } = rest;
1444
1444
  const ariaInvalid = invalid ?? ariaInvalidProp;
1445
- const messageId = React4.useId();
1446
- const handleChange = React4.useCallback(
1445
+ const messageId = React26.useId();
1446
+ const handleChange = React26.useCallback(
1447
1447
  (event) => {
1448
1448
  onChangeProp?.(event);
1449
1449
  onValueChange?.(event.target.value);
@@ -1786,20 +1786,20 @@ function DatePicker({
1786
1786
  className,
1787
1787
  ...props
1788
1788
  }) {
1789
- const today = React4.useMemo(() => startOfDay(/* @__PURE__ */ new Date()), []);
1790
- const [displayed, setDisplayed] = React4.useState(
1789
+ const today = React26.useMemo(() => startOfDay(/* @__PURE__ */ new Date()), []);
1790
+ const [displayed, setDisplayed] = React26.useState(
1791
1791
  selectedDate ? new Date(selectedDate) : /* @__PURE__ */ new Date()
1792
1792
  );
1793
1793
  minDate = clampToDay(minDate);
1794
1794
  maxDate = clampToDay(maxDate);
1795
- const disabledSet = React4.useMemo(() => {
1795
+ const disabledSet = React26.useMemo(() => {
1796
1796
  const s = /* @__PURE__ */ new Set();
1797
1797
  disabledDates?.forEach((d) => s.add(startOfDay(d).toISOString()));
1798
1798
  return s;
1799
1799
  }, [disabledDates]);
1800
1800
  const displayYear = displayed.getFullYear();
1801
1801
  const displayMonth = displayed.getMonth();
1802
- const weekdays = React4.useMemo(() => {
1802
+ const weekdays = React26.useMemo(() => {
1803
1803
  const labels = [];
1804
1804
  for (let i = 0; i < 7; i++) {
1805
1805
  const idx = i;
@@ -1808,7 +1808,7 @@ function DatePicker({
1808
1808
  }
1809
1809
  return labels;
1810
1810
  }, [callbacks]);
1811
- const grid = React4.useMemo(() => buildCalendarGrid(displayed, true), [displayed]);
1811
+ const grid = React26.useMemo(() => buildCalendarGrid(displayed, true), [displayed]);
1812
1812
  const isDateDisabled = (date) => {
1813
1813
  const d = startOfDay(date);
1814
1814
  if (minDate && d < minDate) return true;
@@ -1818,7 +1818,7 @@ function DatePicker({
1818
1818
  };
1819
1819
  const minYear = minDate?.getFullYear();
1820
1820
  const maxYear = maxDate?.getFullYear();
1821
- const getMonthLabel = React4.useCallback(
1821
+ const getMonthLabel = React26.useCallback(
1822
1822
  (year, monthIndex) => {
1823
1823
  const label = callbacks?.monthLabel?.(year, monthIndex);
1824
1824
  if (label === null || label === void 0) {
@@ -1828,7 +1828,7 @@ function DatePicker({
1828
1828
  },
1829
1829
  [callbacks]
1830
1830
  );
1831
- const getYearLabel = React4.useCallback(
1831
+ const getYearLabel = React26.useCallback(
1832
1832
  (year) => {
1833
1833
  const label = callbacks?.yearLabel?.(year);
1834
1834
  if (label === null || label === void 0) return String(year);
@@ -1836,7 +1836,7 @@ function DatePicker({
1836
1836
  },
1837
1837
  [callbacks]
1838
1838
  );
1839
- const clampMonthToBounds = React4.useCallback(
1839
+ const clampMonthToBounds = React26.useCallback(
1840
1840
  (year, monthIndex) => {
1841
1841
  let output = monthIndex;
1842
1842
  if (typeof minYear === "number" && year === minYear && minDate) {
@@ -1851,7 +1851,7 @@ function DatePicker({
1851
1851
  },
1852
1852
  [maxDate, minDate, maxYear, minYear]
1853
1853
  );
1854
- const yearOptions = React4.useMemo(() => {
1854
+ const yearOptions = React26.useMemo(() => {
1855
1855
  const fallbackWindow = 50;
1856
1856
  const start = typeof minYear === "number" ? minYear : displayYear - fallbackWindow;
1857
1857
  const end = typeof maxYear === "number" ? maxYear : displayYear + fallbackWindow;
@@ -1872,7 +1872,7 @@ function DatePicker({
1872
1872
  }
1873
1873
  return years;
1874
1874
  }, [displayYear, maxYear, minYear, selectedDate]);
1875
- const monthOptions = React4.useMemo(() => {
1875
+ const monthOptions = React26.useMemo(() => {
1876
1876
  const months = Array.from({ length: 12 }, (_, monthIndex) => {
1877
1877
  const disabled = typeof minYear === "number" && displayYear === minYear && minDate && monthIndex < minDate.getMonth() || typeof maxYear === "number" && displayYear === maxYear && maxDate && monthIndex > maxDate.getMonth();
1878
1878
  return {
@@ -1891,7 +1891,7 @@ function DatePicker({
1891
1891
  }
1892
1892
  return months.sort((a, b) => a.value - b.value).filter((option, index, arr) => index === 0 || option.value !== arr[index - 1].value);
1893
1893
  }, [displayMonth, displayYear, getMonthLabel, maxDate, maxYear, minDate, minYear]);
1894
- const handleMonthSelect = React4.useCallback((nextValue) => {
1894
+ const handleMonthSelect = React26.useCallback((nextValue) => {
1895
1895
  const nextMonth = Number.parseInt(nextValue, 10);
1896
1896
  if (Number.isNaN(nextMonth)) return;
1897
1897
  setDisplayed((prev) => {
@@ -1901,7 +1901,7 @@ function DatePicker({
1901
1901
  return next;
1902
1902
  });
1903
1903
  }, []);
1904
- const handleYearSelect = React4.useCallback(
1904
+ const handleYearSelect = React26.useCallback(
1905
1905
  (nextValue) => {
1906
1906
  const nextYear = Number.parseInt(nextValue, 10);
1907
1907
  if (Number.isNaN(nextYear)) return;
@@ -2049,14 +2049,14 @@ var DatePicker2 = ({
2049
2049
  ariaLabel,
2050
2050
  ...calendarProps
2051
2051
  }) => {
2052
- const [open, setOpen] = React4__default.useState(false);
2053
- const parser = React4__default.useMemo(() => valueParser ?? defaultValueParser, [valueParser]);
2054
- const outputFormatter = React4__default.useMemo(() => valueFormatter ?? defaultValueFormatter, [valueFormatter]);
2055
- const labelFormatter = React4__default.useMemo(
2052
+ const [open, setOpen] = React26__default.useState(false);
2053
+ const parser = React26__default.useMemo(() => valueParser ?? defaultValueParser, [valueParser]);
2054
+ const outputFormatter = React26__default.useMemo(() => valueFormatter ?? defaultValueFormatter, [valueFormatter]);
2055
+ const labelFormatter = React26__default.useMemo(
2056
2056
  () => displayFormatter ?? defaultDisplayFormatter,
2057
2057
  [displayFormatter]
2058
2058
  );
2059
- const parsedValue = React4__default.useMemo(() => {
2059
+ const parsedValue = React26__default.useMemo(() => {
2060
2060
  if (value === null || value === void 0) return void 0;
2061
2061
  if (value instanceof Date) return value;
2062
2062
  const parsed = parser(value);
@@ -2065,26 +2065,26 @@ var DatePicker2 = ({
2065
2065
  const buttonLabel = parsedValue ? labelFormatter(parsedValue) : placeholder2;
2066
2066
  const buttonAriaLabel = ariaLabel ?? (parsedValue ? `Change date, current selection ${labelFormatter(parsedValue)}` : "Open date picker");
2067
2067
  const shouldShowClear = allowClear && !disabled && !!parsedValue;
2068
- const handleClose = React4__default.useCallback(() => setOpen(false), []);
2069
- const emitChange = React4__default.useCallback(
2068
+ const handleClose = React26__default.useCallback(() => setOpen(false), []);
2069
+ const emitChange = React26__default.useCallback(
2070
2070
  (next) => {
2071
2071
  onChange?.(next);
2072
2072
  onValueChange?.(next ? outputFormatter(next) : void 0);
2073
2073
  },
2074
2074
  [onChange, onValueChange, outputFormatter]
2075
2075
  );
2076
- const handleSelect = React4__default.useCallback(
2076
+ const handleSelect = React26__default.useCallback(
2077
2077
  (next) => {
2078
2078
  emitChange(next);
2079
2079
  if (closeOnSelect && next) handleClose();
2080
2080
  },
2081
2081
  [closeOnSelect, emitChange, handleClose]
2082
2082
  );
2083
- const handleClear = React4__default.useCallback(() => {
2083
+ const handleClear = React26__default.useCallback(() => {
2084
2084
  emitChange(void 0);
2085
2085
  handleClose();
2086
2086
  }, [emitChange, handleClose]);
2087
- const handleOpenChange = React4__default.useCallback(
2087
+ const handleOpenChange = React26__default.useCallback(
2088
2088
  (nextOpen) => {
2089
2089
  if (disabled && nextOpen) return;
2090
2090
  setOpen(nextOpen);
@@ -2274,15 +2274,15 @@ function MonthCal({
2274
2274
  onYearBackward,
2275
2275
  onYearForward
2276
2276
  }) {
2277
- const today = React4.useMemo(() => {
2277
+ const today = React26.useMemo(() => {
2278
2278
  const now = /* @__PURE__ */ new Date();
2279
2279
  now.setDate(1);
2280
2280
  now.setHours(0, 0, 0, 0);
2281
2281
  return now;
2282
2282
  }, []);
2283
- const selectedMonthDate = React4.useMemo(() => normalizeMonth(selectedDate), [selectedDate]);
2284
- const min = React4.useMemo(() => normalizeMonth(minDate), [minDate]);
2285
- const max = React4.useMemo(() => normalizeMonth(maxDate), [maxDate]);
2283
+ const selectedMonthDate = React26.useMemo(() => normalizeMonth(selectedDate), [selectedDate]);
2284
+ const min = React26.useMemo(() => normalizeMonth(minDate), [minDate]);
2285
+ const max = React26.useMemo(() => normalizeMonth(maxDate), [maxDate]);
2286
2286
  let effectiveMin = min;
2287
2287
  if (min && max && min > max) {
2288
2288
  effectiveMin = max;
@@ -2291,10 +2291,10 @@ function MonthCal({
2291
2291
  const minMonth = effectiveMin?.getMonth();
2292
2292
  const maxYear = max?.getFullYear();
2293
2293
  const maxMonth = max?.getMonth();
2294
- const [menuYear, setMenuYear] = React4.useState(
2294
+ const [menuYear, setMenuYear] = React26.useState(
2295
2295
  () => selectedMonthDate?.getFullYear() ?? today.getFullYear()
2296
2296
  );
2297
- React4.useEffect(() => {
2297
+ React26.useEffect(() => {
2298
2298
  if (selectedMonthDate) {
2299
2299
  const year = selectedMonthDate.getFullYear();
2300
2300
  if (year !== menuYear) {
@@ -2302,7 +2302,7 @@ function MonthCal({
2302
2302
  }
2303
2303
  }
2304
2304
  }, [selectedMonthDate, menuYear]);
2305
- React4.useEffect(() => {
2305
+ React26.useEffect(() => {
2306
2306
  if (typeof minYear === "number" && menuYear < minYear) {
2307
2307
  setMenuYear(minYear);
2308
2308
  return;
@@ -2313,7 +2313,7 @@ function MonthCal({
2313
2313
  }, [minYear, maxYear, menuYear]);
2314
2314
  const disablePrevYear = typeof minYear === "number" ? menuYear <= minYear : false;
2315
2315
  const disableNextYear = typeof maxYear === "number" ? menuYear >= maxYear : false;
2316
- const yearOptions = React4.useMemo(() => {
2316
+ const yearOptions = React26.useMemo(() => {
2317
2317
  const fallbackWindow = 50;
2318
2318
  const start = typeof minYear === "number" ? minYear : menuYear - fallbackWindow;
2319
2319
  const end = typeof maxYear === "number" ? maxYear : menuYear + fallbackWindow;
@@ -2327,7 +2327,7 @@ function MonthCal({
2327
2327
  }
2328
2328
  return years;
2329
2329
  }, [maxYear, menuYear, minYear]);
2330
- const formatYearLabel = React4.useCallback(
2330
+ const formatYearLabel = React26.useCallback(
2331
2331
  (year) => {
2332
2332
  const raw = callbacks?.yearLabel?.(year);
2333
2333
  if (raw === null || raw === void 0) return String(year);
@@ -2335,7 +2335,7 @@ function MonthCal({
2335
2335
  },
2336
2336
  [callbacks]
2337
2337
  );
2338
- const handleYearSelect = React4.useCallback(
2338
+ const handleYearSelect = React26.useCallback(
2339
2339
  (nextValue) => {
2340
2340
  const nextYear = Number.parseInt(nextValue, 10);
2341
2341
  if (Number.isNaN(nextYear)) return;
@@ -2345,7 +2345,7 @@ function MonthCal({
2345
2345
  },
2346
2346
  [maxYear, minYear]
2347
2347
  );
2348
- const disabledPairs = React4.useMemo(() => {
2348
+ const disabledPairs = React26.useMemo(() => {
2349
2349
  if (!disabledDates?.length) return [];
2350
2350
  const pairs = [];
2351
2351
  disabledDates.forEach((date) => {
@@ -2490,14 +2490,14 @@ var MonthPicker2 = ({
2490
2490
  ariaLabel,
2491
2491
  ...calendarProps
2492
2492
  }) => {
2493
- const [open, setOpen] = React4__default.useState(false);
2494
- const parser = React4__default.useMemo(() => valueParser ?? defaultValueParser2, [valueParser]);
2495
- const outputFormatter = React4__default.useMemo(() => valueFormatter ?? defaultValueFormatter2, [valueFormatter]);
2496
- const labelFormatter = React4__default.useMemo(
2493
+ const [open, setOpen] = React26__default.useState(false);
2494
+ const parser = React26__default.useMemo(() => valueParser ?? defaultValueParser2, [valueParser]);
2495
+ const outputFormatter = React26__default.useMemo(() => valueFormatter ?? defaultValueFormatter2, [valueFormatter]);
2496
+ const labelFormatter = React26__default.useMemo(
2497
2497
  () => displayFormatter ?? defaultDisplayFormatter2,
2498
2498
  [displayFormatter]
2499
2499
  );
2500
- const parsedValue = React4__default.useMemo(() => {
2500
+ const parsedValue = React26__default.useMemo(() => {
2501
2501
  if (value === null || value === void 0) return void 0;
2502
2502
  if (value instanceof Date) return normalizeMonth2(value);
2503
2503
  if (typeof value === "string") {
@@ -2509,8 +2509,8 @@ var MonthPicker2 = ({
2509
2509
  const buttonLabel = parsedValue ? labelFormatter(parsedValue) : placeholder2;
2510
2510
  const buttonAriaLabel = ariaLabel ?? (parsedValue ? `Change month, current selection ${labelFormatter(parsedValue)}` : "Open month picker");
2511
2511
  const shouldShowClear = allowClear && !disabled && !!parsedValue;
2512
- const handleClose = React4__default.useCallback(() => setOpen(false), []);
2513
- const emitChange = React4__default.useCallback(
2512
+ const handleClose = React26__default.useCallback(() => setOpen(false), []);
2513
+ const emitChange = React26__default.useCallback(
2514
2514
  (next) => {
2515
2515
  const normalized = next ? normalizeMonth2(next) : void 0;
2516
2516
  onChange?.(normalized);
@@ -2518,18 +2518,18 @@ var MonthPicker2 = ({
2518
2518
  },
2519
2519
  [onChange, onValueChange, outputFormatter]
2520
2520
  );
2521
- const handleSelect = React4__default.useCallback(
2521
+ const handleSelect = React26__default.useCallback(
2522
2522
  (next) => {
2523
2523
  emitChange(next);
2524
2524
  if (closeOnSelect && next) handleClose();
2525
2525
  },
2526
2526
  [closeOnSelect, emitChange, handleClose]
2527
2527
  );
2528
- const handleClear = React4__default.useCallback(() => {
2528
+ const handleClear = React26__default.useCallback(() => {
2529
2529
  emitChange(void 0);
2530
2530
  handleClose();
2531
2531
  }, [emitChange, handleClose]);
2532
- const handleOpenChange = React4__default.useCallback(
2532
+ const handleOpenChange = React26__default.useCallback(
2533
2533
  (nextOpen) => {
2534
2534
  if (disabled && nextOpen) return;
2535
2535
  setOpen(nextOpen);
@@ -3799,7 +3799,7 @@ var AdvanceSearch = ({
3799
3799
  defaultValues: {}
3800
3800
  });
3801
3801
  const { handleSubmit, unregister, resetField, getValues, clearErrors, setError } = form;
3802
- const [operatorErrors, setOperatorErrors] = React4__default.useState({});
3802
+ const [operatorErrors, setOperatorErrors] = React26__default.useState({});
3803
3803
  const clearOperatorError = useCallback(
3804
3804
  (rowId) => {
3805
3805
  setOperatorErrors((prev) => {
@@ -4217,13 +4217,13 @@ var useControllableState = ({
4217
4217
  defaultValue,
4218
4218
  value
4219
4219
  }) => {
4220
- const [internalValue, setInternalValue] = React4.useState(value ?? defaultValue);
4221
- React4.useEffect(() => {
4220
+ const [internalValue, setInternalValue] = React26.useState(value ?? defaultValue);
4221
+ React26.useEffect(() => {
4222
4222
  if (value !== internalValue) {
4223
4223
  setInternalValue(value);
4224
4224
  }
4225
4225
  }, [value]);
4226
- const updateState = React4.useCallback((nextValue) => {
4226
+ const updateState = React26.useCallback((nextValue) => {
4227
4227
  setInternalValue(nextValue);
4228
4228
  }, []);
4229
4229
  return {
@@ -4232,6 +4232,7 @@ var useControllableState = ({
4232
4232
  };
4233
4233
  };
4234
4234
  var useControllableState_default = useControllableState;
4235
+ var useIsomorphicLayoutEffect = typeof window !== "undefined" ? useLayoutEffect : useEffect;
4235
4236
  var HeaderCell = ({
4236
4237
  rootClassName,
4237
4238
  labelClassName,
@@ -4429,7 +4430,7 @@ var ColumnSeparator = ({ show, className, ...props }) => {
4429
4430
  }
4430
4431
  );
4431
4432
  };
4432
- var ColumnSeparator_default = React4__default.memo(ColumnSeparator);
4433
+ var ColumnSeparator_default = React26__default.memo(ColumnSeparator);
4433
4434
  var StatusContentSlot = ({
4434
4435
  content,
4435
4436
  icon,
@@ -4448,7 +4449,7 @@ var StatusContentSlot = ({
4448
4449
  content
4449
4450
  ] });
4450
4451
  };
4451
- var StatusContentSlot_default = React4__default.memo(StatusContentSlot);
4452
+ var StatusContentSlot_default = React26__default.memo(StatusContentSlot);
4452
4453
  var stateOptions = [
4453
4454
  "columnFilters",
4454
4455
  "globalFilter",
@@ -5957,8 +5958,8 @@ var DISALLOWED_MARKS = ["bold", "italic", "link"];
5957
5958
  var SUGGESTION_DEBOUNCE = 200;
5958
5959
  var DEFAULT_CHIP_CLASS = "outline-1 outline-muted bg-muted/40 text-foreground";
5959
5960
  var TokenView = ({ node, editor, getPos }) => {
5960
- const [isFocused, setIsFocused] = React4__default.useState(false);
5961
- React4__default.useEffect(() => {
5961
+ const [isFocused, setIsFocused] = React26__default.useState(false);
5962
+ React26__default.useEffect(() => {
5962
5963
  const handler = () => {
5963
5964
  const { from, to } = editor.state.selection;
5964
5965
  const position = getPos();
@@ -7078,7 +7079,7 @@ function ToolbarPlugin({
7078
7079
  isLink: hasLink
7079
7080
  }));
7080
7081
  }, []);
7081
- React4.useEffect(() => {
7082
+ React26.useEffect(() => {
7082
7083
  return mergeRegister(
7083
7084
  editor.registerCommand(
7084
7085
  CAN_UNDO_COMMAND,
@@ -7664,7 +7665,7 @@ function ControlledValuePlugin({
7664
7665
  trackAppliedValue
7665
7666
  }) {
7666
7667
  const [editor] = useLexicalComposerContext();
7667
- React4.useEffect(() => {
7668
+ React26.useEffect(() => {
7668
7669
  if (value == null || trackAppliedValue.current === value) {
7669
7670
  return;
7670
7671
  }
@@ -7688,14 +7689,14 @@ function ControlledValuePlugin({
7688
7689
  }
7689
7690
  function EditableStatePlugin({ editable }) {
7690
7691
  const [editor] = useLexicalComposerContext();
7691
- React4.useEffect(() => {
7692
+ React26.useEffect(() => {
7692
7693
  editor.setEditable(editable);
7693
7694
  }, [editor, editable]);
7694
7695
  return null;
7695
7696
  }
7696
7697
  function ImagesPlugin() {
7697
7698
  const [editor] = useLexicalComposerContext();
7698
- React4.useEffect(() => {
7699
+ React26.useEffect(() => {
7699
7700
  return editor.registerCommand(
7700
7701
  INSERT_IMAGE_COMMAND,
7701
7702
  (payload) => {
@@ -7976,9 +7977,9 @@ var SIDEBAR_WIDTH = "16rem";
7976
7977
  var SIDEBAR_WIDTH_MOBILE = "18rem";
7977
7978
  var SIDEBAR_WIDTH_ICON = "3rem";
7978
7979
  var SIDEBAR_KEYBOARD_SHORTCUT = "b";
7979
- var SidebarContext = React4.createContext(null);
7980
+ var SidebarContext = React26.createContext(null);
7980
7981
  function useSidebar() {
7981
- const context = React4.useContext(SidebarContext);
7982
+ const context = React26.useContext(SidebarContext);
7982
7983
  if (!context) {
7983
7984
  throw new Error("useSidebar must be used within a SidebarProvider.");
7984
7985
  }
@@ -7994,10 +7995,10 @@ function SidebarProvider({
7994
7995
  ...props
7995
7996
  }) {
7996
7997
  const isMobile = useIsMobile();
7997
- const [openMobile, setOpenMobile] = React4.useState(false);
7998
- const [_open, _setOpen] = React4.useState(defaultOpen);
7998
+ const [openMobile, setOpenMobile] = React26.useState(false);
7999
+ const [_open, _setOpen] = React26.useState(defaultOpen);
7999
8000
  const open = openProp ?? _open;
8000
- const setOpen = React4.useCallback(
8001
+ const setOpen = React26.useCallback(
8001
8002
  (value) => {
8002
8003
  const openState = typeof value === "function" ? value(open) : value;
8003
8004
  if (setOpenProp) {
@@ -8009,10 +8010,10 @@ function SidebarProvider({
8009
8010
  },
8010
8011
  [setOpenProp, open]
8011
8012
  );
8012
- const toggleSidebar = React4.useCallback(() => {
8013
+ const toggleSidebar = React26.useCallback(() => {
8013
8014
  return isMobile ? setOpenMobile((open2) => !open2) : setOpen((open2) => !open2);
8014
8015
  }, [isMobile, setOpen, setOpenMobile]);
8015
- React4.useEffect(() => {
8016
+ React26.useEffect(() => {
8016
8017
  const handleKeyDown = (event) => {
8017
8018
  if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
8018
8019
  event.preventDefault();
@@ -8023,7 +8024,7 @@ function SidebarProvider({
8023
8024
  return () => window.removeEventListener("keydown", handleKeyDown);
8024
8025
  }, [toggleSidebar]);
8025
8026
  const state = open ? "expanded" : "collapsed";
8026
- const contextValue = React4.useMemo(
8027
+ const contextValue = React26.useMemo(
8027
8028
  () => ({
8028
8029
  state,
8029
8030
  open,
@@ -8465,7 +8466,7 @@ function SidebarMenuSkeleton({
8465
8466
  showIcon = false,
8466
8467
  ...props
8467
8468
  }) {
8468
- const width = React4.useMemo(() => {
8469
+ const width = React26.useMemo(() => {
8469
8470
  return `${Math.floor(Math.random() * 40) + 50}%`;
8470
8471
  }, []);
8471
8472
  return /* @__PURE__ */ jsxs(
@@ -8934,7 +8935,7 @@ function SortableRow({
8934
8935
  id: value,
8935
8936
  disabled: name === "columns.0.id"
8936
8937
  });
8937
- const style = React4.useMemo(
8938
+ const style = React26.useMemo(
8938
8939
  () => ({
8939
8940
  transform: CSS.Transform.toString(transform),
8940
8941
  transition
@@ -9336,7 +9337,7 @@ function getCandidateWidths({
9336
9337
  }
9337
9338
  return DEVICE_SIZES;
9338
9339
  }
9339
- var Image2 = React4.forwardRef(function Image3({
9340
+ var Image2 = React26.forwardRef(function Image3({
9340
9341
  src,
9341
9342
  alt,
9342
9343
  width,
@@ -9366,34 +9367,34 @@ var Image2 = React4.forwardRef(function Image3({
9366
9367
  } = imgProps;
9367
9368
  const widthNumber = toNumber(width);
9368
9369
  const heightNumber = toNumber(height);
9369
- React4.useEffect(() => {
9370
+ React26.useEffect(() => {
9370
9371
  if (!fill && (!widthNumber || !heightNumber)) {
9371
9372
  console.warn(
9372
9373
  "[Image] When `fill` is false you should provide both `width` and `height` to prevent layout shifts."
9373
9374
  );
9374
9375
  }
9375
9376
  }, [fill, heightNumber, widthNumber]);
9376
- const candidateWidths = React4.useMemo(
9377
+ const candidateWidths = React26.useMemo(
9377
9378
  () => getCandidateWidths({ width: widthNumber, sizes, fill }),
9378
9379
  [fill, sizes, widthNumber]
9379
9380
  );
9380
9381
  const largestWidth = candidateWidths[candidateWidths.length - 1] ?? widthNumber ?? DEVICE_SIZES[DEVICE_SIZES.length - 1];
9381
- const computedSrc = React4.useMemo(() => {
9382
+ const computedSrc = React26.useMemo(() => {
9382
9383
  if (unoptimized) {
9383
9384
  return src;
9384
9385
  }
9385
9386
  return loader({ src, width: largestWidth, quality });
9386
9387
  }, [largestWidth, loader, quality, src, unoptimized]);
9387
- const computedSrcSet = React4.useMemo(() => {
9388
+ const computedSrcSet = React26.useMemo(() => {
9388
9389
  if (unoptimized) {
9389
9390
  return void 0;
9390
9391
  }
9391
9392
  return candidateWidths.map((currentWidth) => `${loader({ src, width: currentWidth, quality })} ${currentWidth}w`).join(", ");
9392
9393
  }, [candidateWidths, loader, quality, src, unoptimized]);
9393
9394
  const sizesValue = sizes ?? (fill ? "100vw" : widthNumber ? `${widthNumber}px` : void 0);
9394
- const [isLoaded, setIsLoaded] = React4.useState(false);
9395
- const internalRef = React4.useRef(null);
9396
- const setRefs = React4.useCallback(
9395
+ const [isLoaded, setIsLoaded] = React26.useState(false);
9396
+ const internalRef = React26.useRef(null);
9397
+ const setRefs = React26.useCallback(
9397
9398
  (node) => {
9398
9399
  internalRef.current = node;
9399
9400
  if (!ref) {
@@ -9407,7 +9408,7 @@ var Image2 = React4.forwardRef(function Image3({
9407
9408
  },
9408
9409
  [ref]
9409
9410
  );
9410
- React4.useEffect(() => {
9411
+ React26.useEffect(() => {
9411
9412
  const image = internalRef.current;
9412
9413
  if (!image) {
9413
9414
  return;
@@ -9419,7 +9420,7 @@ var Image2 = React4.forwardRef(function Image3({
9419
9420
  setIsLoaded(false);
9420
9421
  }
9421
9422
  }, [onLoadingComplete, src]);
9422
- const handleLoad = React4.useCallback(
9423
+ const handleLoad = React26.useCallback(
9423
9424
  (event) => {
9424
9425
  setIsLoaded(true);
9425
9426
  onLoadProp?.(event);
@@ -9431,7 +9432,7 @@ var Image2 = React4.forwardRef(function Image3({
9431
9432
  const fetchPriority = priority ? "high" : fetchPriorityProp;
9432
9433
  const decoding = decodingProp ?? "async";
9433
9434
  const resolvedObjectFit = objectFit ?? (fill ? "cover" : void 0);
9434
- const wrapperStyle = React4.useMemo(
9435
+ const wrapperStyle = React26.useMemo(
9435
9436
  () => ({
9436
9437
  position: "relative",
9437
9438
  display: fill ? "block" : "inline-block",
@@ -9441,7 +9442,7 @@ var Image2 = React4.forwardRef(function Image3({
9441
9442
  }),
9442
9443
  [fill, height, width]
9443
9444
  );
9444
- const imageStyle = React4.useMemo(
9445
+ const imageStyle = React26.useMemo(
9445
9446
  () => ({
9446
9447
  width: fill ? "100%" : formatDimension(width) ?? void 0,
9447
9448
  height: fill ? "100%" : formatDimension(height) ?? void 0,
@@ -9503,7 +9504,7 @@ var Image2 = React4.forwardRef(function Image3({
9503
9504
  });
9504
9505
  Image2.displayName = "Image";
9505
9506
  var ListTable = ({ onTableReady, children }) => {
9506
- React4.useEffect(() => {
9507
+ React26.useEffect(() => {
9507
9508
  if (onTableReady) {
9508
9509
  onTableReady({ ready: true });
9509
9510
  }
@@ -9548,7 +9549,7 @@ var ListHeader = ({
9548
9549
  return /* @__PURE__ */ jsx("div", { "data-testid": "list-header", className: cn("rounded-t-lg px-4 py-2", bgColor, className), children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
9549
9550
  /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2 text-lg", textClassName), children: [
9550
9551
  titleIcon,
9551
- /* @__PURE__ */ jsx("p", { className: "leading-none", children: title })
9552
+ title
9552
9553
  ] }),
9553
9554
  /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: rightActions ?? /* @__PURE__ */ jsxs(Fragment, { children: [
9554
9555
  onSettingClick && /* @__PURE__ */ jsx(
@@ -9648,7 +9649,7 @@ var InfoIcon = (props) => {
9648
9649
  }
9649
9650
  );
9650
9651
  };
9651
- var InfoIcon_default = React4__default.memo(InfoIcon);
9652
+ var InfoIcon_default = React26__default.memo(InfoIcon);
9652
9653
  var Navbar = ({
9653
9654
  className,
9654
9655
  title,
@@ -9780,7 +9781,7 @@ var Navbar = ({
9780
9781
  }
9781
9782
  );
9782
9783
  };
9783
- var navbar_default = React4__default.memo(Navbar);
9784
+ var navbar_default = React26__default.memo(Navbar);
9784
9785
  var usePreventPageLeaveStore = create((set) => ({
9785
9786
  isPreventing: false,
9786
9787
  setPreventing: (value) => set({ isPreventing: value })
@@ -10056,6 +10057,231 @@ var CropperModal = ({
10056
10057
  }
10057
10058
  );
10058
10059
  };
10060
+ var REACT_ELEMENT_TYPE_18 = /* @__PURE__ */ Symbol.for("react.element");
10061
+ var REACT_ELEMENT_TYPE_19 = /* @__PURE__ */ Symbol.for("react.transitional.element");
10062
+ var REACT_FRAGMENT_TYPE = /* @__PURE__ */ Symbol.for("react.fragment");
10063
+ function isFragment(object) {
10064
+ return (
10065
+ // Base object type
10066
+ object && typeof object === "object" && // React Element type
10067
+ (object.$$typeof === REACT_ELEMENT_TYPE_18 || object.$$typeof === REACT_ELEMENT_TYPE_19) && // React Fragment type
10068
+ object.type === REACT_FRAGMENT_TYPE
10069
+ );
10070
+ }
10071
+ var isValidText = (val) => ["string", "number"].includes(typeof val);
10072
+ function toArray(children, option = {}) {
10073
+ let ret = [];
10074
+ React26.Children.forEach(children, (child) => {
10075
+ if ((child === void 0 || child === null) && !option.keepEmpty) {
10076
+ return;
10077
+ }
10078
+ if (Array.isArray(child)) {
10079
+ ret = ret.concat(toArray(child));
10080
+ } else if (isFragment(child) && child.props) {
10081
+ ret = ret.concat(toArray(child.props.children, option));
10082
+ } else {
10083
+ ret.push(child);
10084
+ }
10085
+ });
10086
+ return ret;
10087
+ }
10088
+ var MeasureText = React26.forwardRef(({ style, children }, ref) => {
10089
+ const spanRef = React26.useRef(null);
10090
+ React26.useImperativeHandle(ref, () => ({
10091
+ isExceed: () => {
10092
+ const span = spanRef.current;
10093
+ return span.scrollHeight > span.clientHeight;
10094
+ },
10095
+ getHeight: () => spanRef.current.clientHeight
10096
+ }));
10097
+ return /* @__PURE__ */ jsx(
10098
+ "span",
10099
+ {
10100
+ "aria-hidden": true,
10101
+ ref: spanRef,
10102
+ style: {
10103
+ position: "fixed",
10104
+ display: "block",
10105
+ left: 0,
10106
+ top: 0,
10107
+ pointerEvents: "none",
10108
+ ...style
10109
+ },
10110
+ children
10111
+ }
10112
+ );
10113
+ });
10114
+ var getNodesLen = (nodeList) => nodeList.reduce((totalLen, node) => totalLen + (isValidText(node) ? String(node).length : 1), 0);
10115
+ function sliceNodes(nodeList, len) {
10116
+ let currLen = 0;
10117
+ const currentNodeList = [];
10118
+ for (let i = 0; i < nodeList.length; i += 1) {
10119
+ if (currLen === len) {
10120
+ return currentNodeList;
10121
+ }
10122
+ const node = nodeList[i];
10123
+ const canCut = isValidText(node);
10124
+ const nodeLen = canCut ? String(node).length : 1;
10125
+ const nextLen = currLen + nodeLen;
10126
+ if (nextLen > len) {
10127
+ const restLen = len - currLen;
10128
+ currentNodeList.push(String(node).slice(0, restLen));
10129
+ return currentNodeList;
10130
+ }
10131
+ currentNodeList.push(node);
10132
+ currLen = nextLen;
10133
+ }
10134
+ return nodeList;
10135
+ }
10136
+ var STATUS_MEASURE_NONE = 0;
10137
+ var STATUS_MEASURE_PREPARE = 1;
10138
+ var STATUS_MEASURE_START = 2;
10139
+ var STATUS_MEASURE_NEED_ELLIPSIS = 3;
10140
+ var STATUS_MEASURE_NO_NEED_ELLIPSIS = 4;
10141
+ var lineClipStyle = {
10142
+ display: "-webkit-box",
10143
+ overflow: "hidden",
10144
+ WebkitBoxOrient: "vertical"
10145
+ };
10146
+ function EllipsisMeasure(props) {
10147
+ const { enableMeasure, width, text, children, rows, expanded, miscDeps, onEllipsis } = props;
10148
+ const nodeList = React26.useMemo(() => toArray(text), [text]);
10149
+ const nodeLen = React26.useMemo(() => getNodesLen(nodeList), [text]);
10150
+ const fullContent = React26.useMemo(() => children(nodeList, false), [text]);
10151
+ const [ellipsisCutIndex, setEllipsisCutIndex] = React26.useState(null);
10152
+ const cutMidRef = React26.useRef(null);
10153
+ const measureWhiteSpaceRef = React26.useRef(null);
10154
+ const needEllipsisRef = React26.useRef(null);
10155
+ const descRowsEllipsisRef = React26.useRef(null);
10156
+ const symbolRowEllipsisRef = React26.useRef(null);
10157
+ const [canEllipsis, setCanEllipsis] = React26.useState(false);
10158
+ const [needEllipsis, setNeedEllipsis] = React26.useState(STATUS_MEASURE_NONE);
10159
+ const [ellipsisHeight, setEllipsisHeight] = React26.useState(0);
10160
+ const [parentWhiteSpace, setParentWhiteSpace] = React26.useState(null);
10161
+ useIsomorphicLayoutEffect(() => {
10162
+ if (enableMeasure && width && nodeLen) {
10163
+ setNeedEllipsis(STATUS_MEASURE_PREPARE);
10164
+ } else {
10165
+ setNeedEllipsis(STATUS_MEASURE_NONE);
10166
+ }
10167
+ }, [width, text, rows, enableMeasure, nodeList]);
10168
+ useIsomorphicLayoutEffect(() => {
10169
+ if (needEllipsis === STATUS_MEASURE_PREPARE) {
10170
+ setNeedEllipsis(STATUS_MEASURE_START);
10171
+ const nextWhiteSpace = measureWhiteSpaceRef.current && getComputedStyle(measureWhiteSpaceRef.current).whiteSpace;
10172
+ setParentWhiteSpace(nextWhiteSpace);
10173
+ } else if (needEllipsis === STATUS_MEASURE_START) {
10174
+ const isOverflow = !!needEllipsisRef.current?.isExceed();
10175
+ setNeedEllipsis(isOverflow ? STATUS_MEASURE_NEED_ELLIPSIS : STATUS_MEASURE_NO_NEED_ELLIPSIS);
10176
+ setEllipsisCutIndex(isOverflow ? [0, nodeLen] : null);
10177
+ setCanEllipsis(isOverflow);
10178
+ const baseRowsEllipsisHeight = needEllipsisRef.current?.getHeight() || 0;
10179
+ const descRowsEllipsisHeight = rows === 1 ? 0 : descRowsEllipsisRef.current?.getHeight() || 0;
10180
+ const symbolRowEllipsisHeight = symbolRowEllipsisRef.current?.getHeight() || 0;
10181
+ const maxRowsHeight = Math.max(
10182
+ baseRowsEllipsisHeight,
10183
+ // height of rows with ellipsis
10184
+ descRowsEllipsisHeight + symbolRowEllipsisHeight
10185
+ );
10186
+ setEllipsisHeight(maxRowsHeight + 1);
10187
+ onEllipsis(isOverflow);
10188
+ }
10189
+ }, [needEllipsis]);
10190
+ const cutMidIndex = ellipsisCutIndex ? Math.ceil((ellipsisCutIndex[0] + ellipsisCutIndex[1]) / 2) : 0;
10191
+ useIsomorphicLayoutEffect(() => {
10192
+ const [minIndex, maxIndex] = ellipsisCutIndex || [0, 0];
10193
+ if (minIndex !== maxIndex) {
10194
+ const midHeight = cutMidRef.current?.getHeight() || 0;
10195
+ const isOverflow = midHeight > ellipsisHeight;
10196
+ let targetMidIndex = cutMidIndex;
10197
+ if (maxIndex - minIndex === 1) {
10198
+ targetMidIndex = isOverflow ? minIndex : maxIndex;
10199
+ }
10200
+ setEllipsisCutIndex(isOverflow ? [minIndex, targetMidIndex] : [targetMidIndex, maxIndex]);
10201
+ }
10202
+ }, [ellipsisCutIndex, cutMidIndex]);
10203
+ const finalContent = React26.useMemo(() => {
10204
+ if (!enableMeasure) {
10205
+ return children(nodeList, false);
10206
+ }
10207
+ if (needEllipsis !== STATUS_MEASURE_NEED_ELLIPSIS || !ellipsisCutIndex || ellipsisCutIndex[0] !== ellipsisCutIndex[1]) {
10208
+ const content = children(nodeList, false);
10209
+ if ([STATUS_MEASURE_NO_NEED_ELLIPSIS, STATUS_MEASURE_NONE].includes(needEllipsis)) {
10210
+ return content;
10211
+ }
10212
+ return /* @__PURE__ */ jsx(
10213
+ "span",
10214
+ {
10215
+ style: {
10216
+ ...lineClipStyle,
10217
+ WebkitLineClamp: rows
10218
+ },
10219
+ children: content
10220
+ }
10221
+ );
10222
+ }
10223
+ return children(expanded ? nodeList : sliceNodes(nodeList, ellipsisCutIndex[0]), canEllipsis);
10224
+ }, [expanded, needEllipsis, ellipsisCutIndex, nodeList, ...miscDeps]);
10225
+ const measureStyle = {
10226
+ width,
10227
+ margin: 0,
10228
+ padding: 0,
10229
+ whiteSpace: parentWhiteSpace === "nowrap" ? "normal" : "inherit"
10230
+ };
10231
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
10232
+ finalContent,
10233
+ needEllipsis === STATUS_MEASURE_START && /* @__PURE__ */ jsxs(Fragment, { children: [
10234
+ /* @__PURE__ */ jsx(
10235
+ MeasureText,
10236
+ {
10237
+ style: {
10238
+ ...measureStyle,
10239
+ ...lineClipStyle,
10240
+ WebkitLineClamp: rows
10241
+ },
10242
+ ref: needEllipsisRef,
10243
+ children: fullContent
10244
+ }
10245
+ ),
10246
+ /* @__PURE__ */ jsx(
10247
+ MeasureText,
10248
+ {
10249
+ style: {
10250
+ ...measureStyle,
10251
+ ...lineClipStyle,
10252
+ WebkitLineClamp: rows - 1
10253
+ },
10254
+ ref: descRowsEllipsisRef,
10255
+ children: fullContent
10256
+ }
10257
+ ),
10258
+ /* @__PURE__ */ jsx(
10259
+ MeasureText,
10260
+ {
10261
+ style: {
10262
+ ...measureStyle,
10263
+ ...lineClipStyle,
10264
+ WebkitLineClamp: 1
10265
+ },
10266
+ ref: symbolRowEllipsisRef,
10267
+ children: children([], true)
10268
+ }
10269
+ )
10270
+ ] }),
10271
+ needEllipsis === STATUS_MEASURE_NEED_ELLIPSIS && ellipsisCutIndex && ellipsisCutIndex[0] !== ellipsisCutIndex[1] && /* @__PURE__ */ jsx(
10272
+ MeasureText,
10273
+ {
10274
+ style: {
10275
+ ...measureStyle,
10276
+ top: 400
10277
+ },
10278
+ ref: cutMidRef,
10279
+ children: children(sliceNodes(nodeList, cutMidIndex), true)
10280
+ }
10281
+ ),
10282
+ needEllipsis === STATUS_MEASURE_PREPARE && /* @__PURE__ */ jsx("span", { style: { whiteSpace: "inherit" }, ref: measureWhiteSpaceRef })
10283
+ ] });
10284
+ }
10059
10285
  var Truncated = ({
10060
10286
  children,
10061
10287
  className,
@@ -10065,49 +10291,41 @@ var Truncated = ({
10065
10291
  tooltipProps,
10066
10292
  tooltipContentProps
10067
10293
  }) => {
10068
- const elementRef = useRef(null);
10069
- const [open, setOpen] = useState(false);
10070
- const [isTruncated, setIsTruncated] = useState(false);
10294
+ const elementRef = React26.useRef(null);
10295
+ const [open, setOpen] = React26.useState(false);
10296
+ const [isTruncated, setIsTruncated] = React26.useState(false);
10297
+ const [measureWidth, setMeasureWidth] = React26.useState(0);
10071
10298
  const Comp = as;
10072
10299
  const normalizedChildren = typeof children === "string" ? children.replace(/>/g, ">\u200B") : children;
10073
10300
  const lineClampLines = typeof ellipsis === "number" ? ellipsis : typeof ellipsis === "object" ? ellipsis?.lineClamp ?? 3 : null;
10074
- useEffect(() => {
10301
+ const enableMeasure = Boolean(ellipsis) && !tooltipProps?.disabled;
10302
+ useIsomorphicLayoutEffect(() => {
10075
10303
  const el = elementRef.current;
10076
10304
  if (!el) return;
10077
- const measure = () => {
10078
- if (!ellipsis) {
10079
- setIsTruncated(false);
10080
- return;
10081
- }
10305
+ const updateWidth = () => {
10082
10306
  const rect = el.getBoundingClientRect();
10083
- const width = el.clientWidth || el.offsetWidth || rect.width;
10084
- const height = el.clientHeight || el.offsetHeight || rect.height;
10085
- if (!width || !height) {
10086
- setIsTruncated(false);
10087
- return;
10088
- }
10089
- const epsilon = 1;
10090
- const overflowWidth = el.scrollWidth - width > epsilon;
10091
- const overflowHeight = el.scrollHeight - height > epsilon;
10092
- setIsTruncated(overflowWidth || overflowHeight);
10307
+ const width = el.clientWidth || el.offsetWidth || rect.width || 0;
10308
+ setMeasureWidth(width);
10093
10309
  };
10094
- const resizeObserver = new ResizeObserver(() => requestAnimationFrame(measure));
10310
+ updateWidth();
10311
+ const resizeObserver = new ResizeObserver(() => requestAnimationFrame(updateWidth));
10095
10312
  resizeObserver.observe(el);
10096
- const mutationObserver = new MutationObserver(() => measure());
10097
- mutationObserver.observe(el, { childList: true, subtree: true, characterData: true });
10098
- requestAnimationFrame(measure);
10099
10313
  return () => {
10100
10314
  resizeObserver.disconnect();
10101
- mutationObserver.disconnect();
10102
10315
  };
10103
- }, [children, ellipsis, lineClampLines]);
10104
- const truncationClass = useMemo(() => {
10316
+ }, []);
10317
+ useIsomorphicLayoutEffect(() => {
10318
+ if (!enableMeasure) {
10319
+ setIsTruncated(false);
10320
+ }
10321
+ }, [enableMeasure]);
10322
+ const truncationClass = React26.useMemo(() => {
10105
10323
  if (!ellipsis) return "";
10106
10324
  if (typeof ellipsis === "number") return `line-clamp-${ellipsis}`;
10107
10325
  if (typeof ellipsis === "object") return `line-clamp-${lineClampLines ?? 3}`;
10108
10326
  return "truncate";
10109
10327
  }, [ellipsis, lineClampLines]);
10110
- const clampedStyle = useMemo(() => {
10328
+ const clampedStyle = React26.useMemo(() => {
10111
10329
  if (!lineClampLines) return style;
10112
10330
  return {
10113
10331
  ...style,
@@ -10117,7 +10335,22 @@ var Truncated = ({
10117
10335
  overflow: "hidden"
10118
10336
  };
10119
10337
  }, [lineClampLines, style]);
10120
- const baseContent = /* @__PURE__ */ jsx(Comp, { ref: elementRef, className: cn(truncationClass, className), style: clampedStyle, children: normalizedChildren });
10338
+ const baseContent = /* @__PURE__ */ jsx(Comp, { ref: elementRef, className: cn(truncationClass, className), style: clampedStyle, children: /* @__PURE__ */ jsx(
10339
+ EllipsisMeasure,
10340
+ {
10341
+ enableMeasure,
10342
+ text: normalizedChildren,
10343
+ width: measureWidth,
10344
+ rows: lineClampLines ?? 1,
10345
+ expanded: false,
10346
+ miscDeps: [truncationClass],
10347
+ onEllipsis: (s) => {
10348
+ console.log("\u{1F680} ~ Truncated ~ s:", s);
10349
+ setIsTruncated(s);
10350
+ },
10351
+ children: () => normalizedChildren
10352
+ }
10353
+ ) });
10121
10354
  let tooltipContent = normalizedChildren;
10122
10355
  if (typeof ellipsis === "object") {
10123
10356
  tooltipContent = ellipsis?.content ?? normalizedChildren;
@@ -10157,7 +10390,7 @@ var Truncated = ({
10157
10390
  );
10158
10391
  };
10159
10392
  var truncated_default = Truncated;
10160
- var InputPrimitive2 = React4.forwardRef(
10393
+ var InputPrimitive2 = React26.forwardRef(
10161
10394
  ({ className, type = "text", ...props }, ref) => {
10162
10395
  return /* @__PURE__ */ jsx(
10163
10396
  "input",
@@ -10196,7 +10429,7 @@ var inputVariants2 = cva("", {
10196
10429
  appearance: "filled"
10197
10430
  }
10198
10431
  });
10199
- var Input2 = React4.forwardRef(
10432
+ var Input2 = React26.forwardRef(
10200
10433
  ({
10201
10434
  className,
10202
10435
  wrapperClassName,
@@ -10229,8 +10462,8 @@ var Input2 = React4.forwardRef(
10229
10462
  onChange: onChangeProp
10230
10463
  } = rest;
10231
10464
  const ariaInvalid = invalid ?? ariaInvalidProp;
10232
- const messageId = React4.useId();
10233
- const handleChange = React4.useCallback(
10465
+ const messageId = React26.useId();
10466
+ const handleChange = React26.useCallback(
10234
10467
  (event) => {
10235
10468
  onChangeProp?.(event);
10236
10469
  onValueChange?.(event.target.value);
@@ -10623,13 +10856,13 @@ var useFieldNames = ({
10623
10856
  fieldNames
10624
10857
  }) => {
10625
10858
  const { label: labelFieldKey = "label", value: valueFieldKey = "value" } = fieldNames || {};
10626
- const getLabelField = React4__default.useCallback(
10859
+ const getLabelField = React26__default.useCallback(
10627
10860
  (option) => {
10628
10861
  return option?.[labelFieldKey];
10629
10862
  },
10630
10863
  [labelFieldKey]
10631
10864
  );
10632
- const getValueField = React4__default.useCallback(
10865
+ const getValueField = React26__default.useCallback(
10633
10866
  (option) => {
10634
10867
  return option?.[valueFieldKey];
10635
10868
  },
@@ -10650,7 +10883,7 @@ var VirtualizedCommand = ({
10650
10883
  emptyContent = "No data.",
10651
10884
  searchPlaceholder,
10652
10885
  value,
10653
- notFoundContent = "Not item found.",
10886
+ notFoundContent = "No item found.",
10654
10887
  showSearch = true,
10655
10888
  fieldNames,
10656
10889
  disabledOption,
@@ -10661,11 +10894,11 @@ var VirtualizedCommand = ({
10661
10894
  onFocus
10662
10895
  }) => {
10663
10896
  const { getLabelField, getValueField } = useFieldNames_default({ fieldNames });
10664
- const internalOptions = React4.useMemo(() => options ?? [], [options]);
10665
- const [filteredOptions, setFilteredOptions] = React4.useState(internalOptions);
10666
- const [focusedIndex, setFocusedIndex] = React4.useState(0);
10667
- const [isKeyboardNavActive, setIsKeyboardNavActive] = React4.useState(false);
10668
- const parentRef = React4.useRef(null);
10897
+ const internalOptions = React26.useMemo(() => options ?? [], [options]);
10898
+ const [filteredOptions, setFilteredOptions] = React26.useState(internalOptions);
10899
+ const [focusedIndex, setFocusedIndex] = React26.useState(0);
10900
+ const [isKeyboardNavActive, setIsKeyboardNavActive] = React26.useState(false);
10901
+ const parentRef = React26.useRef(null);
10669
10902
  const virtualizer = useVirtualizer({
10670
10903
  count: filteredOptions.length,
10671
10904
  getScrollElement: () => parentRef.current,
@@ -10673,14 +10906,14 @@ var VirtualizedCommand = ({
10673
10906
  overscan: 2
10674
10907
  });
10675
10908
  const virtualOptions = virtualizer.getVirtualItems();
10676
- const dynamicHeight = React4.useMemo(() => {
10909
+ const dynamicHeight = React26.useMemo(() => {
10677
10910
  const contentHeight = filteredOptions.length * ROW_HEIGHT;
10678
10911
  if (contentHeight <= 0) {
10679
10912
  return MIN_HEIGHT_EMPTY;
10680
10913
  }
10681
10914
  return Math.max(ROW_HEIGHT, Math.min(height, contentHeight));
10682
10915
  }, [filteredOptions.length, height]);
10683
- const scrollToIndex = React4.useCallback(
10916
+ const scrollToIndex = React26.useCallback(
10684
10917
  (index) => {
10685
10918
  virtualizer.scrollToIndex(index, {
10686
10919
  align: "center"
@@ -10688,7 +10921,7 @@ var VirtualizedCommand = ({
10688
10921
  },
10689
10922
  [virtualizer]
10690
10923
  );
10691
- const handleSearch = React4.useCallback(
10924
+ const handleSearch = React26.useCallback(
10692
10925
  (search) => {
10693
10926
  setIsKeyboardNavActive(false);
10694
10927
  setFilteredOptions(
@@ -10703,7 +10936,7 @@ var VirtualizedCommand = ({
10703
10936
  },
10704
10937
  [filterOption, getLabelField, internalOptions]
10705
10938
  );
10706
- const handleKeyDown = React4.useCallback(
10939
+ const handleKeyDown = React26.useCallback(
10707
10940
  (event) => {
10708
10941
  switch (event.key) {
10709
10942
  case "ArrowDown": {
@@ -10738,7 +10971,7 @@ var VirtualizedCommand = ({
10738
10971
  },
10739
10972
  [filteredOptions, focusedIndex, getValueField, onSelect, scrollToIndex]
10740
10973
  );
10741
- React4.useEffect(() => {
10974
+ React26.useEffect(() => {
10742
10975
  if (value) {
10743
10976
  const option = filteredOptions.find((option2) => {
10744
10977
  const optionValue = getValueField(option2);
@@ -10852,21 +11085,21 @@ var ComboboxInner = ({
10852
11085
  showSearch,
10853
11086
  ...props
10854
11087
  }, ref) => {
10855
- const { getValueField } = useFieldNames_default({ fieldNames });
10856
- const [open, setOpen] = React4.useState(false);
11088
+ const { getLabelField, getValueField } = useFieldNames_default({ fieldNames });
11089
+ const [open, setOpen] = React26.useState(false);
10857
11090
  const { value: selectedValue, updateState: setSelectedValue } = useControllableState_default({
10858
11091
  defaultValue,
10859
11092
  value
10860
11093
  });
10861
- const renderValue = React4.useMemo(() => {
11094
+ const renderValue = React26.useMemo(() => {
10862
11095
  if (!selectedValue) return placeholder2;
10863
11096
  const selectedOptionFound = options?.find((option) => {
10864
11097
  const optionValue = getValueField(option);
10865
11098
  return optionValue === selectedValue;
10866
11099
  });
10867
- return selectedOptionFound ? getValueField(selectedOptionFound) : null;
10868
- }, [getValueField, options, placeholder2, selectedValue]);
10869
- const handleSelect = React4.useCallback(
11100
+ return selectedOptionFound ? getLabelField(selectedOptionFound) : null;
11101
+ }, [getLabelField, getValueField, options, placeholder2, selectedValue]);
11102
+ const handleSelect = React26.useCallback(
10870
11103
  (selected, option) => {
10871
11104
  setSelectedValue(selected);
10872
11105
  setOpen(false);
@@ -10876,7 +11109,7 @@ var ComboboxInner = ({
10876
11109
  },
10877
11110
  [onSelect, setSelectedValue]
10878
11111
  );
10879
- const handleClear = React4.useCallback(
11112
+ const handleClear = React26.useCallback(
10880
11113
  (event) => {
10881
11114
  event.stopPropagation();
10882
11115
  setSelectedValue(void 0);
@@ -10893,9 +11126,11 @@ var ComboboxInner = ({
10893
11126
  role: "combobox",
10894
11127
  "aria-expanded": open,
10895
11128
  className: cn(
10896
- "flex w-full items-center justify-between gap-2 rounded-md border bg-white px-3 h-9 text-sm whitespace-nowrap shadow-xs outline-none border-input",
10897
- "focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 aria-invalid:border-destructive disabled:cursor-not-allowed disabled:opacity-50",
10898
- "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
11129
+ "flex items-center justify-between gap-2 rounded-md border bg-white px-3 h-9 text-sm whitespace-nowrap shadow-xs outline-none border-input",
11130
+ "disabled:cursor-not-allowed disabled:opacity-50",
11131
+ "focus-visible:border-ring focus-visible:ring-ring/50",
11132
+ "aria-invalid:ring-destructive/20 aria-invalid:border-destructive",
11133
+ "data-[state=open]:border-ring",
10899
11134
  "transition-all",
10900
11135
  className
10901
11136
  ),
@@ -10960,9 +11195,9 @@ var ComboboxInner = ({
10960
11195
  )
10961
11196
  ] });
10962
11197
  };
10963
- var Combobox = React4.forwardRef(ComboboxInner);
11198
+ var Combobox = React26.forwardRef(ComboboxInner);
10964
11199
  var Combobox_default = Combobox;
10965
11200
 
10966
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActionMenu, AdvanceSearch_default as AdvanceSearch, arrow_default as ArrowIcon, Button, Checkbox, Collapsible, CollapsibleContent2 as CollapsibleContent, CollapsibleTrigger2 as CollapsibleTrigger, Combobox_default as Combobox, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, CropperModal, CropperModalError, DIALOG_ALERT_I18N_SUBNAMESPACE, DIALOG_ALERT_TEMPLATES, DataTable_default as DataTable, DatePicker2 as DatePicker, Dialog, DialogAlert, DialogAlertProvider, DialogContent, DialogDescription, DialogFooter, DialogTitle, DialogTrigger, ErrorCompression, ErrorCreateCanvas, ErrorGeneratingBlob, ErrorInvalidSVG, ErrorSVGExceedSize, filters_default as FiltersIcon, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, FormulaEditor, GridSettingsModal_default as GridSettingsModal, HeaderCell_default as HeaderCell, Image2 as Image, Input, InputNumber_default as InputNumber, Label2 as Label, List_default as List, container_default as ListContainer, header_default as ListHeader, table_default as ListTable, LookupSelect, MonthPicker2 as MonthPicker, navbar_default as Navbar, not_found_default as NotFoundIcon, Popover, PopoverAnchor, PopoverArrow, PopoverContent, PopoverTrigger, PreventPageLeave_default as PreventPageLeave, RadioGroupItem, RadioGroupRoot, RadioLabel, RichText, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator2 as Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarLayout, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Spinner, calendar_default as SuiCalendarIcon, calendar2_default as SuiCalendarIcon2, check_default as SuiCheckIcon, dots_vertical_default as SuiDotsVerticalIcon, empty_data_default as SuiEmptyDataIcon, expand_default as SuiExpandIcon, filter_default as SuiFilterIcon, setting_default as SuiSettingIcon, triangle_down_default as SuiTriangleDownIcon, warning_default as SuiWarningIcon, Switch, Textarea, Tooltip2 as Tooltip, TooltipArrow, TooltipContent2 as TooltipContent, TooltipProvider2 as TooltipProvider, TooltipTrigger2 as TooltipTrigger, truncated_default as Truncated, ui_exports as UI, VirtualizedCommand_default as VirtualizedCommand, booleanToSelectValue, buildPrefixMap, buttonVariants, cn, compareAlphanumeric, debounce, defaultOperatorShortcuts, defaultOperators, formatISODate, getDialogAlertControls, inputVariants, isDefined, isEmptyObject, isValidParentheses, mapTokensToOutput, parseFormula, parseFormulaToToken, resetVisibleTableState, selectValueToBoolean, spinnerVariants, splitOperators, stripNullishObject, throttle, tokenizeFormulaString, useControllableState_default as useControllableState, useFormField, useGridSettingsStore_default as useGridSettingsStore, useHover_default as useHover, useIntersectionObserver_default as useIntersectionObserver, useMediaQuery_default as useMediaQuery, usePreventPageLeave_default as usePreventPageLeave, usePreventPageLeaveStore_default as usePreventPageLeaveStore, useScreenSize_default as useScreenSize, useSidebar, useTruncated_default as useTruncated, validateTokenPrefixes };
11201
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActionMenu, AdvanceSearch_default as AdvanceSearch, arrow_default as ArrowIcon, Button, Checkbox, Collapsible, CollapsibleContent2 as CollapsibleContent, CollapsibleTrigger2 as CollapsibleTrigger, Combobox_default as Combobox, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, CropperModal, CropperModalError, DIALOG_ALERT_I18N_SUBNAMESPACE, DIALOG_ALERT_TEMPLATES, DataTable_default as DataTable, DatePicker2 as DatePicker, Dialog, DialogAlert, DialogAlertProvider, DialogContent, DialogDescription, DialogFooter, DialogTitle, DialogTrigger, ErrorCompression, ErrorCreateCanvas, ErrorGeneratingBlob, ErrorInvalidSVG, ErrorSVGExceedSize, filters_default as FiltersIcon, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, FormulaEditor, GridSettingsModal_default as GridSettingsModal, HeaderCell_default as HeaderCell, Image2 as Image, Input, InputNumber_default as InputNumber, Label2 as Label, List_default as List, container_default as ListContainer, header_default as ListHeader, table_default as ListTable, LookupSelect, MonthPicker2 as MonthPicker, navbar_default as Navbar, not_found_default as NotFoundIcon, Popover, PopoverAnchor, PopoverArrow, PopoverContent, PopoverTrigger, PreventPageLeave_default as PreventPageLeave, RadioGroupItem, RadioGroupRoot, RadioLabel, RichText, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator2 as Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarLayout, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Spinner, calendar_default as SuiCalendarIcon, calendar2_default as SuiCalendarIcon2, check_default as SuiCheckIcon, dots_vertical_default as SuiDotsVerticalIcon, empty_data_default as SuiEmptyDataIcon, expand_default as SuiExpandIcon, filter_default as SuiFilterIcon, setting_default as SuiSettingIcon, triangle_down_default as SuiTriangleDownIcon, warning_default as SuiWarningIcon, Switch, Textarea, Tooltip2 as Tooltip, TooltipArrow, TooltipContent2 as TooltipContent, TooltipProvider2 as TooltipProvider, TooltipTrigger2 as TooltipTrigger, truncated_default as Truncated, ui_exports as UI, VirtualizedCommand_default as VirtualizedCommand, booleanToSelectValue, buildPrefixMap, buttonVariants, cn, compareAlphanumeric, debounce, defaultOperatorShortcuts, defaultOperators, formatISODate, getDialogAlertControls, inputVariants, isDefined, isEmptyObject, isValidParentheses, mapTokensToOutput, parseFormula, parseFormulaToToken, resetVisibleTableState, selectValueToBoolean, spinnerVariants, splitOperators, stripNullishObject, throttle, tokenizeFormulaString, useControllableState_default as useControllableState, useFormField, useGridSettingsStore_default as useGridSettingsStore, useHover_default as useHover, useIntersectionObserver_default as useIntersectionObserver, useIsomorphicLayoutEffect, useMediaQuery_default as useMediaQuery, usePreventPageLeave_default as usePreventPageLeave, usePreventPageLeaveStore_default as usePreventPageLeaveStore, useScreenSize_default as useScreenSize, useSidebar, useTruncated_default as useTruncated, validateTokenPrefixes };
10967
11202
  //# sourceMappingURL=index.mjs.map
10968
11203
  //# sourceMappingURL=index.mjs.map