hs-uix 1.4.1 → 1.5.0

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
@@ -304,7 +304,9 @@ var DataTable = ({
304
304
  const initialSortState = useMemo(() => {
305
305
  return normalizeSortState(columns, defaultSort);
306
306
  }, [columns, defaultSort]);
307
- const [internalSearchTerm, setInternalSearchTerm] = useState("");
307
+ const [internalSearchTerm, setInternalSearchTerm] = useState(
308
+ () => serverSide && searchValue != null ? searchValue : ""
309
+ );
308
310
  const [internalFilterValues, setInternalFilterValues] = useState(() => {
309
311
  const init = {};
310
312
  filters.forEach((f) => {
@@ -315,7 +317,16 @@ var DataTable = ({
315
317
  const [internalSortState, setInternalSortState] = useState(initialSortState);
316
318
  const [currentPage, setCurrentPage] = useState(1);
317
319
  const [showMoreFilters, setShowMoreFilters] = useState(false);
320
+ const lastAppliedSearchRef = useRef(
321
+ serverSide && searchValue != null ? searchValue : ""
322
+ );
318
323
  const searchTerm = serverSide && searchValue != null ? searchValue : internalSearchTerm;
324
+ useEffect(() => {
325
+ if (!serverSide || searchValue == null) return;
326
+ if (searchValue === lastAppliedSearchRef.current) return;
327
+ lastAppliedSearchRef.current = searchValue;
328
+ setInternalSearchTerm(searchValue);
329
+ }, [serverSide, searchValue]);
319
330
  const filterValues = serverSide && externalFilterValues != null ? externalFilterValues : internalFilterValues;
320
331
  const externalSortState = useMemo(
321
332
  () => normalizeSortState(columns, externalSort),
@@ -349,15 +360,16 @@ var DataTable = ({
349
360
  const handleSearchChange = useCallback((term) => {
350
361
  setInternalSearchTerm(term);
351
362
  resetPage();
363
+ const dispatch = () => {
364
+ lastAppliedSearchRef.current = term;
365
+ fireSearchCallback(term);
366
+ fireParamsChange({ search: term, page: resetPageOnChange ? 1 : void 0 });
367
+ };
352
368
  if (searchDebounce > 0) {
353
369
  if (debounceRef.current) clearTimeout(debounceRef.current);
354
- debounceRef.current = setTimeout(() => {
355
- fireSearchCallback(term);
356
- fireParamsChange({ search: term, page: resetPageOnChange ? 1 : void 0 });
357
- }, searchDebounce);
370
+ debounceRef.current = setTimeout(dispatch, searchDebounce);
358
371
  } else {
359
- fireSearchCallback(term);
360
- fireParamsChange({ search: term, page: resetPageOnChange ? 1 : void 0 });
372
+ dispatch();
361
373
  }
362
374
  }, [searchDebounce, fireSearchCallback, fireParamsChange, resetPage, resetPageOnChange]);
363
375
  useEffect(() => () => {
@@ -439,10 +451,23 @@ var DataTable = ({
439
451
  if (serverSide) return filteredData;
440
452
  const activeField = Object.keys(sortState).find((k) => sortState[k] !== "none");
441
453
  if (!activeField) return filteredData;
454
+ const activeCol = columns.find((c) => c.field === activeField);
455
+ const sortOrder = Array.isArray(activeCol == null ? void 0 : activeCol.sortOrder) ? activeCol.sortOrder : null;
456
+ const sortOrderIndex = (val) => {
457
+ const idx = sortOrder.indexOf(val);
458
+ return idx === -1 ? sortOrder.length : idx;
459
+ };
442
460
  return [...filteredData].sort((a, b) => {
443
461
  const dir = sortState[activeField] === "ascending" ? 1 : -1;
444
462
  const aVal = a[activeField];
445
463
  const bVal = b[activeField];
464
+ if (typeof (activeCol == null ? void 0 : activeCol.sortComparator) === "function") {
465
+ return dir * activeCol.sortComparator(aVal, bVal, a, b);
466
+ }
467
+ if (sortOrder) {
468
+ const diff = sortOrderIndex(aVal) - sortOrderIndex(bVal);
469
+ if (diff !== 0) return dir * diff;
470
+ }
446
471
  if (aVal == null && bVal == null) return 0;
447
472
  if (aVal == null) return 1;
448
473
  if (bVal == null) return -1;
@@ -450,7 +475,7 @@ var DataTable = ({
450
475
  if (aVal > bVal) return dir;
451
476
  return 0;
452
477
  });
453
- }, [filteredData, sortState, serverSide]);
478
+ }, [filteredData, sortState, serverSide, columns]);
454
479
  const groupedData = useMemo(() => {
455
480
  if (!groupBy) return null;
456
481
  const source = serverSide ? data : sortedData;
@@ -974,12 +999,12 @@ var DataTable = ({
974
999
  }
975
1000
  );
976
1001
  };
977
- return /* @__PURE__ */ React.createElement(Flex, { direction: "column", gap: "xs" }, /* @__PURE__ */ React.createElement(Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ React.createElement(Box, { flex: 3 }, /* @__PURE__ */ React.createElement(Flex, { direction: "column", gap: "sm" }, /* @__PURE__ */ React.createElement(Flex, { direction: "row", align: "center", gap: "sm", wrap: "wrap" }, showSearch && searchFields.length > 0 && /* @__PURE__ */ React.createElement(
1002
+ return /* @__PURE__ */ React.createElement(Flex, { direction: "column", gap: "xs" }, /* @__PURE__ */ React.createElement(Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ React.createElement(Box, { flex: 3 }, /* @__PURE__ */ React.createElement(Flex, { direction: "column", gap: "sm" }, /* @__PURE__ */ React.createElement(Flex, { direction: "row", align: "end", gap: "sm", wrap: "wrap" }, showSearch && searchFields.length > 0 && /* @__PURE__ */ React.createElement(
978
1003
  SearchInput,
979
1004
  {
980
1005
  name: "datatable-search",
981
1006
  placeholder: searchPlaceholder,
982
- value: searchTerm,
1007
+ value: internalSearchTerm,
983
1008
  onChange: handleSearchChange
984
1009
  }
985
1010
  ), filters.slice(0, filterInlineLimit).map(renderFilterControl), filters.length > filterInlineLimit && /* @__PURE__ */ React.createElement(
@@ -3482,8 +3507,211 @@ var FormBuilder = forwardRef(function FormBuilder2(props, ref) {
3482
3507
  formContent
3483
3508
  );
3484
3509
  });
3510
+
3511
+ // src/common-components/AutoTag.js
3512
+ import React3 from "react";
3513
+ import { Tag as Tag2 } from "@hubspot/ui-extensions";
3514
+
3515
+ // src/utils/tagVariants.js
3516
+ var DEFAULT_VARIANT = "default";
3517
+ var DANGER_VARIANT = "danger";
3518
+ var ERROR_VARIANT = "error";
3519
+ var SUCCESS_MATCHERS = [
3520
+ "active",
3521
+ "success",
3522
+ "succeeded",
3523
+ "complete",
3524
+ "completed",
3525
+ "approved",
3526
+ "won",
3527
+ "healthy",
3528
+ "enabled",
3529
+ "connected",
3530
+ "paid",
3531
+ "live",
3532
+ "published",
3533
+ "available",
3534
+ "synced",
3535
+ "resolved"
3536
+ ];
3537
+ var WARNING_MATCHERS = [
3538
+ "warning",
3539
+ "at risk",
3540
+ "risky",
3541
+ "pending",
3542
+ "paused",
3543
+ "pause",
3544
+ "on hold",
3545
+ "hold",
3546
+ "review",
3547
+ "expiring",
3548
+ "trial",
3549
+ "in progress",
3550
+ "awaiting",
3551
+ "scheduled"
3552
+ ];
3553
+ var DANGER_MATCHERS = [
3554
+ "danger",
3555
+ "error",
3556
+ "failed",
3557
+ "failure",
3558
+ "inactive",
3559
+ "disabled",
3560
+ "blocked",
3561
+ "cancelled",
3562
+ "canceled",
3563
+ "rejected",
3564
+ "denied",
3565
+ "churned",
3566
+ "lost",
3567
+ "overdue",
3568
+ "expired",
3569
+ "offline",
3570
+ "deleted",
3571
+ "archived",
3572
+ "unpaid"
3573
+ ];
3574
+ var INFO_MATCHERS = [
3575
+ "info",
3576
+ "new",
3577
+ "queued",
3578
+ "processing",
3579
+ "progress",
3580
+ "upcoming",
3581
+ "draft",
3582
+ "open"
3583
+ ];
3584
+ var normalizeTagValue = (value) => {
3585
+ if (value == null) return "";
3586
+ if (typeof value === "boolean") return value ? "true" : "false";
3587
+ return String(value).trim().toLowerCase().replace(/[_-]+/g, " ").replace(/\s+/g, " ");
3588
+ };
3589
+ var matchesAny = (value, matchers) => matchers.some((matcher) => {
3590
+ if (value === matcher) return true;
3591
+ return ` ${value} `.includes(` ${matcher} `);
3592
+ });
3593
+ var getSemanticVariant = (value, options = {}) => {
3594
+ const normalized = normalizeTagValue(value);
3595
+ const fallback = options.fallback || DEFAULT_VARIANT;
3596
+ if (!normalized) return fallback;
3597
+ if (options.overrides) {
3598
+ const overrideKey = Object.keys(options.overrides).find(
3599
+ (key) => normalizeTagValue(key) === normalized
3600
+ );
3601
+ if (overrideKey) return options.overrides[overrideKey];
3602
+ }
3603
+ if (normalized === "true") return "success";
3604
+ if (normalized === "false") return fallback;
3605
+ if (matchesAny(normalized, SUCCESS_MATCHERS)) return "success";
3606
+ if (matchesAny(normalized, DANGER_MATCHERS)) return DANGER_VARIANT;
3607
+ if (matchesAny(normalized, WARNING_MATCHERS)) return "warning";
3608
+ if (matchesAny(normalized, INFO_MATCHERS)) return "info";
3609
+ return fallback;
3610
+ };
3611
+ var getAutoTagVariant = (value, options = {}) => {
3612
+ const semanticVariant = getSemanticVariant(value, options);
3613
+ return semanticVariant === DANGER_VARIANT ? ERROR_VARIANT : semanticVariant;
3614
+ };
3615
+ var getAutoStatusTagVariant = (value, options = {}) => getSemanticVariant(value, options);
3616
+ var getAutoTagDisplayValue = (value) => {
3617
+ if (typeof value === "boolean") return value ? "True" : "False";
3618
+ return value;
3619
+ };
3620
+ var DEFAULT_STATUS_TAG_COLOR_ORDER = [
3621
+ "success",
3622
+ "warning",
3623
+ "danger",
3624
+ "error",
3625
+ "info",
3626
+ "default"
3627
+ ];
3628
+ var createStatusTagSortComparator = (options = {}) => {
3629
+ const {
3630
+ variantOrder = DEFAULT_STATUS_TAG_COLOR_ORDER,
3631
+ overrides,
3632
+ fallback,
3633
+ getLabel
3634
+ } = options;
3635
+ const variantIndex = (variant) => {
3636
+ const idx = variantOrder.indexOf(variant);
3637
+ return idx === -1 ? variantOrder.length : idx;
3638
+ };
3639
+ const labelOf = (value) => {
3640
+ if (getLabel) return String(getLabel(value) ?? "");
3641
+ if (value == null) return "";
3642
+ return String(getAutoTagDisplayValue(value) ?? "");
3643
+ };
3644
+ return (aVal, bVal) => {
3645
+ const aVariant = getSemanticVariant(aVal, { overrides, fallback });
3646
+ const bVariant = getSemanticVariant(bVal, { overrides, fallback });
3647
+ const diff = variantIndex(aVariant) - variantIndex(bVariant);
3648
+ if (diff !== 0) return diff;
3649
+ return labelOf(aVal).localeCompare(labelOf(bVal));
3650
+ };
3651
+ };
3652
+
3653
+ // src/common-components/AutoTag.js
3654
+ var AutoTag = ({
3655
+ value,
3656
+ tag,
3657
+ children,
3658
+ variant,
3659
+ overrides,
3660
+ fallback,
3661
+ ...props
3662
+ }) => {
3663
+ const resolvedValue = value ?? tag ?? children;
3664
+ const displayValue = children ?? getAutoTagDisplayValue(resolvedValue);
3665
+ const resolvedVariant = variant || getAutoTagVariant(resolvedValue, {
3666
+ overrides,
3667
+ fallback
3668
+ });
3669
+ return React3.createElement(
3670
+ Tag2,
3671
+ { variant: resolvedVariant, ...props },
3672
+ displayValue
3673
+ );
3674
+ };
3675
+
3676
+ // src/common-components/AutoStatusTag.js
3677
+ import React4 from "react";
3678
+ import { StatusTag } from "@hubspot/ui-extensions";
3679
+ var AutoStatusTag = ({
3680
+ value,
3681
+ status,
3682
+ children,
3683
+ variant,
3684
+ overrides,
3685
+ fallback,
3686
+ ...props
3687
+ }) => {
3688
+ const resolvedValue = value ?? status ?? children;
3689
+ const displayValue = children ?? getAutoTagDisplayValue(resolvedValue);
3690
+ const resolvedVariant = variant || getAutoStatusTagVariant(resolvedValue, {
3691
+ overrides,
3692
+ fallback
3693
+ });
3694
+ return React4.createElement(
3695
+ StatusTag,
3696
+ { variant: resolvedVariant, ...props },
3697
+ displayValue
3698
+ );
3699
+ };
3700
+
3701
+ // src/common-components/KeyValueList.js
3702
+ import React5 from "react";
3703
+ import { DescriptionList, DescriptionListItem, Flex as Flex3 } from "@hubspot/ui-extensions";
3704
+
3705
+ // src/common-components/SectionHeader.js
3706
+ import React6 from "react";
3707
+ import { Flex as Flex4, Heading, Text as Text3 } from "@hubspot/ui-extensions";
3485
3708
  export {
3709
+ AutoStatusTag,
3710
+ AutoTag,
3486
3711
  DataTable,
3487
3712
  FormBuilder,
3713
+ createStatusTagSortComparator,
3714
+ getAutoStatusTagVariant,
3715
+ getAutoTagVariant,
3488
3716
  useFormPrefill
3489
3717
  };
package/dist/utils.js ADDED
@@ -0,0 +1,269 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/utils/index.js
20
+ var utils_exports = {};
21
+ __export(utils_exports, {
22
+ buildOptions: () => buildOptions,
23
+ createStatusTagSortComparator: () => createStatusTagSortComparator,
24
+ findOptionLabel: () => findOptionLabel,
25
+ formatCurrency: () => formatCurrency,
26
+ formatDate: () => formatDate,
27
+ formatDateTime: () => formatDateTime,
28
+ formatPercentage: () => formatPercentage,
29
+ getAutoStatusTagVariant: () => getAutoStatusTagVariant,
30
+ getAutoTagDisplayValue: () => getAutoTagDisplayValue,
31
+ getAutoTagVariant: () => getAutoTagVariant,
32
+ isDateTimeValueObject: () => isDateTimeValueObject,
33
+ isDateValueObject: () => isDateValueObject,
34
+ isTimeValueObject: () => isTimeValueObject,
35
+ sumBy: () => sumBy
36
+ });
37
+ module.exports = __toCommonJS(utils_exports);
38
+
39
+ // src/utils/collections.js
40
+ var sumBy = (items, keyOrFn) => (items || []).reduce((total, item) => {
41
+ const value = typeof keyOrFn === "function" ? keyOrFn(item) : item == null ? void 0 : item[keyOrFn];
42
+ return total + Number(value || 0);
43
+ }, 0);
44
+
45
+ // src/utils/formatters.js
46
+ var DEFAULT_LOCALE = "en-US";
47
+ var formatCurrency = (value, { locale = DEFAULT_LOCALE, currency = "USD", maximumFractionDigits = 0, ...options } = {}) => new Intl.NumberFormat(locale, {
48
+ style: "currency",
49
+ currency,
50
+ maximumFractionDigits,
51
+ ...options
52
+ }).format(Number(value || 0));
53
+ var formatDate = (value, { locale = DEFAULT_LOCALE, month = "short", day = "numeric", year = "numeric", ...options } = {}) => {
54
+ if (value == null || value === "") return "";
55
+ const date = value instanceof Date ? value : new Date(value);
56
+ if (Number.isNaN(date.getTime())) return "";
57
+ return date.toLocaleDateString(locale, {
58
+ month,
59
+ day,
60
+ year,
61
+ ...options
62
+ });
63
+ };
64
+ var formatDateTime = (value, {
65
+ locale = DEFAULT_LOCALE,
66
+ month = "short",
67
+ day = "numeric",
68
+ year = "numeric",
69
+ hour = "numeric",
70
+ minute = "2-digit",
71
+ ...options
72
+ } = {}) => {
73
+ if (value == null || value === "") return "";
74
+ const date = value instanceof Date ? value : new Date(value);
75
+ if (Number.isNaN(date.getTime())) return "";
76
+ return date.toLocaleString(locale, {
77
+ month,
78
+ day,
79
+ year,
80
+ hour,
81
+ minute,
82
+ ...options
83
+ });
84
+ };
85
+ var formatPercentage = (value, { locale = DEFAULT_LOCALE, minimumFractionDigits = 0, maximumFractionDigits = 0, ...options } = {}) => new Intl.NumberFormat(locale, {
86
+ style: "percent",
87
+ minimumFractionDigits,
88
+ maximumFractionDigits,
89
+ ...options
90
+ }).format(Number(value || 0));
91
+
92
+ // src/utils/hubspotValues.js
93
+ var isDateValueObject = (value) => Boolean(
94
+ value && typeof value === "object" && typeof value.year === "number" && typeof value.month === "number" && typeof value.date === "number"
95
+ );
96
+ var isTimeValueObject = (value) => Boolean(
97
+ value && typeof value === "object" && typeof value.hours === "number" && typeof value.minutes === "number"
98
+ );
99
+ var isDateTimeValueObject = (value) => Boolean(
100
+ value && typeof value === "object" && (value.date == null || isDateValueObject(value.date)) && (value.time == null || isTimeValueObject(value.time))
101
+ );
102
+
103
+ // src/utils/options.js
104
+ var buildOptions = (items, { labelKey = "label", valueKey = "value", descriptionKey, mapLabel, mapValue, mapDescription } = {}) => (items || []).map((item) => {
105
+ const label = mapLabel ? mapLabel(item) : (item == null ? void 0 : item[labelKey]) ?? item;
106
+ const value = mapValue ? mapValue(item) : (item == null ? void 0 : item[valueKey]) ?? item;
107
+ const description = descriptionKey ? item == null ? void 0 : item[descriptionKey] : void 0;
108
+ const mappedDescription = mapDescription ? mapDescription(item) : description;
109
+ return mappedDescription == null ? { label, value } : { label, value, description: mappedDescription };
110
+ });
111
+ var findOptionLabel = (options, value, fallback = "") => {
112
+ const match = (options || []).find((option) => (option == null ? void 0 : option.value) === value);
113
+ return (match == null ? void 0 : match.label) ?? fallback;
114
+ };
115
+
116
+ // src/utils/tagVariants.js
117
+ var DEFAULT_VARIANT = "default";
118
+ var DANGER_VARIANT = "danger";
119
+ var ERROR_VARIANT = "error";
120
+ var SUCCESS_MATCHERS = [
121
+ "active",
122
+ "success",
123
+ "succeeded",
124
+ "complete",
125
+ "completed",
126
+ "approved",
127
+ "won",
128
+ "healthy",
129
+ "enabled",
130
+ "connected",
131
+ "paid",
132
+ "live",
133
+ "published",
134
+ "available",
135
+ "synced",
136
+ "resolved"
137
+ ];
138
+ var WARNING_MATCHERS = [
139
+ "warning",
140
+ "at risk",
141
+ "risky",
142
+ "pending",
143
+ "paused",
144
+ "pause",
145
+ "on hold",
146
+ "hold",
147
+ "review",
148
+ "expiring",
149
+ "trial",
150
+ "in progress",
151
+ "awaiting",
152
+ "scheduled"
153
+ ];
154
+ var DANGER_MATCHERS = [
155
+ "danger",
156
+ "error",
157
+ "failed",
158
+ "failure",
159
+ "inactive",
160
+ "disabled",
161
+ "blocked",
162
+ "cancelled",
163
+ "canceled",
164
+ "rejected",
165
+ "denied",
166
+ "churned",
167
+ "lost",
168
+ "overdue",
169
+ "expired",
170
+ "offline",
171
+ "deleted",
172
+ "archived",
173
+ "unpaid"
174
+ ];
175
+ var INFO_MATCHERS = [
176
+ "info",
177
+ "new",
178
+ "queued",
179
+ "processing",
180
+ "progress",
181
+ "upcoming",
182
+ "draft",
183
+ "open"
184
+ ];
185
+ var normalizeTagValue = (value) => {
186
+ if (value == null) return "";
187
+ if (typeof value === "boolean") return value ? "true" : "false";
188
+ return String(value).trim().toLowerCase().replace(/[_-]+/g, " ").replace(/\s+/g, " ");
189
+ };
190
+ var matchesAny = (value, matchers) => matchers.some((matcher) => {
191
+ if (value === matcher) return true;
192
+ return ` ${value} `.includes(` ${matcher} `);
193
+ });
194
+ var getSemanticVariant = (value, options = {}) => {
195
+ const normalized = normalizeTagValue(value);
196
+ const fallback = options.fallback || DEFAULT_VARIANT;
197
+ if (!normalized) return fallback;
198
+ if (options.overrides) {
199
+ const overrideKey = Object.keys(options.overrides).find(
200
+ (key) => normalizeTagValue(key) === normalized
201
+ );
202
+ if (overrideKey) return options.overrides[overrideKey];
203
+ }
204
+ if (normalized === "true") return "success";
205
+ if (normalized === "false") return fallback;
206
+ if (matchesAny(normalized, SUCCESS_MATCHERS)) return "success";
207
+ if (matchesAny(normalized, DANGER_MATCHERS)) return DANGER_VARIANT;
208
+ if (matchesAny(normalized, WARNING_MATCHERS)) return "warning";
209
+ if (matchesAny(normalized, INFO_MATCHERS)) return "info";
210
+ return fallback;
211
+ };
212
+ var getAutoTagVariant = (value, options = {}) => {
213
+ const semanticVariant = getSemanticVariant(value, options);
214
+ return semanticVariant === DANGER_VARIANT ? ERROR_VARIANT : semanticVariant;
215
+ };
216
+ var getAutoStatusTagVariant = (value, options = {}) => getSemanticVariant(value, options);
217
+ var getAutoTagDisplayValue = (value) => {
218
+ if (typeof value === "boolean") return value ? "True" : "False";
219
+ return value;
220
+ };
221
+ var DEFAULT_STATUS_TAG_COLOR_ORDER = [
222
+ "success",
223
+ "warning",
224
+ "danger",
225
+ "error",
226
+ "info",
227
+ "default"
228
+ ];
229
+ var createStatusTagSortComparator = (options = {}) => {
230
+ const {
231
+ variantOrder = DEFAULT_STATUS_TAG_COLOR_ORDER,
232
+ overrides,
233
+ fallback,
234
+ getLabel
235
+ } = options;
236
+ const variantIndex = (variant) => {
237
+ const idx = variantOrder.indexOf(variant);
238
+ return idx === -1 ? variantOrder.length : idx;
239
+ };
240
+ const labelOf = (value) => {
241
+ if (getLabel) return String(getLabel(value) ?? "");
242
+ if (value == null) return "";
243
+ return String(getAutoTagDisplayValue(value) ?? "");
244
+ };
245
+ return (aVal, bVal) => {
246
+ const aVariant = getSemanticVariant(aVal, { overrides, fallback });
247
+ const bVariant = getSemanticVariant(bVal, { overrides, fallback });
248
+ const diff = variantIndex(aVariant) - variantIndex(bVariant);
249
+ if (diff !== 0) return diff;
250
+ return labelOf(aVal).localeCompare(labelOf(bVal));
251
+ };
252
+ };
253
+ // Annotate the CommonJS export names for ESM import in node:
254
+ 0 && (module.exports = {
255
+ buildOptions,
256
+ createStatusTagSortComparator,
257
+ findOptionLabel,
258
+ formatCurrency,
259
+ formatDate,
260
+ formatDateTime,
261
+ formatPercentage,
262
+ getAutoStatusTagVariant,
263
+ getAutoTagDisplayValue,
264
+ getAutoTagVariant,
265
+ isDateTimeValueObject,
266
+ isDateValueObject,
267
+ isTimeValueObject,
268
+ sumBy
269
+ });