@l3mpire/ui 2.16.2 → 2.16.4

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/USAGE.md CHANGED
@@ -963,7 +963,7 @@ import {
963
963
 
964
964
  **Advanced filter shortcut:** the PropertySelector footer shows an "Advanced filter · N rule(s)" item. Clicking it closes the property selector and opens the advanced popover directly in its initial empty state — where the user picks the first property inline via a "Where | [Select property ▾]" draft row. When no advanced filters exist yet, clicking this shortcut makes the AdvancedChip appear with the popover already open; closing without adding a filter removes the chip automatically.
965
965
 
966
- **Dynamic options ("Me", "Unassigned", …):** enum/tags/relation properties accept a `dynamicOptions` array. Each entry is `{ value, label, description?, icon? }` and is rendered at the top of the SingleSelect / MultiSelect dropdown with a divider separating it from the regular options. The `value` is a sentinel string stored on `FilterCondition.value` — the DS only renders, the consuming app resolves it at query time (e.g. `"__me__"` → `currentUser.id`). This keeps session/business logic out of the DS while still getting a consistent visual treatment.
966
+ **Dynamic options ("Me", "Unassigned", …):** enum/tags/relation properties accept a `dynamicOptions` array. Each entry is `{ value, label, description? }` and is rendered inline with regular options in the SingleSelect / MultiSelect dropdown. The `value` is a sentinel string stored on `FilterCondition.value` — the DS renders the `label` in the filter chip (not the raw sentinel) and the consuming app resolves it at query time (e.g. `"__me__"` → `currentUser.id`). This keeps session/business logic out of the DS while still getting a consistent visual treatment.
967
967
 
968
968
  ```tsx
969
969
  {
@@ -979,9 +979,8 @@ import {
979
979
  value: "__me__",
980
980
  label: "Me",
981
981
  description: "This value is dynamically applied to the current user",
982
- icon: faBoltOutline,
983
982
  },
984
- { value: "__deactivated__", label: "All deactivated and removed owners", icon: faBoltOutline },
983
+ { value: "__deactivated__", label: "All deactivated and removed owners" },
985
984
  ],
986
985
  }
987
986
  ```
@@ -993,7 +992,7 @@ import {
993
992
  | `createFilterWithDefaults(propertyId, type)` | Creates FilterCondition with default operator |
994
993
  | `isNoValueOperator(op)` | True for is empty / is not empty / is true / is false |
995
994
  | `getValueInputType(type, op)` | Returns the input component name for a type+operator combo |
996
- | `formatFilterValue(value)` | Stringifies a `FilterValue` for display (handles Date, ranges, arrays, booleans) |
995
+ | `formatFilterValue(value, dynamicOptions?)` | Stringifies a `FilterValue` for display resolves sentinel values via `dynamicOptions` labels |
997
996
  | `getBadgeCount(value)` | Returns `+N` count for multi-value selections, `undefined` otherwise |
998
997
  | `createEmptyGroup()` / `isFilterGroup(node)` | Tree helpers for nested groups |
999
998
  | `wrapInGroup(condition)` / `unwrapGroup(group)` | Convert between condition and single-child group |
package/dist/index.d.mts CHANGED
@@ -168,6 +168,7 @@ interface AvatarProps extends React.ComponentPropsWithoutRef<typeof AvatarPrimit
168
168
  alt?: string;
169
169
  initials?: string;
170
170
  badge?: React.ReactNode;
171
+ /** `"rounded"` (circle) for people/users, `"squared"` for companies/orgs. */
171
172
  shape?: "rounded" | "squared";
172
173
  }
173
174
  declare const Avatar: React.ForwardRefExoticComponent<AvatarProps & React.RefAttributes<HTMLSpanElement>>;
@@ -715,16 +716,14 @@ type OperatorType = TextOperator | NumberOperator | DateOperator | EnumOperator
715
716
  * (e.g. "Me", "My team", "Unassigned"). The value is a sentinel string that
716
717
  * the consuming app resolves at query time (e.g. `__me__` → `currentUser.id`).
717
718
  *
718
- * The design system only handles the rendering (icon + label + description +
719
- * divider above the regular options). Resolving the sentinels is an app
720
- * concern.
719
+ * The design system renders label + optional description inline with regular
720
+ * options. Resolving the sentinels is an app concern.
721
721
  */
722
722
  interface DynamicOption {
723
723
  /** Sentinel value stored on FilterCondition.value (e.g. "__me__"). */
724
724
  value: string;
725
725
  label: string;
726
726
  description?: string;
727
- icon?: _l3mpire_icons.IconDefinition;
728
727
  }
729
728
  interface PropertyDefinition {
730
729
  id: string;
package/dist/index.d.ts CHANGED
@@ -168,6 +168,7 @@ interface AvatarProps extends React.ComponentPropsWithoutRef<typeof AvatarPrimit
168
168
  alt?: string;
169
169
  initials?: string;
170
170
  badge?: React.ReactNode;
171
+ /** `"rounded"` (circle) for people/users, `"squared"` for companies/orgs. */
171
172
  shape?: "rounded" | "squared";
172
173
  }
173
174
  declare const Avatar: React.ForwardRefExoticComponent<AvatarProps & React.RefAttributes<HTMLSpanElement>>;
@@ -715,16 +716,14 @@ type OperatorType = TextOperator | NumberOperator | DateOperator | EnumOperator
715
716
  * (e.g. "Me", "My team", "Unassigned"). The value is a sentinel string that
716
717
  * the consuming app resolves at query time (e.g. `__me__` → `currentUser.id`).
717
718
  *
718
- * The design system only handles the rendering (icon + label + description +
719
- * divider above the regular options). Resolving the sentinels is an app
720
- * concern.
719
+ * The design system renders label + optional description inline with regular
720
+ * options. Resolving the sentinels is an app concern.
721
721
  */
722
722
  interface DynamicOption {
723
723
  /** Sentinel value stored on FilterCondition.value (e.g. "__me__"). */
724
724
  value: string;
725
725
  label: string;
726
726
  description?: string;
727
- icon?: _l3mpire_icons.IconDefinition;
728
727
  }
729
728
  interface PropertyDefinition {
730
729
  id: string;
package/dist/index.js CHANGED
@@ -5360,7 +5360,7 @@ function getValueInputType(type, operator) {
5360
5360
  return ["is any of", "is none of"].includes(operator) ? "MultiRelationPicker" : "RelationPicker";
5361
5361
  return null;
5362
5362
  }
5363
- function formatFilterValue(value) {
5363
+ function formatFilterValue(value, dynamicOptions) {
5364
5364
  if (value == null) return void 0;
5365
5365
  if (typeof value === "boolean") return value ? "Yes" : "No";
5366
5366
  if (value instanceof Date) {
@@ -5379,9 +5379,17 @@ function formatFilterValue(value) {
5379
5379
  const fmt = (d) => d.toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric" });
5380
5380
  return `${fmt(value[0])} \u2013 ${value[1] instanceof Date ? fmt(value[1]) : "\u2026"}`;
5381
5381
  }
5382
- return String(value[0]);
5382
+ const resolved = resolveDynamic(String(value[0]), dynamicOptions);
5383
+ return resolved;
5383
5384
  }
5384
- return String(value);
5385
+ return resolveDynamic(String(value), dynamicOptions);
5386
+ }
5387
+ function resolveDynamic(raw, dynamicOptions) {
5388
+ if (dynamicOptions) {
5389
+ const match = dynamicOptions.find((o) => o.value === raw);
5390
+ if (match) return match.label;
5391
+ }
5392
+ return raw;
5385
5393
  }
5386
5394
  function getBadgeCount(value) {
5387
5395
  if (Array.isArray(value) && value.length > 1 && typeof value[0] === "string") {
@@ -6606,7 +6614,6 @@ var PresetTagsValueInput = ({
6606
6614
  PresetTagsValueInput.displayName = "PresetTagsValueInput";
6607
6615
 
6608
6616
  // src/components/ui/filter/value-inputs/select-value-input.tsx
6609
- var import_icons29 = require("@l3mpire/icons");
6610
6617
  var import_jsx_runtime47 = require("react/jsx-runtime");
6611
6618
  var DynamicOptionRow = ({
6612
6619
  option,
@@ -6643,14 +6650,6 @@ var DynamicOptionRow = ({
6643
6650
  ) })
6644
6651
  }
6645
6652
  ),
6646
- option.icon && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
6647
- import_icons29.Icon,
6648
- {
6649
- icon: option.icon,
6650
- size: "sm",
6651
- className: "shrink-0 mt-[1px] text-[var(--color-interactive-text-primary-dark-default,var(--color-primary))]"
6652
- }
6653
- ),
6654
6653
  /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("span", { className: "flex-1 flex flex-col gap-2xs min-w-0", children: [
6655
6654
  /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "text-sm font-regular leading-sm text-[var(--color-foreground)] truncate", children: option.label }),
6656
6655
  option.description && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "text-xs font-regular leading-xs text-[var(--color-muted-foreground)]", children: option.description })
@@ -6658,7 +6657,6 @@ var DynamicOptionRow = ({
6658
6657
  ]
6659
6658
  }
6660
6659
  );
6661
- var DynamicOptionsDivider = () => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "h-px bg-[var(--color-dropdown-border)] mx-xs my-xs" });
6662
6660
  var SingleSelectValueInput = ({
6663
6661
  value,
6664
6662
  onChange,
@@ -6689,7 +6687,6 @@ var SingleSelectValueInput = ({
6689
6687
  },
6690
6688
  opt.value
6691
6689
  )),
6692
- dynamicOptions && dynamicOptions.length > 0 && options.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(DynamicOptionsDivider, {}),
6693
6690
  options.map((opt) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
6694
6691
  "button",
6695
6692
  {
@@ -6876,7 +6873,7 @@ ValueInput.displayName = "ValueInput";
6876
6873
  // src/components/ui/filter/property-selector.tsx
6877
6874
  var React44 = __toESM(require("react"));
6878
6875
  var PopoverPrimitive6 = __toESM(require("@radix-ui/react-popover"));
6879
- var import_icons30 = require("@l3mpire/icons");
6876
+ var import_icons29 = require("@l3mpire/icons");
6880
6877
  var import_jsx_runtime50 = require("react/jsx-runtime");
6881
6878
  var AdvancedFilterFooter = ({ onClick, count }) => /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_jsx_runtime50.Fragment, { children: [
6882
6879
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { className: "h-px bg-[var(--color-dropdown-border)] mx-xs" }),
@@ -6889,9 +6886,9 @@ var AdvancedFilterFooter = ({ onClick, count }) => /* @__PURE__ */ (0, import_js
6889
6886
  className: "flex items-center gap-base p-base rounded-base cursor-pointer transition-colors hover:bg-[var(--color-dropdown-item-hover)]",
6890
6887
  children: [
6891
6888
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
6892
- import_icons30.Icon,
6889
+ import_icons29.Icon,
6893
6890
  {
6894
- icon: import_icons30.faFilterOutline,
6891
+ icon: import_icons29.faFilterOutline,
6895
6892
  size: "sm",
6896
6893
  className: "shrink-0 text-[var(--color-dropdown-item-icon)]"
6897
6894
  }
@@ -6991,9 +6988,9 @@ var PropertySelector = ({
6991
6988
  /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("div", { className: "flex flex-col gap-xs", children: [
6992
6989
  /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("div", { className: "flex items-center gap-base px-md py-base border border-[var(--color-input)] rounded-md", children: [
6993
6990
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
6994
- import_icons30.Icon,
6991
+ import_icons29.Icon,
6995
6992
  {
6996
- icon: import_icons30.faMagnifyingGlassOutline,
6993
+ icon: import_icons29.faMagnifyingGlassOutline,
6997
6994
  size: "sm",
6998
6995
  className: "shrink-0 text-[var(--color-muted-foreground)]"
6999
6996
  }
@@ -7023,7 +7020,7 @@ var PropertySelector = ({
7023
7020
  className: "flex items-center gap-base p-base rounded-base cursor-pointer transition-colors hover:bg-[var(--color-dropdown-item-hover)]",
7024
7021
  children: [
7025
7022
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
7026
- import_icons30.Icon,
7023
+ import_icons29.Icon,
7027
7024
  {
7028
7025
  icon: prop.icon,
7029
7026
  size: "sm",
@@ -7050,7 +7047,7 @@ var PropertySelector = ({
7050
7047
  className: "flex items-center gap-base p-base rounded-base cursor-pointer transition-colors hover:bg-[var(--color-dropdown-item-hover)]",
7051
7048
  children: [
7052
7049
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
7053
- import_icons30.Icon,
7050
+ import_icons29.Icon,
7054
7051
  {
7055
7052
  icon: g.groupIcon,
7056
7053
  size: "sm",
@@ -7060,9 +7057,9 @@ var PropertySelector = ({
7060
7057
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("span", { className: "flex-1 text-sm font-regular leading-sm text-[var(--color-dropdown-item-text)] text-left truncate", children: g.groupLabel }),
7061
7058
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("span", { className: "text-xs font-semibold leading-xs text-[var(--color-muted-foreground)]", children: g.count }),
7062
7059
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
7063
- import_icons30.Icon,
7060
+ import_icons29.Icon,
7064
7061
  {
7065
- icon: import_icons30.faChevronRightOutline,
7062
+ icon: import_icons29.faChevronRightOutline,
7066
7063
  size: "xs",
7067
7064
  className: "shrink-0 text-[var(--color-dropdown-item-icon)]"
7068
7065
  }
@@ -7089,9 +7086,9 @@ var PropertySelector = ({
7089
7086
  className: "flex items-center gap-base p-base rounded-base cursor-pointer transition-colors hover:bg-[var(--color-dropdown-item-hover)]",
7090
7087
  children: [
7091
7088
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
7092
- import_icons30.Icon,
7089
+ import_icons29.Icon,
7093
7090
  {
7094
- icon: import_icons30.faChevronLeftOutline,
7091
+ icon: import_icons29.faChevronLeftOutline,
7095
7092
  size: "sm",
7096
7093
  className: "shrink-0 text-[var(--color-dropdown-item-icon)]"
7097
7094
  }
@@ -7102,9 +7099,9 @@ var PropertySelector = ({
7102
7099
  ),
7103
7100
  /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("div", { className: "flex items-center gap-base px-md py-base border border-[var(--color-input)] rounded-md", children: [
7104
7101
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
7105
- import_icons30.Icon,
7102
+ import_icons29.Icon,
7106
7103
  {
7107
- icon: import_icons30.faMagnifyingGlassOutline,
7104
+ icon: import_icons29.faMagnifyingGlassOutline,
7108
7105
  size: "sm",
7109
7106
  className: "shrink-0 text-[var(--color-muted-foreground)]"
7110
7107
  }
@@ -7133,7 +7130,7 @@ var PropertySelector = ({
7133
7130
  className: "flex items-center gap-base p-base rounded-base cursor-pointer transition-colors hover:bg-[var(--color-dropdown-item-hover)]",
7134
7131
  children: [
7135
7132
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
7136
- import_icons30.Icon,
7133
+ import_icons29.Icon,
7137
7134
  {
7138
7135
  icon: prop.icon,
7139
7136
  size: "sm",
@@ -7165,7 +7162,7 @@ PropertySelector.displayName = "PropertySelector";
7165
7162
 
7166
7163
  // src/components/ui/filter/kebab-menu.tsx
7167
7164
  var PopoverPrimitive7 = __toESM(require("@radix-ui/react-popover"));
7168
- var import_icons31 = require("@l3mpire/icons");
7165
+ var import_icons30 = require("@l3mpire/icons");
7169
7166
  var import_jsx_runtime51 = require("react/jsx-runtime");
7170
7167
  var KebabMenu = ({
7171
7168
  onConvertToAdvanced,
@@ -7200,9 +7197,9 @@ var KebabMenu = ({
7200
7197
  className: "flex items-center gap-base p-base rounded-base cursor-pointer transition-colors hover:bg-[var(--color-dropdown-item-hover)]",
7201
7198
  children: [
7202
7199
  /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
7203
- import_icons31.Icon,
7200
+ import_icons30.Icon,
7204
7201
  {
7205
- icon: import_icons31.faArrowRightOutline,
7202
+ icon: import_icons30.faArrowRightOutline,
7206
7203
  size: "sm",
7207
7204
  className: "shrink-0 text-[var(--color-dropdown-item-icon)]"
7208
7205
  }
@@ -7223,9 +7220,9 @@ var KebabMenu = ({
7223
7220
  className: "flex items-center gap-base p-base rounded-base cursor-pointer transition-colors hover:bg-[var(--color-dropdown-item-hover)]",
7224
7221
  children: [
7225
7222
  /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
7226
- import_icons31.Icon,
7223
+ import_icons30.Icon,
7227
7224
  {
7228
- icon: import_icons31.faTrashOutline,
7225
+ icon: import_icons30.faTrashOutline,
7229
7226
  size: "sm",
7230
7227
  className: "shrink-0 text-[var(--color-destructive)]"
7231
7228
  }
@@ -7243,7 +7240,7 @@ KebabMenu.displayName = "KebabMenu";
7243
7240
  // src/components/ui/filter/filter-editor.tsx
7244
7241
  var React45 = __toESM(require("react"));
7245
7242
  var PopoverPrimitive8 = __toESM(require("@radix-ui/react-popover"));
7246
- var import_icons32 = require("@l3mpire/icons");
7243
+ var import_icons31 = require("@l3mpire/icons");
7247
7244
  var import_jsx_runtime52 = require("react/jsx-runtime");
7248
7245
  var FilterEditor = ({
7249
7246
  propertyDef,
@@ -7307,7 +7304,7 @@ var FilterEditor = ({
7307
7304
  children: [
7308
7305
  /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("div", { className: "flex items-center gap-base px-base pt-base pb-xs border-b border-[var(--color-border)]", children: [
7309
7306
  /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
7310
- import_icons32.Icon,
7307
+ import_icons31.Icon,
7311
7308
  {
7312
7309
  icon: propertyDef.icon,
7313
7310
  size: "sm",
@@ -7434,7 +7431,7 @@ var InteractiveFilterChip = ({
7434
7431
  setValueOpen(false);
7435
7432
  };
7436
7433
  const hasOperator = !!condition.operator;
7437
- const displayValue = formatFilterValue(condition.value);
7434
+ const displayValue = formatFilterValue(condition.value, propertyDef.dynamicOptions);
7438
7435
  const hasValue = hasOperator && displayValue != null;
7439
7436
  const badgeCount = getBadgeCount(condition.value);
7440
7437
  return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(
@@ -7570,11 +7567,11 @@ InteractiveFilterChip.displayName = "InteractiveFilterChip";
7570
7567
 
7571
7568
  // src/components/ui/filter/filter-system.tsx
7572
7569
  var React54 = __toESM(require("react"));
7573
- var import_icons39 = require("@l3mpire/icons");
7570
+ var import_icons38 = require("@l3mpire/icons");
7574
7571
 
7575
7572
  // src/components/ui/filter/advanced-chip.tsx
7576
7573
  var React47 = __toESM(require("react"));
7577
- var import_icons33 = require("@l3mpire/icons");
7574
+ var import_icons32 = require("@l3mpire/icons");
7578
7575
  var import_jsx_runtime54 = require("react/jsx-runtime");
7579
7576
  var btnBase = [
7580
7577
  "flex items-center justify-center",
@@ -7600,9 +7597,9 @@ var AdvancedChip = React47.forwardRef(
7600
7597
  ...props,
7601
7598
  children: [
7602
7599
  /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
7603
- import_icons33.Icon,
7600
+ import_icons32.Icon,
7604
7601
  {
7605
- icon: import_icons33.faFilterOutline,
7602
+ icon: import_icons32.faFilterOutline,
7606
7603
  size: "sm",
7607
7604
  className: "shrink-0 text-[var(--color-foreground)]"
7608
7605
  }
@@ -7626,7 +7623,7 @@ var AdvancedChip = React47.forwardRef(
7626
7623
  "rounded-r-md -ml-px"
7627
7624
  ),
7628
7625
  "aria-label": "Clear all advanced filters",
7629
- children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_icons33.Icon, { icon: import_icons33.faXmarkOutline, size: "sm", className: "text-[var(--color-foreground)]" })
7626
+ children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_icons32.Icon, { icon: import_icons32.faXmarkOutline, size: "sm", className: "text-[var(--color-foreground)]" })
7630
7627
  }
7631
7628
  )
7632
7629
  ] })
@@ -7636,17 +7633,17 @@ AdvancedChip.displayName = "AdvancedChip";
7636
7633
  // src/components/ui/filter/advanced-popover.tsx
7637
7634
  var React51 = __toESM(require("react"));
7638
7635
  var PopoverPrimitive12 = __toESM(require("@radix-ui/react-popover"));
7639
- var import_icons37 = require("@l3mpire/icons");
7636
+ var import_icons36 = require("@l3mpire/icons");
7640
7637
 
7641
7638
  // src/components/ui/filter/advanced-row.tsx
7642
7639
  var React49 = __toESM(require("react"));
7643
7640
  var PopoverPrimitive11 = __toESM(require("@radix-ui/react-popover"));
7644
- var import_icons35 = require("@l3mpire/icons");
7641
+ var import_icons34 = require("@l3mpire/icons");
7645
7642
 
7646
7643
  // src/components/ui/filter/filter-node-actions.tsx
7647
7644
  var React48 = __toESM(require("react"));
7648
7645
  var PopoverPrimitive10 = __toESM(require("@radix-ui/react-popover"));
7649
- var import_icons34 = require("@l3mpire/icons");
7646
+ var import_icons33 = require("@l3mpire/icons");
7650
7647
  var import_jsx_runtime55 = require("react/jsx-runtime");
7651
7648
  var FilterNodeActions = ({
7652
7649
  nodeType,
@@ -7658,17 +7655,17 @@ var FilterNodeActions = ({
7658
7655
  const items = [
7659
7656
  {
7660
7657
  label: "Duplicate",
7661
- icon: import_icons34.faCopyOutline,
7658
+ icon: import_icons33.faCopyOutline,
7662
7659
  action: onDuplicate
7663
7660
  },
7664
7661
  {
7665
7662
  label: nodeType === "condition" ? "Turn into group" : "Turn into filter",
7666
- icon: nodeType === "condition" ? import_icons34.faFolderOutline : import_icons34.faFilterOutline,
7663
+ icon: nodeType === "condition" ? import_icons33.faFolderOutline : import_icons33.faFilterOutline,
7667
7664
  action: onConvert
7668
7665
  },
7669
7666
  {
7670
7667
  label: "Delete",
7671
- icon: import_icons34.faTrashOutline,
7668
+ icon: import_icons33.faTrashOutline,
7672
7669
  action: onDelete,
7673
7670
  destructive: true
7674
7671
  }
@@ -7681,9 +7678,9 @@ var FilterNodeActions = ({
7681
7678
  className: "shrink-0 flex items-center justify-center p-sm rounded-md cursor-pointer transition-colors hover:bg-[var(--color-accent)]",
7682
7679
  "aria-label": "More actions",
7683
7680
  children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
7684
- import_icons34.Icon,
7681
+ import_icons33.Icon,
7685
7682
  {
7686
- icon: import_icons34.faEllipsisOutline,
7683
+ icon: import_icons33.faEllipsisOutline,
7687
7684
  size: "sm",
7688
7685
  className: "text-[var(--color-foreground)]"
7689
7686
  }
@@ -7717,7 +7714,7 @@ var FilterNodeActions = ({
7717
7714
  ),
7718
7715
  children: [
7719
7716
  /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
7720
- import_icons34.Icon,
7717
+ import_icons33.Icon,
7721
7718
  {
7722
7719
  icon: item.icon,
7723
7720
  size: "sm",
@@ -7784,7 +7781,7 @@ var AdvancedRow = ({
7784
7781
  const handleValueChange = (val) => {
7785
7782
  onUpdate({ ...condition, value: val });
7786
7783
  };
7787
- const displayValue = formatFilterValue(condition.value);
7784
+ const displayValue = formatFilterValue(condition.value, propertyDef.dynamicOptions);
7788
7785
  const badgeCount = getBadgeCount(condition.value);
7789
7786
  const hasValue = displayValue != null;
7790
7787
  return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { className: "flex items-center gap-base w-full min-w-0", children: [
@@ -7803,15 +7800,15 @@ var AdvancedRow = ({
7803
7800
  ),
7804
7801
  children: [
7805
7802
  connector,
7806
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_icons35.Icon, { icon: import_icons35.faRefreshOutline, size: "xs", className: "text-[var(--color-foreground)]" })
7803
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_icons34.Icon, { icon: import_icons34.faRefreshOutline, size: "xs", className: "text-[var(--color-foreground)]" })
7807
7804
  ]
7808
7805
  }
7809
7806
  ),
7810
7807
  /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(PopoverPrimitive11.Root, { open: propertyOpen, onOpenChange: setPropertyOpen, children: [
7811
7808
  /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(PopoverPrimitive11.Trigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("button", { type: "button", className: cn(selectBtnStyle, "min-w-0"), children: [
7812
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_icons35.Icon, { icon: propertyDef.icon, size: "sm", className: "shrink-0 text-[var(--color-muted-foreground)]" }),
7809
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_icons34.Icon, { icon: propertyDef.icon, size: "sm", className: "shrink-0 text-[var(--color-muted-foreground)]" }),
7813
7810
  /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "text-sm font-regular leading-sm text-[var(--color-foreground)] whitespace-nowrap truncate", children: propertyDef.label }),
7814
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_icons35.Icon, { icon: import_icons35.faChevronDownOutline, size: "xs", className: "shrink-0 text-[var(--color-foreground)]" })
7811
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_icons34.Icon, { icon: import_icons34.faChevronDownOutline, size: "xs", className: "shrink-0 text-[var(--color-foreground)]" })
7815
7812
  ] }) }),
7816
7813
  /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(PopoverPrimitive11.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
7817
7814
  PopoverPrimitive11.Content,
@@ -7839,7 +7836,7 @@ var AdvancedRow = ({
7839
7836
  p.id === condition.propertyId && "bg-[var(--color-dropdown-item-hover)]"
7840
7837
  ),
7841
7838
  children: [
7842
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_icons35.Icon, { icon: p.icon, size: "sm", className: "shrink-0 text-[var(--color-dropdown-item-icon)]" }),
7839
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_icons34.Icon, { icon: p.icon, size: "sm", className: "shrink-0 text-[var(--color-dropdown-item-icon)]" }),
7843
7840
  /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "text-sm font-regular leading-sm text-[var(--color-dropdown-item-text)] truncate", children: p.label })
7844
7841
  ]
7845
7842
  },
@@ -7851,7 +7848,7 @@ var AdvancedRow = ({
7851
7848
  /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(PopoverPrimitive11.Root, { open: operatorOpen, onOpenChange: setOperatorOpen, children: [
7852
7849
  /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(PopoverPrimitive11.Trigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("button", { type: "button", className: cn(selectBtnStyle, "min-w-0"), children: [
7853
7850
  /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "text-sm font-regular leading-sm text-[var(--color-foreground)] whitespace-nowrap truncate text-left", children: condition.operator ?? "Select" }),
7854
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_icons35.Icon, { icon: import_icons35.faChevronDownOutline, size: "xs", className: "shrink-0 text-[var(--color-foreground)]" })
7851
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_icons34.Icon, { icon: import_icons34.faChevronDownOutline, size: "xs", className: "shrink-0 text-[var(--color-foreground)]" })
7855
7852
  ] }) }),
7856
7853
  /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(PopoverPrimitive11.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
7857
7854
  PopoverPrimitive11.Content,
@@ -7902,9 +7899,9 @@ var AdvancedRow = ({
7902
7899
  badgeCount - 1
7903
7900
  ] }),
7904
7901
  /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
7905
- import_icons35.Icon,
7902
+ import_icons34.Icon,
7906
7903
  {
7907
- icon: import_icons35.faChevronDownOutline,
7904
+ icon: import_icons34.faChevronDownOutline,
7908
7905
  size: "xs",
7909
7906
  className: "text-[var(--color-foreground)]"
7910
7907
  }
@@ -7958,7 +7955,7 @@ AdvancedRow.displayName = "AdvancedRow";
7958
7955
 
7959
7956
  // src/components/ui/filter/advanced-group.tsx
7960
7957
  var React50 = __toESM(require("react"));
7961
- var import_icons36 = require("@l3mpire/icons");
7958
+ var import_icons35 = require("@l3mpire/icons");
7962
7959
  var import_jsx_runtime57 = require("react/jsx-runtime");
7963
7960
  var AdvancedGroup = ({
7964
7961
  connector,
@@ -7987,7 +7984,7 @@ var AdvancedGroup = ({
7987
7984
  ),
7988
7985
  children: [
7989
7986
  connector,
7990
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_icons36.Icon, { icon: import_icons36.faRefreshOutline, size: "xs", className: "text-[var(--color-foreground)]" })
7987
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_icons35.Icon, { icon: import_icons35.faRefreshOutline, size: "xs", className: "text-[var(--color-foreground)]" })
7991
7988
  ]
7992
7989
  }
7993
7990
  ) }),
@@ -8009,7 +8006,7 @@ var AdvancedGroup = ({
8009
8006
  type: "button",
8010
8007
  className: "flex items-center gap-sm px-base py-sm text-sm font-semibold leading-sm text-[var(--color-muted-foreground)] cursor-pointer transition-colors rounded-md hover:bg-[var(--color-accent)] hover:text-[var(--color-foreground)] w-fit",
8011
8008
  children: [
8012
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_icons36.Icon, { icon: import_icons36.faPlusOutline, size: "sm" }),
8009
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_icons35.Icon, { icon: import_icons35.faPlusOutline, size: "sm" }),
8013
8010
  "Add filter"
8014
8011
  ]
8015
8012
  }
@@ -8229,7 +8226,7 @@ var AdvancedPopover = ({
8229
8226
  open: addSelectorOpen,
8230
8227
  onOpenChange: setAddSelectorOpen,
8231
8228
  children: /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("button", { type: "button", className: cn(ghostBtn, "text-[var(--color-foreground)]"), children: [
8232
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_icons37.Icon, { icon: import_icons37.faPlusOutline, size: "sm", className: "text-[var(--color-foreground)]" }),
8229
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_icons36.Icon, { icon: import_icons36.faPlusOutline, size: "sm", className: "text-[var(--color-foreground)]" }),
8233
8230
  "Add filter"
8234
8231
  ] })
8235
8232
  }
@@ -8241,7 +8238,7 @@ var AdvancedPopover = ({
8241
8238
  onClick: handleAddGroup,
8242
8239
  className: cn(ghostBtn, "text-[var(--color-foreground)]"),
8243
8240
  children: [
8244
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_icons37.Icon, { icon: import_icons37.faPlusOutline, size: "sm", className: "text-[var(--color-foreground)]" }),
8241
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_icons36.Icon, { icon: import_icons36.faPlusOutline, size: "sm", className: "text-[var(--color-foreground)]" }),
8245
8242
  "Add filters group"
8246
8243
  ]
8247
8244
  }
@@ -8254,7 +8251,7 @@ var AdvancedPopover = ({
8254
8251
  onClick: handleClearAll,
8255
8252
  className: cn(ghostBtn, "text-[var(--color-destructive,#ef4444)]"),
8256
8253
  children: [
8257
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_icons37.Icon, { icon: import_icons37.faXmarkOutline, size: "sm", className: "text-[var(--color-destructive,#ef4444)]" }),
8254
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_icons36.Icon, { icon: import_icons36.faXmarkOutline, size: "sm", className: "text-[var(--color-destructive,#ef4444)]" }),
8258
8255
  "Clear filters"
8259
8256
  ]
8260
8257
  }
@@ -8305,9 +8302,9 @@ var DraftRow = ({
8305
8302
  children: [
8306
8303
  /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { className: "text-sm font-regular leading-sm text-[var(--color-muted-foreground)] whitespace-nowrap", children: "Select property" }),
8307
8304
  /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
8308
- import_icons37.Icon,
8305
+ import_icons36.Icon,
8309
8306
  {
8310
- icon: import_icons37.faChevronDownOutline,
8307
+ icon: import_icons36.faChevronDownOutline,
8311
8308
  size: "xs",
8312
8309
  className: "shrink-0 text-[var(--color-foreground)]"
8313
8310
  }
@@ -8323,7 +8320,7 @@ var DraftRow = ({
8323
8320
  // src/components/ui/filter/summary-chip.tsx
8324
8321
  var React52 = __toESM(require("react"));
8325
8322
  var PopoverPrimitive13 = __toESM(require("@radix-ui/react-popover"));
8326
- var import_icons38 = require("@l3mpire/icons");
8323
+ var import_icons37 = require("@l3mpire/icons");
8327
8324
  var import_jsx_runtime59 = require("react/jsx-runtime");
8328
8325
  var ghostBtn2 = [
8329
8326
  "flex items-center gap-sm px-base py-sm",
@@ -8501,7 +8498,7 @@ var SummaryChip = ({
8501
8498
  className
8502
8499
  ),
8503
8500
  children: [
8504
- /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_icons38.Icon, { icon: import_icons38.faFilterOutline, size: "sm", className: "shrink-0 text-[var(--color-foreground)]" }),
8501
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_icons37.Icon, { icon: import_icons37.faFilterOutline, size: "sm", className: "shrink-0 text-[var(--color-foreground)]" }),
8505
8502
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { className: "text-sm font-semibold leading-sm whitespace-nowrap text-[var(--color-foreground)]", children: "Filters" }),
8506
8503
  count > 0 && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { className: "flex items-center p-2xs rounded-xs bg-filter-chip-badge-bg", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { className: "text-[10px] font-semibold leading-2xs text-filter-chip-badge-text", children: count }) })
8507
8504
  ]
@@ -8542,13 +8539,13 @@ var SummaryChip = ({
8542
8539
  open: addSelectorOpen,
8543
8540
  onOpenChange: setAddSelectorOpen,
8544
8541
  children: /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("button", { type: "button", className: cn(ghostBtn2, "text-[var(--color-foreground)]"), children: [
8545
- /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_icons38.Icon, { icon: import_icons38.faPlusOutline, size: "sm", className: "text-[var(--color-foreground)]" }),
8542
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_icons37.Icon, { icon: import_icons37.faPlusOutline, size: "sm", className: "text-[var(--color-foreground)]" }),
8546
8543
  "Add filter"
8547
8544
  ] })
8548
8545
  }
8549
8546
  ),
8550
8547
  /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("button", { type: "button", onClick: handleAddGroup, className: cn(ghostBtn2, "text-[var(--color-foreground)]"), children: [
8551
- /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_icons38.Icon, { icon: import_icons38.faPlusOutline, size: "sm", className: "text-[var(--color-foreground)]" }),
8548
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_icons37.Icon, { icon: import_icons37.faPlusOutline, size: "sm", className: "text-[var(--color-foreground)]" }),
8552
8549
  "Add filters group"
8553
8550
  ] })
8554
8551
  ] }),
@@ -8562,7 +8559,7 @@ var SummaryChip = ({
8562
8559
  },
8563
8560
  className: cn(ghostBtn2, "text-[var(--color-destructive,#ef4444)]"),
8564
8561
  children: [
8565
- /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_icons38.Icon, { icon: import_icons38.faXmarkOutline, size: "sm", className: "text-[var(--color-destructive,#ef4444)]" }),
8562
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_icons37.Icon, { icon: import_icons37.faXmarkOutline, size: "sm", className: "text-[var(--color-destructive,#ef4444)]" }),
8566
8563
  "Clear filters"
8567
8564
  ]
8568
8565
  }
@@ -8599,7 +8596,7 @@ var DraftRow2 = ({ properties, onSelect, open: openProp, onOpenChange }) => {
8599
8596
  ),
8600
8597
  children: [
8601
8598
  /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { className: "text-sm font-regular leading-sm text-[var(--color-muted-foreground)] whitespace-nowrap", children: "Select property" }),
8602
- /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_icons38.Icon, { icon: import_icons38.faChevronDownOutline, size: "xs", className: "shrink-0 text-[var(--color-foreground)]" })
8599
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_icons37.Icon, { icon: import_icons37.faChevronDownOutline, size: "xs", className: "shrink-0 text-[var(--color-foreground)]" })
8603
8600
  ]
8604
8601
  }
8605
8602
  ) })
@@ -8828,7 +8825,7 @@ var FilterSystem = ({
8828
8825
  {
8829
8826
  type: "button",
8830
8827
  className: "shrink-0 inline-flex items-center justify-center size-8 rounded-md border border-[var(--color-btn-outlined-neutral-border-default)] bg-gradient-to-t from-[var(--color-btn-outlined-neutral-bg-default)] from-[10%] to-[var(--color-btn-outlined-neutral-bg-gradient-to-default)] shadow-sm cursor-pointer transition-colors hover:from-[var(--color-btn-outlined-neutral-bg-hover)] hover:to-[var(--color-btn-outlined-neutral-bg-gradient-to-hover)]",
8831
- children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_icons39.Icon, { icon: import_icons39.faPlusOutline, size: "sm", className: "text-[var(--color-foreground)]" })
8828
+ children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_icons38.Icon, { icon: import_icons38.faPlusOutline, size: "sm", className: "text-[var(--color-foreground)]" })
8832
8829
  }
8833
8830
  ) : /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(FilterBarButton, {})
8834
8831
  }
@@ -8841,7 +8838,7 @@ var FilterSystem = ({
8841
8838
  type: "button",
8842
8839
  onClick: handleClearAll,
8843
8840
  className: "shrink-0 flex items-center gap-sm px-base py-sm min-h-[32px] max-h-[32px] rounded-md cursor-pointer transition-colors hover:bg-[var(--color-accent)]",
8844
- children: isMinimal ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_icons39.Icon, { icon: import_icons39.faXmarkOutline, size: "sm", className: "text-[var(--color-foreground)]" }) : /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("span", { className: "text-sm font-semibold leading-sm text-[var(--color-foreground)]", children: "Clear" })
8841
+ children: isMinimal ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_icons38.Icon, { icon: import_icons38.faXmarkOutline, size: "sm", className: "text-[var(--color-foreground)]" }) : /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("span", { className: "text-sm font-semibold leading-sm text-[var(--color-foreground)]", children: "Clear" })
8845
8842
  }
8846
8843
  )
8847
8844
  ] }),