@caratlogic/design-system 0.1.33 → 0.1.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/components/molecules/FilterSelect/FilterMultiSelect.d.ts.map +1 -1
  2. package/dist/components/molecules/FilterSelect/FilterSelect.d.ts.map +1 -1
  3. package/dist/components/molecules/FilterSelect/FilterSelect.utils.d.ts +1 -1
  4. package/dist/components/molecules/FilterSelect/FilterSelect.utils.d.ts.map +1 -1
  5. package/dist/components/molecules/Filters/ActiveFilterChips/ActiveFilterChips.d.ts +1 -1
  6. package/dist/components/molecules/Filters/ActiveFilterChips/ActiveFilterChips.d.ts.map +1 -1
  7. package/dist/components/molecules/Filters/ActiveFilterChips/ActiveFilterChips.types.d.ts +3 -0
  8. package/dist/components/molecules/Filters/ActiveFilterChips/ActiveFilterChips.types.d.ts.map +1 -1
  9. package/dist/components/molecules/Filters/ActiveFilterChips/ActiveFilterChips.utils.d.ts +1 -1
  10. package/dist/components/molecules/Filters/ActiveFilterChips/ActiveFilterChips.utils.d.ts.map +1 -1
  11. package/dist/components/molecules/Filters/DateRangeFilter/DateRangeFilter.d.ts.map +1 -1
  12. package/dist/components/molecules/Filters/DateRangeFilter/DateRangeFilter.utils.d.ts +1 -1
  13. package/dist/components/molecules/Filters/DateRangeFilter/DateRangeFilter.utils.d.ts.map +1 -1
  14. package/dist/components/molecules/Filters/FilterCardSkeleton/FilterCardSkeleton.d.ts +6 -0
  15. package/dist/components/molecules/Filters/FilterCardSkeleton/FilterCardSkeleton.d.ts.map +1 -0
  16. package/dist/components/molecules/Filters/FilterCardSkeleton/FilterCardSkeleton.types.d.ts +8 -0
  17. package/dist/components/molecules/Filters/FilterCardSkeleton/FilterCardSkeleton.types.d.ts.map +1 -0
  18. package/dist/components/molecules/Filters/FilterCardSkeleton/FilterCardSkeleton.utils.d.ts +6 -0
  19. package/dist/components/molecules/Filters/FilterCardSkeleton/FilterCardSkeleton.utils.d.ts.map +1 -0
  20. package/dist/components/molecules/Filters/FilterCardSkeleton/index.d.ts +3 -0
  21. package/dist/components/molecules/Filters/FilterCardSkeleton/index.d.ts.map +1 -0
  22. package/dist/components/molecules/Filters/FilterPanel/FilterPanel.d.ts.map +1 -1
  23. package/dist/components/molecules/Filters/Filters.types.d.ts +9 -0
  24. package/dist/components/molecules/Filters/Filters.types.d.ts.map +1 -1
  25. package/dist/components/molecules/Filters/Filters.utils.d.ts +16 -3
  26. package/dist/components/molecules/Filters/Filters.utils.d.ts.map +1 -1
  27. package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.d.ts +1 -1
  28. package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.d.ts.map +1 -1
  29. package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.hooks.d.ts +2 -0
  30. package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.hooks.d.ts.map +1 -1
  31. package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.types.d.ts +3 -1
  32. package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.types.d.ts.map +1 -1
  33. package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.utils.d.ts +12 -1
  34. package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.utils.d.ts.map +1 -1
  35. package/dist/components/molecules/Filters/NumberRangeInputs/NumberRangeInputs.utils.d.ts +2 -1
  36. package/dist/components/molecules/Filters/NumberRangeInputs/NumberRangeInputs.utils.d.ts.map +1 -1
  37. package/dist/components/molecules/Filters/PickListFilter/PickListFilter.d.ts +2 -2
  38. package/dist/components/molecules/Filters/PickListFilter/PickListFilter.d.ts.map +1 -1
  39. package/dist/components/molecules/Filters/PickListFilter/PickListFilter.types.d.ts +2 -0
  40. package/dist/components/molecules/Filters/PickListFilter/PickListFilter.types.d.ts.map +1 -1
  41. package/dist/components/molecules/Filters/PickListFilter/PickListFilter.utils.d.ts +8 -3
  42. package/dist/components/molecules/Filters/PickListFilter/PickListFilter.utils.d.ts.map +1 -1
  43. package/dist/components/molecules/Filters/ScaleRangeFilter/ScaleRangeFilter.d.ts.map +1 -1
  44. package/dist/components/molecules/Filters/TriStateFilter/TriStateFilter.utils.d.ts +1 -1
  45. package/dist/components/molecules/Filters/TriStateFilter/TriStateFilter.utils.d.ts.map +1 -1
  46. package/dist/components/molecules/Filters/index.d.ts +3 -2
  47. package/dist/components/molecules/Filters/index.d.ts.map +1 -1
  48. package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.accessibility.d.ts +11 -0
  49. package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.accessibility.d.ts.map +1 -0
  50. package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.d.ts +6 -0
  51. package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.d.ts.map +1 -0
  52. package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.hooks.d.ts +9 -0
  53. package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.hooks.d.ts.map +1 -0
  54. package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.parts.d.ts +5 -0
  55. package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.parts.d.ts.map +1 -0
  56. package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.types.d.ts +66 -0
  57. package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.types.d.ts.map +1 -0
  58. package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.utils.d.ts +14 -0
  59. package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.utils.d.ts.map +1 -0
  60. package/dist/components/molecules/SavedSearches/SaveSearchDialog/index.d.ts +5 -0
  61. package/dist/components/molecules/SavedSearches/SaveSearchDialog/index.d.ts.map +1 -0
  62. package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.d.ts +6 -0
  63. package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.d.ts.map +1 -0
  64. package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.hooks.d.ts +7 -0
  65. package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.hooks.d.ts.map +1 -0
  66. package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.types.d.ts +19 -0
  67. package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.types.d.ts.map +1 -0
  68. package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.utils.d.ts +5 -0
  69. package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.utils.d.ts.map +1 -0
  70. package/dist/components/molecules/SavedSearches/SavedSearchChipList/index.d.ts +3 -0
  71. package/dist/components/molecules/SavedSearches/SavedSearchChipList/index.d.ts.map +1 -0
  72. package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.accessibility.d.ts +6 -0
  73. package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.accessibility.d.ts.map +1 -0
  74. package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.d.ts +6 -0
  75. package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.d.ts.map +1 -0
  76. package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.hooks.d.ts +3 -0
  77. package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.hooks.d.ts.map +1 -0
  78. package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.parts.d.ts +7 -0
  79. package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.parts.d.ts.map +1 -0
  80. package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.types.d.ts +56 -0
  81. package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.types.d.ts.map +1 -0
  82. package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.utils.d.ts +18 -0
  83. package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.utils.d.ts.map +1 -0
  84. package/dist/components/molecules/SavedSearches/SavedSearchesMenu/index.d.ts +4 -0
  85. package/dist/components/molecules/SavedSearches/SavedSearchesMenu/index.d.ts.map +1 -0
  86. package/dist/components/molecules/SavedSearches/index.d.ts +4 -0
  87. package/dist/components/molecules/SavedSearches/index.d.ts.map +1 -0
  88. package/dist/components/organisms/Filters/FilterField/FilterField.d.ts.map +1 -1
  89. package/dist/components/organisms/Filters/FilterField/FilterField.types.d.ts +6 -4
  90. package/dist/components/organisms/Filters/FilterField/FilterField.types.d.ts.map +1 -1
  91. package/dist/components/organisms/Filters/FilterField/FilterField.utils.d.ts +5 -5
  92. package/dist/components/organisms/Filters/FilterField/FilterField.utils.d.ts.map +1 -1
  93. package/dist/components/organisms/Filters/FilterSurface/FilterSurface.accessibility.d.ts +4 -0
  94. package/dist/components/organisms/Filters/FilterSurface/FilterSurface.accessibility.d.ts.map +1 -1
  95. package/dist/components/organisms/Filters/FilterSurface/FilterSurface.d.ts +2 -2
  96. package/dist/components/organisms/Filters/FilterSurface/FilterSurface.d.ts.map +1 -1
  97. package/dist/components/organisms/Filters/FilterSurface/FilterSurface.hooks.d.ts.map +1 -1
  98. package/dist/components/organisms/Filters/FilterSurface/FilterSurface.parts.d.ts +7 -0
  99. package/dist/components/organisms/Filters/FilterSurface/FilterSurface.parts.d.ts.map +1 -0
  100. package/dist/components/organisms/Filters/FilterSurface/FilterSurface.types.d.ts +16 -0
  101. package/dist/components/organisms/Filters/FilterSurface/FilterSurface.types.d.ts.map +1 -1
  102. package/dist/components/organisms/Filters/FilterSurface/FilterSurface.utils.d.ts +4 -0
  103. package/dist/components/organisms/Filters/FilterSurface/FilterSurface.utils.d.ts.map +1 -0
  104. package/dist/components/organisms/Filters/FilterSurface/index.d.ts +1 -1
  105. package/dist/components/organisms/Filters/FilterSurface/index.d.ts.map +1 -1
  106. package/dist/hooks/useTruncatedText.d.ts.map +1 -1
  107. package/dist/index.cjs.js +690 -238
  108. package/dist/index.cjs.js.map +1 -1
  109. package/dist/index.d.ts +1 -0
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.esm.js +682 -240
  112. package/dist/index.esm.js.map +1 -1
  113. package/package.json +1 -1
package/dist/index.esm.js CHANGED
@@ -2,7 +2,7 @@ import { jsx, jsxs, Fragment as Fragment$2 } from 'react/jsx-runtime';
2
2
  import { Slot } from '@radix-ui/react-slot';
3
3
  import { toast } from 'sonner';
4
4
  import * as React from 'react';
5
- import React__default, { forwardRef, createElement, useState, useCallback, useMemo, useEffect, useRef, Fragment as Fragment$3, createContext, useContext, isValidElement, Children, useLayoutEffect, cloneElement, createRef, Component, useId as useId$2, lazy, Suspense, memo, useReducer, PureComponent, useDebugValue } from 'react';
5
+ import React__default, { forwardRef, createElement, useState, useCallback, useMemo, useEffect, useRef, Fragment as Fragment$3, createContext, useContext, useId as useId$2, isValidElement, Children, useLayoutEffect, cloneElement, createRef, Component, lazy, Suspense, memo, useReducer, PureComponent, useDebugValue } from 'react';
6
6
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
7
7
  import * as SliderPrimitive from '@radix-ui/react-slider';
8
8
  import * as TabsPrimitive from '@radix-ui/react-tabs';
@@ -2668,12 +2668,12 @@ const createLucideIcon = (iconName, iconNode) => {
2668
2668
  */
2669
2669
 
2670
2670
 
2671
- const __iconNode$1v = [
2671
+ const __iconNode$1x = [
2672
2672
  ["path", { d: "M15 12H3", key: "6jk70r" }],
2673
2673
  ["path", { d: "M17 18H3", key: "1amg6g" }],
2674
2674
  ["path", { d: "M21 6H3", key: "1jwq7v" }]
2675
2675
  ];
2676
- const AlignLeft = createLucideIcon("align-left", __iconNode$1v);
2676
+ const AlignLeft = createLucideIcon("align-left", __iconNode$1x);
2677
2677
 
2678
2678
  /**
2679
2679
  * @license lucide-react v0.539.0 - ISC
@@ -2683,12 +2683,12 @@ const AlignLeft = createLucideIcon("align-left", __iconNode$1v);
2683
2683
  */
2684
2684
 
2685
2685
 
2686
- const __iconNode$1u = [
2686
+ const __iconNode$1w = [
2687
2687
  ["rect", { width: "20", height: "5", x: "2", y: "3", rx: "1", key: "1wp1u1" }],
2688
2688
  ["path", { d: "M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8", key: "1s80jp" }],
2689
2689
  ["path", { d: "M10 12h4", key: "a56b0p" }]
2690
2690
  ];
2691
- const Archive = createLucideIcon("archive", __iconNode$1u);
2691
+ const Archive = createLucideIcon("archive", __iconNode$1w);
2692
2692
 
2693
2693
  /**
2694
2694
  * @license lucide-react v0.539.0 - ISC
@@ -2698,11 +2698,11 @@ const Archive = createLucideIcon("archive", __iconNode$1u);
2698
2698
  */
2699
2699
 
2700
2700
 
2701
- const __iconNode$1t = [
2701
+ const __iconNode$1v = [
2702
2702
  ["path", { d: "m12 19-7-7 7-7", key: "1l729n" }],
2703
2703
  ["path", { d: "M19 12H5", key: "x3x0zl" }]
2704
2704
  ];
2705
- const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1t);
2705
+ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1v);
2706
2706
 
2707
2707
  /**
2708
2708
  * @license lucide-react v0.539.0 - ISC
@@ -2712,11 +2712,11 @@ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1t);
2712
2712
  */
2713
2713
 
2714
2714
 
2715
- const __iconNode$1s = [
2715
+ const __iconNode$1u = [
2716
2716
  ["path", { d: "M5 12h14", key: "1ays0h" }],
2717
2717
  ["path", { d: "m12 5 7 7-7 7", key: "xquz4c" }]
2718
2718
  ];
2719
- const ArrowRight = createLucideIcon("arrow-right", __iconNode$1s);
2719
+ const ArrowRight = createLucideIcon("arrow-right", __iconNode$1u);
2720
2720
 
2721
2721
  /**
2722
2722
  * @license lucide-react v0.539.0 - ISC
@@ -2726,11 +2726,11 @@ const ArrowRight = createLucideIcon("arrow-right", __iconNode$1s);
2726
2726
  */
2727
2727
 
2728
2728
 
2729
- const __iconNode$1r = [
2729
+ const __iconNode$1t = [
2730
2730
  ["path", { d: "M4.929 4.929 19.07 19.071", key: "196cmz" }],
2731
2731
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]
2732
2732
  ];
2733
- const Ban = createLucideIcon("ban", __iconNode$1r);
2733
+ const Ban = createLucideIcon("ban", __iconNode$1t);
2734
2734
 
2735
2735
  /**
2736
2736
  * @license lucide-react v0.539.0 - ISC
@@ -2740,7 +2740,7 @@ const Ban = createLucideIcon("ban", __iconNode$1r);
2740
2740
  */
2741
2741
 
2742
2742
 
2743
- const __iconNode$1q = [
2743
+ const __iconNode$1s = [
2744
2744
  ["path", { d: "M10.268 21a2 2 0 0 0 3.464 0", key: "vwvbt9" }],
2745
2745
  [
2746
2746
  "path",
@@ -2751,7 +2751,7 @@ const __iconNode$1q = [
2751
2751
  ],
2752
2752
  ["circle", { cx: "18", cy: "8", r: "3", key: "1g0gzu" }]
2753
2753
  ];
2754
- const BellDot = createLucideIcon("bell-dot", __iconNode$1q);
2754
+ const BellDot = createLucideIcon("bell-dot", __iconNode$1s);
2755
2755
 
2756
2756
  /**
2757
2757
  * @license lucide-react v0.539.0 - ISC
@@ -2761,7 +2761,7 @@ const BellDot = createLucideIcon("bell-dot", __iconNode$1q);
2761
2761
  */
2762
2762
 
2763
2763
 
2764
- const __iconNode$1p = [
2764
+ const __iconNode$1r = [
2765
2765
  ["path", { d: "M10.268 21a2 2 0 0 0 3.464 0", key: "vwvbt9" }],
2766
2766
  ["path", { d: "M22 8c0-2.3-.8-4.3-2-6", key: "5bb3ad" }],
2767
2767
  [
@@ -2773,7 +2773,7 @@ const __iconNode$1p = [
2773
2773
  ],
2774
2774
  ["path", { d: "M4 2C2.8 3.7 2 5.7 2 8", key: "tap9e0" }]
2775
2775
  ];
2776
- const BellRing = createLucideIcon("bell-ring", __iconNode$1p);
2776
+ const BellRing = createLucideIcon("bell-ring", __iconNode$1r);
2777
2777
 
2778
2778
  /**
2779
2779
  * @license lucide-react v0.539.0 - ISC
@@ -2783,7 +2783,7 @@ const BellRing = createLucideIcon("bell-ring", __iconNode$1p);
2783
2783
  */
2784
2784
 
2785
2785
 
2786
- const __iconNode$1o = [
2786
+ const __iconNode$1q = [
2787
2787
  ["path", { d: "M10.268 21a2 2 0 0 0 3.464 0", key: "vwvbt9" }],
2788
2788
  [
2789
2789
  "path",
@@ -2793,7 +2793,7 @@ const __iconNode$1o = [
2793
2793
  }
2794
2794
  ]
2795
2795
  ];
2796
- const Bell = createLucideIcon("bell", __iconNode$1o);
2796
+ const Bell = createLucideIcon("bell", __iconNode$1q);
2797
2797
 
2798
2798
  /**
2799
2799
  * @license lucide-react v0.539.0 - ISC
@@ -2803,13 +2803,13 @@ const Bell = createLucideIcon("bell", __iconNode$1o);
2803
2803
  */
2804
2804
 
2805
2805
 
2806
- const __iconNode$1n = [
2806
+ const __iconNode$1p = [
2807
2807
  [
2808
2808
  "path",
2809
2809
  { d: "M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8", key: "mg9rjx" }
2810
2810
  ]
2811
2811
  ];
2812
- const Bold$1 = createLucideIcon("bold", __iconNode$1n);
2812
+ const Bold$1 = createLucideIcon("bold", __iconNode$1p);
2813
2813
 
2814
2814
  /**
2815
2815
  * @license lucide-react v0.539.0 - ISC
@@ -2819,7 +2819,20 @@ const Bold$1 = createLucideIcon("bold", __iconNode$1n);
2819
2819
  */
2820
2820
 
2821
2821
 
2822
- const __iconNode$1m = [
2822
+ const __iconNode$1o = [
2823
+ ["path", { d: "m19 21-7-4-7 4V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v16z", key: "1fy3hk" }]
2824
+ ];
2825
+ const Bookmark = createLucideIcon("bookmark", __iconNode$1o);
2826
+
2827
+ /**
2828
+ * @license lucide-react v0.539.0 - ISC
2829
+ *
2830
+ * This source code is licensed under the ISC license.
2831
+ * See the LICENSE file in the root directory of this source tree.
2832
+ */
2833
+
2834
+
2835
+ const __iconNode$1n = [
2823
2836
  [
2824
2837
  "path",
2825
2838
  {
@@ -2830,7 +2843,7 @@ const __iconNode$1m = [
2830
2843
  ["path", { d: "m3.3 7 8.7 5 8.7-5", key: "g66t2b" }],
2831
2844
  ["path", { d: "M12 22V12", key: "d0xqtd" }]
2832
2845
  ];
2833
- const Box = createLucideIcon("box", __iconNode$1m);
2846
+ const Box = createLucideIcon("box", __iconNode$1n);
2834
2847
 
2835
2848
  /**
2836
2849
  * @license lucide-react v0.539.0 - ISC
@@ -2840,7 +2853,7 @@ const Box = createLucideIcon("box", __iconNode$1m);
2840
2853
  */
2841
2854
 
2842
2855
 
2843
- const __iconNode$1l = [
2856
+ const __iconNode$1m = [
2844
2857
  ["path", { d: "M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z", key: "1b4qmf" }],
2845
2858
  ["path", { d: "M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2", key: "i71pzd" }],
2846
2859
  ["path", { d: "M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2", key: "10jefs" }],
@@ -2849,7 +2862,7 @@ const __iconNode$1l = [
2849
2862
  ["path", { d: "M10 14h4", key: "kelpxr" }],
2850
2863
  ["path", { d: "M10 18h4", key: "1ulq68" }]
2851
2864
  ];
2852
- const Building2 = createLucideIcon("building-2", __iconNode$1l);
2865
+ const Building2 = createLucideIcon("building-2", __iconNode$1m);
2853
2866
 
2854
2867
  /**
2855
2868
  * @license lucide-react v0.539.0 - ISC
@@ -2859,7 +2872,7 @@ const Building2 = createLucideIcon("building-2", __iconNode$1l);
2859
2872
  */
2860
2873
 
2861
2874
 
2862
- const __iconNode$1k = [
2875
+ const __iconNode$1l = [
2863
2876
  ["path", { d: "M8 2v4", key: "1cmpym" }],
2864
2877
  ["path", { d: "M16 2v4", key: "4m81vk" }],
2865
2878
  ["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
@@ -2871,7 +2884,7 @@ const __iconNode$1k = [
2871
2884
  ["path", { d: "M12 18h.01", key: "mhygvu" }],
2872
2885
  ["path", { d: "M16 18h.01", key: "kzsmim" }]
2873
2886
  ];
2874
- const CalendarDays = createLucideIcon("calendar-days", __iconNode$1k);
2887
+ const CalendarDays = createLucideIcon("calendar-days", __iconNode$1l);
2875
2888
 
2876
2889
  /**
2877
2890
  * @license lucide-react v0.539.0 - ISC
@@ -2881,13 +2894,13 @@ const CalendarDays = createLucideIcon("calendar-days", __iconNode$1k);
2881
2894
  */
2882
2895
 
2883
2896
 
2884
- const __iconNode$1j = [
2897
+ const __iconNode$1k = [
2885
2898
  ["path", { d: "M8 2v4", key: "1cmpym" }],
2886
2899
  ["path", { d: "M16 2v4", key: "4m81vk" }],
2887
2900
  ["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
2888
2901
  ["path", { d: "M3 10h18", key: "8toen8" }]
2889
2902
  ];
2890
- const Calendar$1 = createLucideIcon("calendar", __iconNode$1j);
2903
+ const Calendar$1 = createLucideIcon("calendar", __iconNode$1k);
2891
2904
 
2892
2905
  /**
2893
2906
  * @license lucide-react v0.539.0 - ISC
@@ -2897,11 +2910,11 @@ const Calendar$1 = createLucideIcon("calendar", __iconNode$1j);
2897
2910
  */
2898
2911
 
2899
2912
 
2900
- const __iconNode$1i = [
2913
+ const __iconNode$1j = [
2901
2914
  ["path", { d: "M18 6 7 17l-5-5", key: "116fxf" }],
2902
2915
  ["path", { d: "m22 10-7.5 7.5L13 16", key: "ke71qq" }]
2903
2916
  ];
2904
- const CheckCheck = createLucideIcon("check-check", __iconNode$1i);
2917
+ const CheckCheck = createLucideIcon("check-check", __iconNode$1j);
2905
2918
 
2906
2919
  /**
2907
2920
  * @license lucide-react v0.539.0 - ISC
@@ -2911,8 +2924,8 @@ const CheckCheck = createLucideIcon("check-check", __iconNode$1i);
2911
2924
  */
2912
2925
 
2913
2926
 
2914
- const __iconNode$1h = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
2915
- const Check = createLucideIcon("check", __iconNode$1h);
2927
+ const __iconNode$1i = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
2928
+ const Check = createLucideIcon("check", __iconNode$1i);
2916
2929
 
2917
2930
  /**
2918
2931
  * @license lucide-react v0.539.0 - ISC
@@ -2922,8 +2935,8 @@ const Check = createLucideIcon("check", __iconNode$1h);
2922
2935
  */
2923
2936
 
2924
2937
 
2925
- const __iconNode$1g = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
2926
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$1g);
2938
+ const __iconNode$1h = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
2939
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$1h);
2927
2940
 
2928
2941
  /**
2929
2942
  * @license lucide-react v0.539.0 - ISC
@@ -2933,8 +2946,8 @@ const ChevronDown = createLucideIcon("chevron-down", __iconNode$1g);
2933
2946
  */
2934
2947
 
2935
2948
 
2936
- const __iconNode$1f = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
2937
- const ChevronLeft = createLucideIcon("chevron-left", __iconNode$1f);
2949
+ const __iconNode$1g = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
2950
+ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$1g);
2938
2951
 
2939
2952
  /**
2940
2953
  * @license lucide-react v0.539.0 - ISC
@@ -2944,8 +2957,8 @@ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$1f);
2944
2957
  */
2945
2958
 
2946
2959
 
2947
- const __iconNode$1e = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
2948
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$1e);
2960
+ const __iconNode$1f = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
2961
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$1f);
2949
2962
 
2950
2963
  /**
2951
2964
  * @license lucide-react v0.539.0 - ISC
@@ -2955,8 +2968,8 @@ const ChevronRight = createLucideIcon("chevron-right", __iconNode$1e);
2955
2968
  */
2956
2969
 
2957
2970
 
2958
- const __iconNode$1d = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
2959
- const ChevronUp = createLucideIcon("chevron-up", __iconNode$1d);
2971
+ const __iconNode$1e = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
2972
+ const ChevronUp = createLucideIcon("chevron-up", __iconNode$1e);
2960
2973
 
2961
2974
  /**
2962
2975
  * @license lucide-react v0.539.0 - ISC
@@ -2966,11 +2979,11 @@ const ChevronUp = createLucideIcon("chevron-up", __iconNode$1d);
2966
2979
  */
2967
2980
 
2968
2981
 
2969
- const __iconNode$1c = [
2982
+ const __iconNode$1d = [
2970
2983
  ["path", { d: "m11 17-5-5 5-5", key: "13zhaf" }],
2971
2984
  ["path", { d: "m18 17-5-5 5-5", key: "h8a8et" }]
2972
2985
  ];
2973
- const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$1c);
2986
+ const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$1d);
2974
2987
 
2975
2988
  /**
2976
2989
  * @license lucide-react v0.539.0 - ISC
@@ -2980,11 +2993,11 @@ const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$1c);
2980
2993
  */
2981
2994
 
2982
2995
 
2983
- const __iconNode$1b = [
2996
+ const __iconNode$1c = [
2984
2997
  ["path", { d: "m6 17 5-5-5-5", key: "xnjwq" }],
2985
2998
  ["path", { d: "m13 17 5-5-5-5", key: "17xmmf" }]
2986
2999
  ];
2987
- const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$1b);
3000
+ const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$1c);
2988
3001
 
2989
3002
  /**
2990
3003
  * @license lucide-react v0.539.0 - ISC
@@ -2994,12 +3007,12 @@ const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$1b);
2994
3007
  */
2995
3008
 
2996
3009
 
2997
- const __iconNode$1a = [
3010
+ const __iconNode$1b = [
2998
3011
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
2999
3012
  ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
3000
3013
  ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
3001
3014
  ];
3002
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$1a);
3015
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$1b);
3003
3016
 
3004
3017
  /**
3005
3018
  * @license lucide-react v0.539.0 - ISC
@@ -3009,11 +3022,11 @@ const CircleAlert = createLucideIcon("circle-alert", __iconNode$1a);
3009
3022
  */
3010
3023
 
3011
3024
 
3012
- const __iconNode$19 = [
3025
+ const __iconNode$1a = [
3013
3026
  ["path", { d: "M21.801 10A10 10 0 1 1 17 3.335", key: "yps3ct" }],
3014
3027
  ["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }]
3015
3028
  ];
3016
- const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$19);
3029
+ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$1a);
3017
3030
 
3018
3031
  /**
3019
3032
  * @license lucide-react v0.539.0 - ISC
@@ -3023,11 +3036,11 @@ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$19);
3023
3036
  */
3024
3037
 
3025
3038
 
3026
- const __iconNode$18 = [
3039
+ const __iconNode$19 = [
3027
3040
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
3028
3041
  ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
3029
3042
  ];
3030
- const CircleCheck = createLucideIcon("circle-check", __iconNode$18);
3043
+ const CircleCheck = createLucideIcon("circle-check", __iconNode$19);
3031
3044
 
3032
3045
  /**
3033
3046
  * @license lucide-react v0.539.0 - ISC
@@ -3037,11 +3050,11 @@ const CircleCheck = createLucideIcon("circle-check", __iconNode$18);
3037
3050
  */
3038
3051
 
3039
3052
 
3040
- const __iconNode$17 = [
3053
+ const __iconNode$18 = [
3041
3054
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
3042
3055
  ["path", { d: "m16 10-4 4-4-4", key: "894hmk" }]
3043
3056
  ];
3044
- const CircleChevronDown = createLucideIcon("circle-chevron-down", __iconNode$17);
3057
+ const CircleChevronDown = createLucideIcon("circle-chevron-down", __iconNode$18);
3045
3058
 
3046
3059
  /**
3047
3060
  * @license lucide-react v0.539.0 - ISC
@@ -3051,11 +3064,11 @@ const CircleChevronDown = createLucideIcon("circle-chevron-down", __iconNode$17)
3051
3064
  */
3052
3065
 
3053
3066
 
3054
- const __iconNode$16 = [
3067
+ const __iconNode$17 = [
3055
3068
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
3056
3069
  ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }]
3057
3070
  ];
3058
- const CircleDot = createLucideIcon("circle-dot", __iconNode$16);
3071
+ const CircleDot = createLucideIcon("circle-dot", __iconNode$17);
3059
3072
 
3060
3073
  /**
3061
3074
  * @license lucide-react v0.539.0 - ISC
@@ -3065,12 +3078,12 @@ const CircleDot = createLucideIcon("circle-dot", __iconNode$16);
3065
3078
  */
3066
3079
 
3067
3080
 
3068
- const __iconNode$15 = [
3081
+ const __iconNode$16 = [
3069
3082
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
3070
3083
  ["path", { d: "m15 9-6 6", key: "1uzhvr" }],
3071
3084
  ["path", { d: "m9 9 6 6", key: "z0biqf" }]
3072
3085
  ];
3073
- const CircleX = createLucideIcon("circle-x", __iconNode$15);
3086
+ const CircleX = createLucideIcon("circle-x", __iconNode$16);
3074
3087
 
3075
3088
  /**
3076
3089
  * @license lucide-react v0.539.0 - ISC
@@ -3080,8 +3093,8 @@ const CircleX = createLucideIcon("circle-x", __iconNode$15);
3080
3093
  */
3081
3094
 
3082
3095
 
3083
- const __iconNode$14 = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
3084
- const Circle = createLucideIcon("circle", __iconNode$14);
3096
+ const __iconNode$15 = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
3097
+ const Circle = createLucideIcon("circle", __iconNode$15);
3085
3098
 
3086
3099
  /**
3087
3100
  * @license lucide-react v0.539.0 - ISC
@@ -3091,11 +3104,11 @@ const Circle = createLucideIcon("circle", __iconNode$14);
3091
3104
  */
3092
3105
 
3093
3106
 
3094
- const __iconNode$13 = [
3107
+ const __iconNode$14 = [
3095
3108
  ["path", { d: "M12 6v6l4 2", key: "mmk7yg" }],
3096
3109
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]
3097
3110
  ];
3098
- const Clock = createLucideIcon("clock", __iconNode$13);
3111
+ const Clock = createLucideIcon("clock", __iconNode$14);
3099
3112
 
3100
3113
  /**
3101
3114
  * @license lucide-react v0.539.0 - ISC
@@ -3105,11 +3118,11 @@ const Clock = createLucideIcon("clock", __iconNode$13);
3105
3118
  */
3106
3119
 
3107
3120
 
3108
- const __iconNode$12 = [
3121
+ const __iconNode$13 = [
3109
3122
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
3110
3123
  ["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
3111
3124
  ];
3112
- const Copy = createLucideIcon("copy", __iconNode$12);
3125
+ const Copy = createLucideIcon("copy", __iconNode$13);
3113
3126
 
3114
3127
  /**
3115
3128
  * @license lucide-react v0.539.0 - ISC
@@ -3119,11 +3132,11 @@ const Copy = createLucideIcon("copy", __iconNode$12);
3119
3132
  */
3120
3133
 
3121
3134
 
3122
- const __iconNode$11 = [
3135
+ const __iconNode$12 = [
3123
3136
  ["path", { d: "M6 2v14a2 2 0 0 0 2 2h14", key: "ron5a4" }],
3124
3137
  ["path", { d: "M18 22V8a2 2 0 0 0-2-2H2", key: "7s9ehn" }]
3125
3138
  ];
3126
- const Crop = createLucideIcon("crop", __iconNode$11);
3139
+ const Crop = createLucideIcon("crop", __iconNode$12);
3127
3140
 
3128
3141
  /**
3129
3142
  * @license lucide-react v0.539.0 - ISC
@@ -3133,12 +3146,12 @@ const Crop = createLucideIcon("crop", __iconNode$11);
3133
3146
  */
3134
3147
 
3135
3148
 
3136
- const __iconNode$10 = [
3149
+ const __iconNode$11 = [
3137
3150
  ["path", { d: "M12 15V3", key: "m9g1x1" }],
3138
3151
  ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }],
3139
3152
  ["path", { d: "m7 10 5 5 5-5", key: "brsn70" }]
3140
3153
  ];
3141
- const Download = createLucideIcon("download", __iconNode$10);
3154
+ const Download = createLucideIcon("download", __iconNode$11);
3142
3155
 
3143
3156
  /**
3144
3157
  * @license lucide-react v0.539.0 - ISC
@@ -3148,12 +3161,12 @@ const Download = createLucideIcon("download", __iconNode$10);
3148
3161
  */
3149
3162
 
3150
3163
 
3151
- const __iconNode$$ = [
3164
+ const __iconNode$10 = [
3152
3165
  ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
3153
3166
  ["circle", { cx: "12", cy: "5", r: "1", key: "gxeob9" }],
3154
3167
  ["circle", { cx: "12", cy: "19", r: "1", key: "lyex9k" }]
3155
3168
  ];
3156
- const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$$);
3169
+ const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$10);
3157
3170
 
3158
3171
  /**
3159
3172
  * @license lucide-react v0.539.0 - ISC
@@ -3163,12 +3176,12 @@ const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$$);
3163
3176
  */
3164
3177
 
3165
3178
 
3166
- const __iconNode$_ = [
3179
+ const __iconNode$$ = [
3167
3180
  ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
3168
3181
  ["circle", { cx: "19", cy: "12", r: "1", key: "1wjl8i" }],
3169
3182
  ["circle", { cx: "5", cy: "12", r: "1", key: "1pcz8c" }]
3170
3183
  ];
3171
- const Ellipsis = createLucideIcon("ellipsis", __iconNode$_);
3184
+ const Ellipsis = createLucideIcon("ellipsis", __iconNode$$);
3172
3185
 
3173
3186
  /**
3174
3187
  * @license lucide-react v0.539.0 - ISC
@@ -3178,12 +3191,12 @@ const Ellipsis = createLucideIcon("ellipsis", __iconNode$_);
3178
3191
  */
3179
3192
 
3180
3193
 
3181
- const __iconNode$Z = [
3194
+ const __iconNode$_ = [
3182
3195
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
3183
3196
  ["path", { d: "M10 14 21 3", key: "gplh6r" }],
3184
3197
  ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
3185
3198
  ];
3186
- const ExternalLink = createLucideIcon("external-link", __iconNode$Z);
3199
+ const ExternalLink = createLucideIcon("external-link", __iconNode$_);
3187
3200
 
3188
3201
  /**
3189
3202
  * @license lucide-react v0.539.0 - ISC
@@ -3193,7 +3206,7 @@ const ExternalLink = createLucideIcon("external-link", __iconNode$Z);
3193
3206
  */
3194
3207
 
3195
3208
 
3196
- const __iconNode$Y = [
3209
+ const __iconNode$Z = [
3197
3210
  [
3198
3211
  "path",
3199
3212
  {
@@ -3203,7 +3216,7 @@ const __iconNode$Y = [
3203
3216
  ],
3204
3217
  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
3205
3218
  ];
3206
- const Eye = createLucideIcon("eye", __iconNode$Y);
3219
+ const Eye = createLucideIcon("eye", __iconNode$Z);
3207
3220
 
3208
3221
  /**
3209
3222
  * @license lucide-react v0.539.0 - ISC
@@ -3213,13 +3226,13 @@ const Eye = createLucideIcon("eye", __iconNode$Y);
3213
3226
  */
3214
3227
 
3215
3228
 
3216
- const __iconNode$X = [
3229
+ const __iconNode$Y = [
3217
3230
  [
3218
3231
  "path",
3219
3232
  { d: "M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z", key: "1jg4f8" }
3220
3233
  ]
3221
3234
  ];
3222
- const Facebook = createLucideIcon("facebook", __iconNode$X);
3235
+ const Facebook = createLucideIcon("facebook", __iconNode$Y);
3223
3236
 
3224
3237
  /**
3225
3238
  * @license lucide-react v0.539.0 - ISC
@@ -3229,7 +3242,7 @@ const Facebook = createLucideIcon("facebook", __iconNode$X);
3229
3242
  */
3230
3243
 
3231
3244
 
3232
- const __iconNode$W = [
3245
+ const __iconNode$X = [
3233
3246
  ["path", { d: "M12 22h6a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v3.072", key: "n6s66f" }],
3234
3247
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
3235
3248
  [
@@ -3241,7 +3254,7 @@ const __iconNode$W = [
3241
3254
  ],
3242
3255
  ["circle", { cx: "5", cy: "14", r: "3", key: "ufru5t" }]
3243
3256
  ];
3244
- const FileBadge = createLucideIcon("file-badge", __iconNode$W);
3257
+ const FileBadge = createLucideIcon("file-badge", __iconNode$X);
3245
3258
 
3246
3259
  /**
3247
3260
  * @license lucide-react v0.539.0 - ISC
@@ -3251,12 +3264,12 @@ const FileBadge = createLucideIcon("file-badge", __iconNode$W);
3251
3264
  */
3252
3265
 
3253
3266
 
3254
- const __iconNode$V = [
3267
+ const __iconNode$W = [
3255
3268
  ["path", { d: "M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4", key: "1pf5j1" }],
3256
3269
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
3257
3270
  ["path", { d: "m3 15 2 2 4-4", key: "1lhrkk" }]
3258
3271
  ];
3259
- const FileCheck2 = createLucideIcon("file-check-2", __iconNode$V);
3272
+ const FileCheck2 = createLucideIcon("file-check-2", __iconNode$W);
3260
3273
 
3261
3274
  /**
3262
3275
  * @license lucide-react v0.539.0 - ISC
@@ -3266,14 +3279,14 @@ const FileCheck2 = createLucideIcon("file-check-2", __iconNode$V);
3266
3279
  */
3267
3280
 
3268
3281
 
3269
- const __iconNode$U = [
3282
+ const __iconNode$V = [
3270
3283
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
3271
3284
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
3272
3285
  ["path", { d: "M10 9H8", key: "b1mrlr" }],
3273
3286
  ["path", { d: "M16 13H8", key: "t4e002" }],
3274
3287
  ["path", { d: "M16 17H8", key: "z1uh3a" }]
3275
3288
  ];
3276
- const FileText = createLucideIcon("file-text", __iconNode$U);
3289
+ const FileText = createLucideIcon("file-text", __iconNode$V);
3277
3290
 
3278
3291
  /**
3279
3292
  * @license lucide-react v0.539.0 - ISC
@@ -3283,7 +3296,7 @@ const FileText = createLucideIcon("file-text", __iconNode$U);
3283
3296
  */
3284
3297
 
3285
3298
 
3286
- const __iconNode$T = [
3299
+ const __iconNode$U = [
3287
3300
  [
3288
3301
  "path",
3289
3302
  {
@@ -3294,7 +3307,7 @@ const __iconNode$T = [
3294
3307
  ["path", { d: "m16.5 3.5 5 5", key: "15e6fa" }],
3295
3308
  ["path", { d: "m21.5 3.5-5 5", key: "m0lwru" }]
3296
3309
  ];
3297
- const FunnelX = createLucideIcon("funnel-x", __iconNode$T);
3310
+ const FunnelX = createLucideIcon("funnel-x", __iconNode$U);
3298
3311
 
3299
3312
  /**
3300
3313
  * @license lucide-react v0.539.0 - ISC
@@ -3304,7 +3317,7 @@ const FunnelX = createLucideIcon("funnel-x", __iconNode$T);
3304
3317
  */
3305
3318
 
3306
3319
 
3307
- const __iconNode$S = [
3320
+ const __iconNode$T = [
3308
3321
  [
3309
3322
  "path",
3310
3323
  {
@@ -3313,7 +3326,7 @@ const __iconNode$S = [
3313
3326
  }
3314
3327
  ]
3315
3328
  ];
3316
- const Funnel = createLucideIcon("funnel", __iconNode$S);
3329
+ const Funnel = createLucideIcon("funnel", __iconNode$T);
3317
3330
 
3318
3331
  /**
3319
3332
  * @license lucide-react v0.539.0 - ISC
@@ -3323,7 +3336,7 @@ const Funnel = createLucideIcon("funnel", __iconNode$S);
3323
3336
  */
3324
3337
 
3325
3338
 
3326
- const __iconNode$R = [
3339
+ const __iconNode$S = [
3327
3340
  ["path", { d: "M10.5 3 8 9l4 13 4-13-2.5-6", key: "b3dvk1" }],
3328
3341
  [
3329
3342
  "path",
@@ -3334,7 +3347,7 @@ const __iconNode$R = [
3334
3347
  ],
3335
3348
  ["path", { d: "M2 9h20", key: "16fsjt" }]
3336
3349
  ];
3337
- const Gem = createLucideIcon("gem", __iconNode$R);
3350
+ const Gem = createLucideIcon("gem", __iconNode$S);
3338
3351
 
3339
3352
  /**
3340
3353
  * @license lucide-react v0.539.0 - ISC
@@ -3344,7 +3357,7 @@ const Gem = createLucideIcon("gem", __iconNode$R);
3344
3357
  */
3345
3358
 
3346
3359
 
3347
- const __iconNode$Q = [
3360
+ const __iconNode$R = [
3348
3361
  ["circle", { cx: "12", cy: "9", r: "1", key: "124mty" }],
3349
3362
  ["circle", { cx: "19", cy: "9", r: "1", key: "1ruzo2" }],
3350
3363
  ["circle", { cx: "5", cy: "9", r: "1", key: "1a8b28" }],
@@ -3352,7 +3365,7 @@ const __iconNode$Q = [
3352
3365
  ["circle", { cx: "19", cy: "15", r: "1", key: "1a92ep" }],
3353
3366
  ["circle", { cx: "5", cy: "15", r: "1", key: "5r1jwy" }]
3354
3367
  ];
3355
- const GripHorizontal = createLucideIcon("grip-horizontal", __iconNode$Q);
3368
+ const GripHorizontal = createLucideIcon("grip-horizontal", __iconNode$R);
3356
3369
 
3357
3370
  /**
3358
3371
  * @license lucide-react v0.539.0 - ISC
@@ -3362,7 +3375,7 @@ const GripHorizontal = createLucideIcon("grip-horizontal", __iconNode$Q);
3362
3375
  */
3363
3376
 
3364
3377
 
3365
- const __iconNode$P = [
3378
+ const __iconNode$Q = [
3366
3379
  ["circle", { cx: "9", cy: "12", r: "1", key: "1vctgf" }],
3367
3380
  ["circle", { cx: "9", cy: "5", r: "1", key: "hp0tcf" }],
3368
3381
  ["circle", { cx: "9", cy: "19", r: "1", key: "fkjjf6" }],
@@ -3370,7 +3383,7 @@ const __iconNode$P = [
3370
3383
  ["circle", { cx: "15", cy: "5", r: "1", key: "19l28e" }],
3371
3384
  ["circle", { cx: "15", cy: "19", r: "1", key: "f4zoj3" }]
3372
3385
  ];
3373
- const GripVertical = createLucideIcon("grip-vertical", __iconNode$P);
3386
+ const GripVertical = createLucideIcon("grip-vertical", __iconNode$Q);
3374
3387
 
3375
3388
  /**
3376
3389
  * @license lucide-react v0.539.0 - ISC
@@ -3380,13 +3393,13 @@ const GripVertical = createLucideIcon("grip-vertical", __iconNode$P);
3380
3393
  */
3381
3394
 
3382
3395
 
3383
- const __iconNode$O = [
3396
+ const __iconNode$P = [
3384
3397
  ["line", { x1: "4", x2: "20", y1: "9", y2: "9", key: "4lhtct" }],
3385
3398
  ["line", { x1: "4", x2: "20", y1: "15", y2: "15", key: "vyu0kd" }],
3386
3399
  ["line", { x1: "10", x2: "8", y1: "3", y2: "21", key: "1ggp8o" }],
3387
3400
  ["line", { x1: "16", x2: "14", y1: "3", y2: "21", key: "weycgp" }]
3388
3401
  ];
3389
- const Hash = createLucideIcon("hash", __iconNode$O);
3402
+ const Hash = createLucideIcon("hash", __iconNode$P);
3390
3403
 
3391
3404
  /**
3392
3405
  * @license lucide-react v0.539.0 - ISC
@@ -3396,13 +3409,13 @@ const Hash = createLucideIcon("hash", __iconNode$O);
3396
3409
  */
3397
3410
 
3398
3411
 
3399
- const __iconNode$N = [
3412
+ const __iconNode$O = [
3400
3413
  ["path", { d: "M4 12h8", key: "17cfdx" }],
3401
3414
  ["path", { d: "M4 18V6", key: "1rz3zl" }],
3402
3415
  ["path", { d: "M12 18V6", key: "zqpxq5" }],
3403
3416
  ["path", { d: "m17 12 3-2v8", key: "1hhhft" }]
3404
3417
  ];
3405
- const Heading1 = createLucideIcon("heading-1", __iconNode$N);
3418
+ const Heading1 = createLucideIcon("heading-1", __iconNode$O);
3406
3419
 
3407
3420
  /**
3408
3421
  * @license lucide-react v0.539.0 - ISC
@@ -3412,13 +3425,13 @@ const Heading1 = createLucideIcon("heading-1", __iconNode$N);
3412
3425
  */
3413
3426
 
3414
3427
 
3415
- const __iconNode$M = [
3428
+ const __iconNode$N = [
3416
3429
  ["path", { d: "M4 12h8", key: "17cfdx" }],
3417
3430
  ["path", { d: "M4 18V6", key: "1rz3zl" }],
3418
3431
  ["path", { d: "M12 18V6", key: "zqpxq5" }],
3419
3432
  ["path", { d: "M21 18h-4c0-4 4-3 4-6 0-1.5-2-2.5-4-1", key: "9jr5yi" }]
3420
3433
  ];
3421
- const Heading2 = createLucideIcon("heading-2", __iconNode$M);
3434
+ const Heading2 = createLucideIcon("heading-2", __iconNode$N);
3422
3435
 
3423
3436
  /**
3424
3437
  * @license lucide-react v0.539.0 - ISC
@@ -3428,14 +3441,14 @@ const Heading2 = createLucideIcon("heading-2", __iconNode$M);
3428
3441
  */
3429
3442
 
3430
3443
 
3431
- const __iconNode$L = [
3444
+ const __iconNode$M = [
3432
3445
  ["path", { d: "M4 12h8", key: "17cfdx" }],
3433
3446
  ["path", { d: "M4 18V6", key: "1rz3zl" }],
3434
3447
  ["path", { d: "M12 18V6", key: "zqpxq5" }],
3435
3448
  ["path", { d: "M17.5 10.5c1.7-1 3.5 0 3.5 1.5a2 2 0 0 1-2 2", key: "68ncm8" }],
3436
3449
  ["path", { d: "M17 17.5c2 1.5 4 .3 4-1.5a2 2 0 0 0-2-2", key: "1ejuhz" }]
3437
3450
  ];
3438
- const Heading3 = createLucideIcon("heading-3", __iconNode$L);
3451
+ const Heading3 = createLucideIcon("heading-3", __iconNode$M);
3439
3452
 
3440
3453
  /**
3441
3454
  * @license lucide-react v0.539.0 - ISC
@@ -3445,12 +3458,12 @@ const Heading3 = createLucideIcon("heading-3", __iconNode$L);
3445
3458
  */
3446
3459
 
3447
3460
 
3448
- const __iconNode$K = [
3461
+ const __iconNode$L = [
3449
3462
  ["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8", key: "1357e3" }],
3450
3463
  ["path", { d: "M3 3v5h5", key: "1xhq8a" }],
3451
3464
  ["path", { d: "M12 7v5l4 2", key: "1fdv2h" }]
3452
3465
  ];
3453
- const History = createLucideIcon("history", __iconNode$K);
3466
+ const History = createLucideIcon("history", __iconNode$L);
3454
3467
 
3455
3468
  /**
3456
3469
  * @license lucide-react v0.539.0 - ISC
@@ -3460,12 +3473,12 @@ const History = createLucideIcon("history", __iconNode$K);
3460
3473
  */
3461
3474
 
3462
3475
 
3463
- const __iconNode$J = [
3476
+ const __iconNode$K = [
3464
3477
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", ry: "2", key: "1m3agn" }],
3465
3478
  ["circle", { cx: "9", cy: "9", r: "2", key: "af1f0g" }],
3466
3479
  ["path", { d: "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21", key: "1xmnt7" }]
3467
3480
  ];
3468
- const Image$1 = createLucideIcon("image", __iconNode$J);
3481
+ const Image$1 = createLucideIcon("image", __iconNode$K);
3469
3482
 
3470
3483
  /**
3471
3484
  * @license lucide-react v0.539.0 - ISC
@@ -3475,12 +3488,12 @@ const Image$1 = createLucideIcon("image", __iconNode$J);
3475
3488
  */
3476
3489
 
3477
3490
 
3478
- const __iconNode$I = [
3491
+ const __iconNode$J = [
3479
3492
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
3480
3493
  ["path", { d: "M12 16v-4", key: "1dtifu" }],
3481
3494
  ["path", { d: "M12 8h.01", key: "e9boi3" }]
3482
3495
  ];
3483
- const Info = createLucideIcon("info", __iconNode$I);
3496
+ const Info = createLucideIcon("info", __iconNode$J);
3484
3497
 
3485
3498
  /**
3486
3499
  * @license lucide-react v0.539.0 - ISC
@@ -3490,12 +3503,12 @@ const Info = createLucideIcon("info", __iconNode$I);
3490
3503
  */
3491
3504
 
3492
3505
 
3493
- const __iconNode$H = [
3506
+ const __iconNode$I = [
3494
3507
  ["line", { x1: "19", x2: "10", y1: "4", y2: "4", key: "15jd3p" }],
3495
3508
  ["line", { x1: "14", x2: "5", y1: "20", y2: "20", key: "bu0au3" }],
3496
3509
  ["line", { x1: "15", x2: "9", y1: "4", y2: "20", key: "uljnxc" }]
3497
3510
  ];
3498
- const Italic$1 = createLucideIcon("italic", __iconNode$H);
3511
+ const Italic$1 = createLucideIcon("italic", __iconNode$I);
3499
3512
 
3500
3513
  /**
3501
3514
  * @license lucide-react v0.539.0 - ISC
@@ -3505,7 +3518,7 @@ const Italic$1 = createLucideIcon("italic", __iconNode$H);
3505
3518
  */
3506
3519
 
3507
3520
 
3508
- const __iconNode$G = [
3521
+ const __iconNode$H = [
3509
3522
  [
3510
3523
  "path",
3511
3524
  {
@@ -3515,7 +3528,7 @@ const __iconNode$G = [
3515
3528
  ],
3516
3529
  ["circle", { cx: "16.5", cy: "7.5", r: ".5", fill: "currentColor", key: "w0ekpg" }]
3517
3530
  ];
3518
- const KeyRound = createLucideIcon("key-round", __iconNode$G);
3531
+ const KeyRound = createLucideIcon("key-round", __iconNode$H);
3519
3532
 
3520
3533
  /**
3521
3534
  * @license lucide-react v0.539.0 - ISC
@@ -3525,12 +3538,12 @@ const KeyRound = createLucideIcon("key-round", __iconNode$G);
3525
3538
  */
3526
3539
 
3527
3540
 
3528
- const __iconNode$F = [
3541
+ const __iconNode$G = [
3529
3542
  ["path", { d: "M9 17H7A5 5 0 0 1 7 7h2", key: "8i5ue5" }],
3530
3543
  ["path", { d: "M15 7h2a5 5 0 1 1 0 10h-2", key: "1b9ql8" }],
3531
3544
  ["line", { x1: "8", x2: "16", y1: "12", y2: "12", key: "1jonct" }]
3532
3545
  ];
3533
- const Link2 = createLucideIcon("link-2", __iconNode$F);
3546
+ const Link2 = createLucideIcon("link-2", __iconNode$G);
3534
3547
 
3535
3548
  /**
3536
3549
  * @license lucide-react v0.539.0 - ISC
@@ -3540,14 +3553,14 @@ const Link2 = createLucideIcon("link-2", __iconNode$F);
3540
3553
  */
3541
3554
 
3542
3555
 
3543
- const __iconNode$E = [
3556
+ const __iconNode$F = [
3544
3557
  ["path", { d: "m3 17 2 2 4-4", key: "1jhpwq" }],
3545
3558
  ["path", { d: "m3 7 2 2 4-4", key: "1obspn" }],
3546
3559
  ["path", { d: "M13 6h8", key: "15sg57" }],
3547
3560
  ["path", { d: "M13 12h8", key: "h98zly" }],
3548
3561
  ["path", { d: "M13 18h8", key: "oe0vm4" }]
3549
3562
  ];
3550
- const ListChecks = createLucideIcon("list-checks", __iconNode$E);
3563
+ const ListChecks = createLucideIcon("list-checks", __iconNode$F);
3551
3564
 
3552
3565
  /**
3553
3566
  * @license lucide-react v0.539.0 - ISC
@@ -3557,7 +3570,7 @@ const ListChecks = createLucideIcon("list-checks", __iconNode$E);
3557
3570
  */
3558
3571
 
3559
3572
 
3560
- const __iconNode$D = [
3573
+ const __iconNode$E = [
3561
3574
  ["path", { d: "M10 12h11", key: "6m4ad9" }],
3562
3575
  ["path", { d: "M10 18h11", key: "11hvi2" }],
3563
3576
  ["path", { d: "M10 6h11", key: "c7qv1k" }],
@@ -3565,7 +3578,7 @@ const __iconNode$D = [
3565
3578
  ["path", { d: "M4 6h1v4", key: "cnovpq" }],
3566
3579
  ["path", { d: "M6 18H4c0-1 2-2 2-3s-1-1.5-2-1", key: "m9a95d" }]
3567
3580
  ];
3568
- const ListOrdered = createLucideIcon("list-ordered", __iconNode$D);
3581
+ const ListOrdered = createLucideIcon("list-ordered", __iconNode$E);
3569
3582
 
3570
3583
  /**
3571
3584
  * @license lucide-react v0.539.0 - ISC
@@ -3575,7 +3588,7 @@ const ListOrdered = createLucideIcon("list-ordered", __iconNode$D);
3575
3588
  */
3576
3589
 
3577
3590
 
3578
- const __iconNode$C = [
3591
+ const __iconNode$D = [
3579
3592
  ["path", { d: "M3 12h.01", key: "nlz23k" }],
3580
3593
  ["path", { d: "M3 18h.01", key: "1tta3j" }],
3581
3594
  ["path", { d: "M3 6h.01", key: "1rqtza" }],
@@ -3583,7 +3596,7 @@ const __iconNode$C = [
3583
3596
  ["path", { d: "M8 18h13", key: "1lx6n3" }],
3584
3597
  ["path", { d: "M8 6h13", key: "ik3vkj" }]
3585
3598
  ];
3586
- const List = createLucideIcon("list", __iconNode$C);
3599
+ const List = createLucideIcon("list", __iconNode$D);
3587
3600
 
3588
3601
  /**
3589
3602
  * @license lucide-react v0.539.0 - ISC
@@ -3593,8 +3606,8 @@ const List = createLucideIcon("list", __iconNode$C);
3593
3606
  */
3594
3607
 
3595
3608
 
3596
- const __iconNode$B = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
3597
- const LoaderCircle = createLucideIcon("loader-circle", __iconNode$B);
3609
+ const __iconNode$C = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
3610
+ const LoaderCircle = createLucideIcon("loader-circle", __iconNode$C);
3598
3611
 
3599
3612
  /**
3600
3613
  * @license lucide-react v0.539.0 - ISC
@@ -3604,7 +3617,7 @@ const LoaderCircle = createLucideIcon("loader-circle", __iconNode$B);
3604
3617
  */
3605
3618
 
3606
3619
 
3607
- const __iconNode$A = [
3620
+ const __iconNode$B = [
3608
3621
  ["path", { d: "M12 2v4", key: "3427ic" }],
3609
3622
  ["path", { d: "m16.2 7.8 2.9-2.9", key: "r700ao" }],
3610
3623
  ["path", { d: "M18 12h4", key: "wj9ykh" }],
@@ -3614,7 +3627,7 @@ const __iconNode$A = [
3614
3627
  ["path", { d: "M2 12h4", key: "j09sii" }],
3615
3628
  ["path", { d: "m4.9 4.9 2.9 2.9", key: "giyufr" }]
3616
3629
  ];
3617
- const Loader = createLucideIcon("loader", __iconNode$A);
3630
+ const Loader = createLucideIcon("loader", __iconNode$B);
3618
3631
 
3619
3632
  /**
3620
3633
  * @license lucide-react v0.539.0 - ISC
@@ -3624,12 +3637,12 @@ const Loader = createLucideIcon("loader", __iconNode$A);
3624
3637
  */
3625
3638
 
3626
3639
 
3627
- const __iconNode$z = [
3640
+ const __iconNode$A = [
3628
3641
  ["path", { d: "m16 17 5-5-5-5", key: "1bji2h" }],
3629
3642
  ["path", { d: "M21 12H9", key: "dn1m92" }],
3630
3643
  ["path", { d: "M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4", key: "1uf3rs" }]
3631
3644
  ];
3632
- const LogOut = createLucideIcon("log-out", __iconNode$z);
3645
+ const LogOut = createLucideIcon("log-out", __iconNode$A);
3633
3646
 
3634
3647
  /**
3635
3648
  * @license lucide-react v0.539.0 - ISC
@@ -3639,11 +3652,11 @@ const LogOut = createLucideIcon("log-out", __iconNode$z);
3639
3652
  */
3640
3653
 
3641
3654
 
3642
- const __iconNode$y = [
3655
+ const __iconNode$z = [
3643
3656
  ["path", { d: "m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7", key: "132q7q" }],
3644
3657
  ["rect", { x: "2", y: "4", width: "20", height: "16", rx: "2", key: "izxlao" }]
3645
3658
  ];
3646
- const Mail = createLucideIcon("mail", __iconNode$y);
3659
+ const Mail = createLucideIcon("mail", __iconNode$z);
3647
3660
 
3648
3661
  /**
3649
3662
  * @license lucide-react v0.539.0 - ISC
@@ -3653,12 +3666,12 @@ const Mail = createLucideIcon("mail", __iconNode$y);
3653
3666
  */
3654
3667
 
3655
3668
 
3656
- const __iconNode$x = [
3669
+ const __iconNode$y = [
3657
3670
  ["path", { d: "M4 12h16", key: "1lakjw" }],
3658
3671
  ["path", { d: "M4 18h16", key: "19g7jn" }],
3659
3672
  ["path", { d: "M4 6h16", key: "1o0s65" }]
3660
3673
  ];
3661
- const Menu = createLucideIcon("menu", __iconNode$x);
3674
+ const Menu = createLucideIcon("menu", __iconNode$y);
3662
3675
 
3663
3676
  /**
3664
3677
  * @license lucide-react v0.539.0 - ISC
@@ -3668,8 +3681,8 @@ const Menu = createLucideIcon("menu", __iconNode$x);
3668
3681
  */
3669
3682
 
3670
3683
 
3671
- const __iconNode$w = [["path", { d: "M5 12h14", key: "1ays0h" }]];
3672
- const Minus = createLucideIcon("minus", __iconNode$w);
3684
+ const __iconNode$x = [["path", { d: "M5 12h14", key: "1ays0h" }]];
3685
+ const Minus = createLucideIcon("minus", __iconNode$x);
3673
3686
 
3674
3687
  /**
3675
3688
  * @license lucide-react v0.539.0 - ISC
@@ -3679,7 +3692,7 @@ const Minus = createLucideIcon("minus", __iconNode$w);
3679
3692
  */
3680
3693
 
3681
3694
 
3682
- const __iconNode$v = [
3695
+ const __iconNode$w = [
3683
3696
  [
3684
3697
  "path",
3685
3698
  {
@@ -3688,7 +3701,7 @@ const __iconNode$v = [
3688
3701
  }
3689
3702
  ]
3690
3703
  ];
3691
- const Moon = createLucideIcon("moon", __iconNode$v);
3704
+ const Moon = createLucideIcon("moon", __iconNode$w);
3692
3705
 
3693
3706
  /**
3694
3707
  * @license lucide-react v0.539.0 - ISC
@@ -3698,7 +3711,7 @@ const Moon = createLucideIcon("moon", __iconNode$v);
3698
3711
  */
3699
3712
 
3700
3713
 
3701
- const __iconNode$u = [
3714
+ const __iconNode$v = [
3702
3715
  [
3703
3716
  "path",
3704
3717
  {
@@ -3711,7 +3724,7 @@ const __iconNode$u = [
3711
3724
  ["circle", { cx: "6.5", cy: "12.5", r: ".5", fill: "currentColor", key: "qy21gx" }],
3712
3725
  ["circle", { cx: "8.5", cy: "7.5", r: ".5", fill: "currentColor", key: "fotxhn" }]
3713
3726
  ];
3714
- const Palette = createLucideIcon("palette", __iconNode$u);
3727
+ const Palette = createLucideIcon("palette", __iconNode$v);
3715
3728
 
3716
3729
  /**
3717
3730
  * @license lucide-react v0.539.0 - ISC
@@ -3721,12 +3734,12 @@ const Palette = createLucideIcon("palette", __iconNode$u);
3721
3734
  */
3722
3735
 
3723
3736
 
3724
- const __iconNode$t = [
3737
+ const __iconNode$u = [
3725
3738
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
3726
3739
  ["path", { d: "M9 3v18", key: "fh3hqa" }],
3727
3740
  ["path", { d: "m16 15-3-3 3-3", key: "14y99z" }]
3728
3741
  ];
3729
- const PanelLeftClose = createLucideIcon("panel-left-close", __iconNode$t);
3742
+ const PanelLeftClose = createLucideIcon("panel-left-close", __iconNode$u);
3730
3743
 
3731
3744
  /**
3732
3745
  * @license lucide-react v0.539.0 - ISC
@@ -3736,7 +3749,7 @@ const PanelLeftClose = createLucideIcon("panel-left-close", __iconNode$t);
3736
3749
  */
3737
3750
 
3738
3751
 
3739
- const __iconNode$s = [
3752
+ const __iconNode$t = [
3740
3753
  [
3741
3754
  "path",
3742
3755
  {
@@ -3745,7 +3758,7 @@ const __iconNode$s = [
3745
3758
  }
3746
3759
  ]
3747
3760
  ];
3748
- const Paperclip = createLucideIcon("paperclip", __iconNode$s);
3761
+ const Paperclip = createLucideIcon("paperclip", __iconNode$t);
3749
3762
 
3750
3763
  /**
3751
3764
  * @license lucide-react v0.539.0 - ISC
@@ -3755,7 +3768,7 @@ const Paperclip = createLucideIcon("paperclip", __iconNode$s);
3755
3768
  */
3756
3769
 
3757
3770
 
3758
- const __iconNode$r = [
3771
+ const __iconNode$s = [
3759
3772
  [
3760
3773
  "path",
3761
3774
  {
@@ -3765,7 +3778,7 @@ const __iconNode$r = [
3765
3778
  ],
3766
3779
  ["path", { d: "m15 5 4 4", key: "1mk7zo" }]
3767
3780
  ];
3768
- const Pencil = createLucideIcon("pencil", __iconNode$r);
3781
+ const Pencil = createLucideIcon("pencil", __iconNode$s);
3769
3782
 
3770
3783
  /**
3771
3784
  * @license lucide-react v0.539.0 - ISC
@@ -3775,7 +3788,7 @@ const Pencil = createLucideIcon("pencil", __iconNode$r);
3775
3788
  */
3776
3789
 
3777
3790
 
3778
- const __iconNode$q = [
3791
+ const __iconNode$r = [
3779
3792
  [
3780
3793
  "path",
3781
3794
  {
@@ -3784,7 +3797,7 @@ const __iconNode$q = [
3784
3797
  }
3785
3798
  ]
3786
3799
  ];
3787
- const Phone = createLucideIcon("phone", __iconNode$q);
3800
+ const Phone = createLucideIcon("phone", __iconNode$r);
3788
3801
 
3789
3802
  /**
3790
3803
  * @license lucide-react v0.539.0 - ISC
@@ -3794,7 +3807,7 @@ const Phone = createLucideIcon("phone", __iconNode$q);
3794
3807
  */
3795
3808
 
3796
3809
 
3797
- const __iconNode$p = [
3810
+ const __iconNode$q = [
3798
3811
  [
3799
3812
  "path",
3800
3813
  {
@@ -3803,7 +3816,7 @@ const __iconNode$p = [
3803
3816
  }
3804
3817
  ]
3805
3818
  ];
3806
- const Play = createLucideIcon("play", __iconNode$p);
3819
+ const Play = createLucideIcon("play", __iconNode$q);
3807
3820
 
3808
3821
  /**
3809
3822
  * @license lucide-react v0.539.0 - ISC
@@ -3813,11 +3826,11 @@ const Play = createLucideIcon("play", __iconNode$p);
3813
3826
  */
3814
3827
 
3815
3828
 
3816
- const __iconNode$o = [
3829
+ const __iconNode$p = [
3817
3830
  ["path", { d: "M5 12h14", key: "1ays0h" }],
3818
3831
  ["path", { d: "M12 5v14", key: "s699le" }]
3819
3832
  ];
3820
- const Plus = createLucideIcon("plus", __iconNode$o);
3833
+ const Plus = createLucideIcon("plus", __iconNode$p);
3821
3834
 
3822
3835
  /**
3823
3836
  * @license lucide-react v0.539.0 - ISC
@@ -3827,10 +3840,10 @@ const Plus = createLucideIcon("plus", __iconNode$o);
3827
3840
  */
3828
3841
 
3829
3842
 
3830
- const __iconNode$n = [
3843
+ const __iconNode$o = [
3831
3844
  ["rect", { width: "20", height: "12", x: "2", y: "6", rx: "2", key: "9lu3g6" }]
3832
3845
  ];
3833
- const RectangleHorizontal = createLucideIcon("rectangle-horizontal", __iconNode$n);
3846
+ const RectangleHorizontal = createLucideIcon("rectangle-horizontal", __iconNode$o);
3834
3847
 
3835
3848
  /**
3836
3849
  * @license lucide-react v0.539.0 - ISC
@@ -3840,11 +3853,11 @@ const RectangleHorizontal = createLucideIcon("rectangle-horizontal", __iconNode$
3840
3853
  */
3841
3854
 
3842
3855
 
3843
- const __iconNode$m = [
3856
+ const __iconNode$n = [
3844
3857
  ["path", { d: "M21 7v6h-6", key: "3ptur4" }],
3845
3858
  ["path", { d: "M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3l3 2.7", key: "1kgawr" }]
3846
3859
  ];
3847
- const Redo = createLucideIcon("redo", __iconNode$m);
3860
+ const Redo = createLucideIcon("redo", __iconNode$n);
3848
3861
 
3849
3862
  /**
3850
3863
  * @license lucide-react v0.539.0 - ISC
@@ -3854,13 +3867,13 @@ const Redo = createLucideIcon("redo", __iconNode$m);
3854
3867
  */
3855
3868
 
3856
3869
 
3857
- const __iconNode$l = [
3870
+ const __iconNode$m = [
3858
3871
  ["path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8", key: "v9h5vc" }],
3859
3872
  ["path", { d: "M21 3v5h-5", key: "1q7to0" }],
3860
3873
  ["path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16", key: "3uifl3" }],
3861
3874
  ["path", { d: "M8 16H3v5", key: "1cv678" }]
3862
3875
  ];
3863
- const RefreshCw = createLucideIcon("refresh-cw", __iconNode$l);
3876
+ const RefreshCw = createLucideIcon("refresh-cw", __iconNode$m);
3864
3877
 
3865
3878
  /**
3866
3879
  * @license lucide-react v0.539.0 - ISC
@@ -3870,14 +3883,14 @@ const RefreshCw = createLucideIcon("refresh-cw", __iconNode$l);
3870
3883
  */
3871
3884
 
3872
3885
 
3873
- const __iconNode$k = [
3886
+ const __iconNode$l = [
3874
3887
  ["path", { d: "M4 7V4h16v3", key: "9msm58" }],
3875
3888
  ["path", { d: "M5 20h6", key: "1h6pxn" }],
3876
3889
  ["path", { d: "M13 4 8 20", key: "kqq6aj" }],
3877
3890
  ["path", { d: "m15 15 5 5", key: "me55sn" }],
3878
3891
  ["path", { d: "m20 15-5 5", key: "11p7ol" }]
3879
3892
  ];
3880
- const RemoveFormatting = createLucideIcon("remove-formatting", __iconNode$k);
3893
+ const RemoveFormatting = createLucideIcon("remove-formatting", __iconNode$l);
3881
3894
 
3882
3895
  /**
3883
3896
  * @license lucide-react v0.539.0 - ISC
@@ -3887,11 +3900,11 @@ const RemoveFormatting = createLucideIcon("remove-formatting", __iconNode$k);
3887
3900
  */
3888
3901
 
3889
3902
 
3890
- const __iconNode$j = [
3903
+ const __iconNode$k = [
3891
3904
  ["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8", key: "1357e3" }],
3892
3905
  ["path", { d: "M3 3v5h5", key: "1xhq8a" }]
3893
3906
  ];
3894
- const RotateCcw = createLucideIcon("rotate-ccw", __iconNode$j);
3907
+ const RotateCcw = createLucideIcon("rotate-ccw", __iconNode$k);
3895
3908
 
3896
3909
  /**
3897
3910
  * @license lucide-react v0.539.0 - ISC
@@ -3901,14 +3914,30 @@ const RotateCcw = createLucideIcon("rotate-ccw", __iconNode$j);
3901
3914
  */
3902
3915
 
3903
3916
 
3904
- const __iconNode$i = [
3917
+ const __iconNode$j = [
3905
3918
  ["circle", { cx: "6", cy: "6", r: "3", key: "1lh9wr" }],
3906
3919
  ["path", { d: "M8.12 8.12 12 12", key: "1alkpv" }],
3907
3920
  ["path", { d: "M20 4 8.12 15.88", key: "xgtan2" }],
3908
3921
  ["circle", { cx: "6", cy: "18", r: "3", key: "fqmcym" }],
3909
3922
  ["path", { d: "M14.8 14.8 20 20", key: "ptml3r" }]
3910
3923
  ];
3911
- const Scissors = createLucideIcon("scissors", __iconNode$i);
3924
+ const Scissors = createLucideIcon("scissors", __iconNode$j);
3925
+
3926
+ /**
3927
+ * @license lucide-react v0.539.0 - ISC
3928
+ *
3929
+ * This source code is licensed under the ISC license.
3930
+ * See the LICENSE file in the root directory of this source tree.
3931
+ */
3932
+
3933
+
3934
+ const __iconNode$i = [
3935
+ ["path", { d: "m13.5 8.5-5 5", key: "1cs55j" }],
3936
+ ["path", { d: "m8.5 8.5 5 5", key: "a8mexj" }],
3937
+ ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }],
3938
+ ["path", { d: "m21 21-4.3-4.3", key: "1qie3q" }]
3939
+ ];
3940
+ const SearchX = createLucideIcon("search-x", __iconNode$i);
3912
3941
 
3913
3942
  /**
3914
3943
  * @license lucide-react v0.539.0 - ISC
@@ -15416,19 +15445,66 @@ function ApiComboBox({ contactType, selectedItem, onSelect, fetchBusinessContact
15416
15445
  : '', fetchPage: fetchPage, resolveById: resolveById, preSelectedId: customerCode, searchPlaceholder: searchPlaceholder, emptyMessage: "No business contacts found.", disabled: disabled, className: className, align: align, debounceMs: 300, hideTriggerSearchIcon: hideTriggerSearchIcon }));
15417
15446
  }
15418
15447
 
15419
- const NUMBER = String.raw `(\d+(?:\.\d+)?|\.\d+)`;
15448
+ // A number with an optional `k` (thousand), `M` (million) or `B` (billion), any case, e.g. `1.5`, `2k`, `1.2M`.
15449
+ const NUMBER = String.raw `((?:\d+(?:\.\d+)?|\.\d+)[kKmMbB]?)`;
15450
+ const SUFFIX_MULTIPLIER = {
15451
+ k: 1000,
15452
+ m: 1000000,
15453
+ b: 1000000000,
15454
+ };
15455
+ function toExpressionNumber(raw) {
15456
+ const suffix = raw.slice(-1).toLowerCase();
15457
+ const multiplier = SUFFIX_MULTIPLIER[suffix];
15458
+ return multiplier
15459
+ ? Math.round(Number(raw.slice(0, -1)) * multiplier * 1e6) / 1e6
15460
+ : Number(raw);
15461
+ }
15420
15462
  const COMPARISON_RE = new RegExp(`^(>=|<=|>|<)${NUMBER}$`);
15421
15463
  const BETWEEN_RE = new RegExp(`^${NUMBER}-${NUMBER}$`);
15422
15464
  const EXACT_RE = new RegExp(`^${NUMBER}$`);
15423
- const NUMBER_EXPRESSION_HELP = [
15424
- { rule: '>1', meaning: 'More than 1' },
15425
- { rule: '<3', meaning: 'Less than 3' },
15426
- { rule: '>=1.5', meaning: '1.5 or more' },
15427
- { rule: '<=3', meaning: '3 or less' },
15428
- { rule: '1–3', meaning: 'Between 1 and 3, inclusive' },
15429
- { rule: '1.52', meaning: 'Exactly 1.52' },
15465
+ /** Neutral defaults for a number column with no known scale. */
15466
+ const DEFAULT_NUMBER_RULE_EXAMPLES = {
15467
+ low: 1,
15468
+ high: 10,
15469
+ exact: 5,
15470
+ };
15471
+ const SHORT_SCALES = [
15472
+ [1000000000, 'B'],
15473
+ [1000000, 'M'],
15474
+ [1000, 'k'],
15430
15475
  ];
15431
- /** Parses the typed rules in `NUMBER_EXPRESSION_HELP`. Accepts `-`, `–` or `—` for ranges and ignores spaces and thousands commas. */
15476
+ /** Rule text for a value: `1k`, `2.5k`, `1M`, `1B` so chips stay short; the parser reads them back. */
15477
+ function formatRuleNumber(value) {
15478
+ const [divisor, suffix] = SHORT_SCALES.find(([scale]) => Math.abs(value) >= scale) ?? [1, ''];
15479
+ const scaled = Math.round((value / divisor) * 100) / 100;
15480
+ return `${scaled}${suffix}`;
15481
+ }
15482
+ function formatRuleValue(value, unit) {
15483
+ const number = value.toLocaleString('en-US', { maximumFractionDigits: 2 });
15484
+ if (!unit)
15485
+ return number;
15486
+ return unit === '%' ? `${number}%` : `${number} ${unit}`;
15487
+ }
15488
+ /** The help popover's rule list for a column's typical range; rules use short numbers (`1k`) that the field accepts as typed. */
15489
+ function buildNumberRuleHelp({ low, high, exact, unit, } = DEFAULT_NUMBER_RULE_EXAMPLES) {
15490
+ const lowText = formatRuleValue(low, unit);
15491
+ const highText = formatRuleValue(high, unit);
15492
+ const lowRule = formatRuleNumber(low);
15493
+ const highRule = formatRuleNumber(high);
15494
+ // Smallest value first: the low bound, the range, a value inside it, then the high bound.
15495
+ return [
15496
+ { rule: `>${lowRule}`, meaning: `More than ${lowText}` },
15497
+ { rule: `>=${lowRule}`, meaning: `${lowText} or more` },
15498
+ { rule: `${lowRule}–${highRule}`, meaning: `${lowText} to ${highText}` },
15499
+ {
15500
+ rule: formatRuleNumber(exact),
15501
+ meaning: `Exactly ${formatRuleValue(exact, unit)}`,
15502
+ },
15503
+ { rule: `<${highRule}`, meaning: `Less than ${highText}` },
15504
+ { rule: `<=${highRule}`, meaning: `${highText} or less` },
15505
+ ];
15506
+ }
15507
+ /** Parses the typed rules listed by `buildNumberRuleHelp`. Accepts `-`, `–` or `—` for ranges and ignores spaces and thousands commas. */
15432
15508
  function parseNumberExpression(text) {
15433
15509
  const normalized = text.replace(/[\s,]/g, '').replace(/[–—]/g, '-');
15434
15510
  if (!normalized)
@@ -15436,7 +15512,7 @@ function parseNumberExpression(text) {
15436
15512
  const comparison = COMPARISON_RE.exec(normalized);
15437
15513
  if (comparison) {
15438
15514
  const [, operator, raw] = comparison;
15439
- const value = Number(raw);
15515
+ const value = toExpressionNumber(raw);
15440
15516
  if (operator.startsWith('>')) {
15441
15517
  return {
15442
15518
  ok: true,
@@ -15447,13 +15523,13 @@ function parseNumberExpression(text) {
15447
15523
  }
15448
15524
  const between = BETWEEN_RE.exec(normalized);
15449
15525
  if (between) {
15450
- const min = Number(between[1]);
15451
- const max = Number(between[2]);
15526
+ const min = toExpressionNumber(between[1]);
15527
+ const max = toExpressionNumber(between[2]);
15452
15528
  return min <= max ? { ok: true, range: { min, max } } : { ok: false };
15453
15529
  }
15454
15530
  const exact = EXACT_RE.exec(normalized);
15455
15531
  if (exact) {
15456
- const value = Number(exact[1]);
15532
+ const value = toExpressionNumber(exact[1]);
15457
15533
  return { ok: true, range: { min: value, max: value } };
15458
15534
  }
15459
15535
  return { ok: false };
@@ -15624,6 +15700,18 @@ function isFilterValueActive(value) {
15624
15700
  const FILTER_FOCUS_RING = 'outline-none focus-visible:ring-2 focus-visible:ring-primary/30';
15625
15701
  /** Text-link actions such as Clear and "Show all". */
15626
15702
  const FILTER_LINK_CLASS_NAME = cn('cursor-pointer rounded-sm text-xs font-medium text-primary hover:underline', FILTER_FOCUS_RING);
15703
+ /** One look for every pickable row in a filter (list rows, Yes/No, date presets, number rules). */
15704
+ function getOptionRowClassName(selected = false, className) {
15705
+ return cn('flex w-full cursor-pointer items-center gap-3 rounded-md px-2 py-2 text-left text-sm text-foreground transition-colors', FILTER_FOCUS_RING, selected ? 'bg-primary/5 font-medium text-primary' : 'hover:bg-muted/60', className);
15706
+ }
15707
+ /** A selectable pill (chip options, range presets); one height and shape everywhere. */
15708
+ function getPillClassName(selected) {
15709
+ return getSelectableOptionClassName(selected, 'inline-flex h-8 items-center gap-1.5 rounded-full px-3');
15710
+ }
15711
+ /** Search box above a list (pick lists, saved searches); matches the inputs' height and corners. */
15712
+ const FILTER_SEARCH_BOX_CLASS_NAME = 'flex h-9 items-center gap-2 rounded-md border border-input bg-card px-3 focus-within:border-primary focus-within:ring-2 focus-within:ring-primary/30';
15713
+ /** Solid count bubble, e.g. a filter button's or card title's selected count. */
15714
+ const FILTER_COUNT_BADGE_CLASS_NAME = 'inline-flex h-5 min-w-5 shrink-0 items-center justify-center rounded-full bg-primary px-1.5 text-xs font-semibold leading-none text-primary-foreground';
15627
15715
  /** A fixed column count, or (when omitted) as many columns as fit at `minWidth` each. */
15628
15716
  function getGridColumnsStyle(columns, minWidth = '7rem') {
15629
15717
  return {
@@ -15640,7 +15728,7 @@ function getSelectableOptionClassName(selected, className) {
15640
15728
  }
15641
15729
  /** Shared look of every filter-row control (trigger buttons and inline inputs). */
15642
15730
  function getFilterFieldClassName(state, className) {
15643
- return cn('flex h-7 w-full min-w-0 items-center gap-1 rounded-sm border px-2 text-xs transition-colors outline-none', 'focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30', state === 'empty' &&
15731
+ return cn('flex h-7 w-full min-w-0 items-center gap-1 rounded-md border px-2 text-xs transition-colors outline-none', 'focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30', state === 'empty' &&
15644
15732
  'border-input bg-card text-foreground placeholder:text-placeholder', state === 'applied' &&
15645
15733
  'border-primary bg-primary/5 font-medium text-primary', state === 'invalid' && 'border-destructive bg-card text-destructive', state === 'disabled' &&
15646
15734
  'pointer-events-none border-dashed border-border bg-transparent', className);
@@ -15658,7 +15746,7 @@ function getTitleClassName(variant) {
15658
15746
  /** Shell for one filter: title, selected badge, applied summary, Clear and a hint. Same content in popovers and on full-page surfaces. */
15659
15747
  function FilterPanel({ title, status, selectedCount, summary, action, onClear, hint, active = false, variant = 'card', className, children, }) {
15660
15748
  const hasHeader = Boolean(title || status || summary || action || onClear);
15661
- return (jsxs("section", { className: getPanelClassName(variant, active, className), children: [hasHeader && (jsxs("header", { className: "flex min-h-5 items-center justify-between gap-3", children: [title ? (jsxs("h3", { className: getTitleClassName(variant), children: [title, selectedCount ? (jsx("span", { className: "inline-flex size-5 items-center justify-center rounded-full bg-primary text-xs font-semibold text-primary-foreground", children: selectedCount })) : null] })) : (jsx("span", { className: "text-xs text-muted-foreground", children: status })), jsxs("div", { className: "flex items-center gap-3 text-xs", children: [summary && (jsx("span", { className: "font-medium text-primary", children: summary })), action, onClear && (jsx("button", { type: "button", onClick: onClear, className: FILTER_LINK_CLASS_NAME, children: "Clear" }))] })] })), children, hint && jsx("p", { className: "text-xs text-muted-foreground", children: hint })] }));
15749
+ return (jsxs("section", { className: getPanelClassName(variant, active, className), children: [hasHeader && (jsxs("header", { className: "flex min-h-5 items-center justify-between gap-3", children: [title ? (jsxs("h3", { className: getTitleClassName(variant), children: [title, selectedCount ? (jsx("span", { className: FILTER_COUNT_BADGE_CLASS_NAME, children: selectedCount })) : null] })) : (jsx("span", { className: "text-xs text-muted-foreground", children: status })), jsxs("div", { className: "flex items-center gap-3 text-xs", children: [summary && (jsx("span", { className: "font-medium text-primary", children: summary })), action, onClear && (jsx("button", { type: "button", onClick: onClear, className: FILTER_LINK_CLASS_NAME, children: "Clear" }))] })] })), children, hint && jsx("p", { className: "text-xs text-muted-foreground", children: hint })] }));
15662
15750
  }
15663
15751
 
15664
15752
  function Checkbox({ className, ...props }) {
@@ -15720,7 +15808,9 @@ const OVERFLOW_TOLERANCE_PX = 1;
15720
15808
  function findClippedLabel(root) {
15721
15809
  const spans = root.querySelectorAll(':scope > span');
15722
15810
  for (const span of Array.from(spans)) {
15723
- if (span.scrollWidth > span.clientWidth + OVERFLOW_TOLERANCE_PX) {
15811
+ // Width for a single-line ellipsis; height for a multi-line clamp.
15812
+ if (span.scrollWidth > span.clientWidth + OVERFLOW_TOLERANCE_PX ||
15813
+ span.scrollHeight > span.clientHeight + OVERFLOW_TOLERANCE_PX) {
15724
15814
  return span;
15725
15815
  }
15726
15816
  }
@@ -15780,11 +15870,9 @@ function filterOptionsByQuery(options, query) {
15780
15870
  return [...options];
15781
15871
  return options.filter((option) => option.label.toLowerCase().includes(needle));
15782
15872
  }
15783
- function getChipClassName(selected) {
15784
- return getSelectableOptionClassName(selected, 'inline-flex h-8 items-center gap-1.5 rounded-full px-3');
15785
- }
15873
+ const getChipClassName = getPillClassName;
15786
15874
  function getTileClassName(selected) {
15787
- return getSelectableOptionClassName(selected, 'flex min-h-11 min-w-0 flex-col items-center justify-center gap-0.5 rounded-md px-2 py-1.5 text-center');
15875
+ return getSelectableOptionClassName(selected, 'flex min-h-12 min-w-0 flex-col items-center justify-center gap-0.5 rounded-md px-2 py-1.5 text-center');
15788
15876
  }
15789
15877
  /** The list's search box only appears once there are enough options to need it. */
15790
15878
  const SEARCH_MIN_OPTIONS = 9;
@@ -15796,10 +15884,18 @@ const FILL_WRAPPER_CLASS_NAME = 'flex min-h-0 flex-1 flex-col';
15796
15884
  /** Card lists flow into as many columns as fit; popover lists stay one column. */
15797
15885
  const LIST_COLUMN_MIN_WIDTH = '10rem';
15798
15886
  const getOptionsScrollClassName = (fill) => fill ? OPTIONS_FILL_CLASS_NAME : OPTIONS_SCROLL_CLASS_NAME;
15799
- const LIST_ROW_CLASS_NAME = 'flex w-full cursor-pointer items-center gap-3 rounded-md px-2 py-2 text-sm text-foreground hover:bg-muted/50';
15887
+ const LIST_ROW_CLASS_NAME = getOptionRowClassName();
15888
+ /** Picking a value: a single-choice list replaces (or clears) it, a multi-choice list toggles it. */
15889
+ const pickValue = (values, value, single) => {
15890
+ if (!single)
15891
+ return toggleValue(values, value);
15892
+ return values.includes(value) ? [] : [value];
15893
+ };
15894
+ /** The single-choice counterpart of the checkbox: same size, primary dot when picked. */
15895
+ const LIST_RADIO_CLASS_NAME = 'size-4.5 shrink-0 cursor-pointer accent-primary';
15800
15896
  /** Outlined (not filled) box until checked; the border is dark enough to read on white. */
15801
15897
  const LIST_CHECKBOX_CLASS_NAME = 'size-4.5 border-muted-foreground/50 bg-card dark:border-muted-foreground/60 dark:bg-transparent';
15802
- const SEARCH_BOX_CLASS_NAME = 'flex h-9 items-center gap-2 rounded-lg border border-input bg-card px-3 focus-within:border-primary focus-within:ring-2 focus-within:ring-primary/30';
15898
+ const SEARCH_BOX_CLASS_NAME = FILTER_SEARCH_BOX_CLASS_NAME;
15803
15899
 
15804
15900
  function usePickListFilter({ options, value, layout, }) {
15805
15901
  const [query, setQuery] = useState('');
@@ -15816,17 +15912,18 @@ function OptionSwatch({ color, round, }) {
15816
15912
  return (jsx("span", { "aria-hidden": "true", className: cn('shrink-0 border border-border', round ? 'size-2.5 rounded-full' : 'size-4 rounded-sm'), style: { backgroundColor: color } }));
15817
15913
  }
15818
15914
  /** Multi-select filter: a searchable checkbox list, or pill / tile toggles. Long sets scroll within a max height. */
15819
- function PickListFilter({ options, value, onChange, ariaLabel, layout = 'list', searchPlaceholder, alwaysSearchable = false, columns = 5, fill = false, listClassName, }) {
15915
+ function PickListFilter({ options, value, onChange, ariaLabel, layout = 'list', searchPlaceholder, alwaysSearchable = false, columns = 5, fill = false, listClassName, single = false, }) {
15820
15916
  const { query, setQuery, visibleOptions, selectedCount } = usePickListFilter({
15821
15917
  options,
15822
15918
  value,
15823
15919
  layout,
15824
15920
  });
15921
+ const radioName = useId$2();
15825
15922
  const scrollClassName = getOptionsScrollClassName(fill);
15826
15923
  // Rows with a right-hand hint read best in one column.
15827
15924
  const multiColumn = fill && !options.some((option) => option.hint);
15828
15925
  const wrapperClassName = fill ? FILL_WRAPPER_CLASS_NAME : undefined;
15829
- const toggle = (option) => onChange(toggleValue(value, option.value));
15926
+ const toggle = (option) => onChange(pickValue(value, option.value, single));
15830
15927
  if (options.length === 0) {
15831
15928
  return (jsx("p", { className: "px-1 py-2 text-xs text-muted-foreground", children: "No options available" }));
15832
15929
  }
@@ -15834,7 +15931,9 @@ function PickListFilter({ options, value, onChange, ariaLabel, layout = 'list',
15834
15931
  return (jsxs("div", { className: cn('flex flex-col gap-2', fill && FILL_WRAPPER_CLASS_NAME), "aria-label": ariaLabel, role: "group", children: [searchPlaceholder !== undefined &&
15835
15932
  (alwaysSearchable || options.length >= SEARCH_MIN_OPTIONS) && (jsxs("label", { className: SEARCH_BOX_CLASS_NAME, children: [jsx(Search, { "aria-hidden": "true", className: "size-4 shrink-0 text-muted-foreground" }), jsx("input", { value: query, onChange: (event) => setQuery(event.target.value), placeholder: searchPlaceholder, "aria-label": getSearchInputLabel(ariaLabel), className: "min-w-0 flex-1 bg-transparent text-sm text-foreground outline-none placeholder:text-placeholder" })] })), jsxs("div", { className: "flex items-center justify-between px-1 text-xs text-muted-foreground", children: [jsx("span", { children: formatSelectedCount(selectedCount, options.length) }), selectedCount > 0 && (jsx("button", { type: "button", onClick: () => onChange([]), className: FILTER_LINK_CLASS_NAME, children: "Clear" }))] }), jsx(ScrollFade, { className: cn(multiColumn && 'grid content-start gap-x-3', scrollClassName, listClassName), style: multiColumn
15836
15933
  ? getGridColumnsStyle(undefined, LIST_COLUMN_MIN_WIDTH)
15837
- : undefined, wrapperClassName: wrapperClassName, children: visibleOptions.map((option) => (jsxs("label", { className: LIST_ROW_CLASS_NAME, children: [jsx(Checkbox, { className: LIST_CHECKBOX_CLASS_NAME, checked: value.includes(option.value), onCheckedChange: () => toggle(option) }), jsx(OptionSwatch, { color: option.swatch }), option.content ? (jsx("span", { className: "min-w-0 flex-1", children: option.content })) : (jsx(TruncatedLabel, { text: option.label, className: "flex-1" })), (option.count ?? option.hint) !== undefined && (jsx("span", { className: "shrink-0 text-muted-foreground tabular-nums", children: option.count ?? option.hint }))] }, option.value))) })] }));
15934
+ : undefined, wrapperClassName: wrapperClassName, children: visibleOptions.map((option) => (jsxs("label", { className: LIST_ROW_CLASS_NAME, children: [single ? (jsx("input", { type: "radio", name: radioName, checked: value.includes(option.value),
15935
+ // A click on the picked row clears it (radios can't be unticked natively).
15936
+ onClick: () => toggle(option), onChange: () => undefined, className: LIST_RADIO_CLASS_NAME })) : (jsx(Checkbox, { className: LIST_CHECKBOX_CLASS_NAME, checked: value.includes(option.value), onCheckedChange: () => toggle(option) })), option.content ? (jsx("span", { className: "min-w-0 flex-1", children: option.content })) : (jsx(TruncatedLabel, { text: option.label, className: "flex-1" })), (option.count ?? option.hint) !== undefined && (jsx("span", { className: "shrink-0 text-muted-foreground tabular-nums", children: option.count ?? option.hint })), jsx(OptionSwatch, { color: option.swatch })] }, option.value))) })] }));
15838
15937
  }
15839
15938
  if (layout === 'tiles') {
15840
15939
  return (jsx(ScrollFade, { role: "group", "aria-label": ariaLabel, wrapperClassName: wrapperClassName, className: cn('grid content-start gap-1.5', scrollClassName), style: getGridColumnsStyle(columns), children: visibleOptions.map((option) => (jsxs("button", { type: "button", "aria-pressed": value.includes(option.value), onClick: () => toggle(option), className: getTileClassName(value.includes(option.value)), children: [jsx(TruncatedLabel, { text: option.label }), option.count !== undefined && (jsx("span", { className: "text-xs font-normal text-muted-foreground", children: option.count }))] }, option.value))) }));
@@ -15843,7 +15942,7 @@ function PickListFilter({ options, value, onChange, ariaLabel, layout = 'list',
15843
15942
  }
15844
15943
 
15845
15944
  const TRIGGER_BASE = 'h-9 !w-fit shadow-[0_1px_2px_0_rgba(0,0,0,0.05)] gap-2 text-foreground bg-card hover:bg-muted/40 border border-border rounded-lg text-sm font-medium px-3';
15846
- const TRIGGER_ACTIVE = '!border-primary text-primary shadow-[0_0_0_3px_rgba(49,122,81,0.10)]';
15945
+ const TRIGGER_ACTIVE = '!border-primary bg-primary/5 text-primary';
15847
15946
  const CONTENT_BASE = 'min-w-[8rem]';
15848
15947
  const isFilterActive = (value, resetValue) => !!value && value !== resetValue;
15849
15948
  function collectText(node) {
@@ -15874,7 +15973,7 @@ const toPickListOptions = (options) => options.map((option) => typeof option.lab
15874
15973
  const FilterMultiSelect = ({ label, value, onChange, options, triggerClassName, contentClassName, listClassName, modal = false, pickListLayout = 'list', searchPlaceholder, }) => {
15875
15974
  const active = value.length > 0;
15876
15975
  const isList = pickListLayout === 'list';
15877
- return (jsxs(Popover, { modal: modal, children: [jsx(PopoverTrigger, { className: cn(TRIGGER_BASE, 'inline-flex items-center justify-between', active && TRIGGER_ACTIVE, triggerClassName), children: jsxs("span", { className: "flex items-center gap-2", children: [jsx(Funnel, { className: cn('h-4 w-4 shrink-0', active ? 'text-primary' : 'text-muted-foreground'), "aria-hidden": "true" }), label, active && (jsx("span", { className: "ml-1 inline-flex h-4 min-w-4 items-center justify-center rounded bg-primary/10 px-1 text-[10px] font-semibold leading-none text-primary", children: value.length }))] }) }), jsx(PopoverContent, { align: "start", sideOffset: 4, className: cn('w-64 p-0', contentClassName), children: jsx(FilterPanel, { variant: "popover",
15976
+ return (jsxs(Popover, { modal: modal, children: [jsx(PopoverTrigger, { className: cn(TRIGGER_BASE, 'inline-flex items-center justify-between', active && TRIGGER_ACTIVE, triggerClassName), children: jsxs("span", { className: "flex items-center gap-2", children: [jsx(Funnel, { className: cn('h-4 w-4 shrink-0', active ? 'text-primary' : 'text-muted-foreground'), "aria-hidden": "true" }), label, active && (jsx("span", { className: cn('ml-1', FILTER_COUNT_BADGE_CLASS_NAME), children: value.length }))] }) }), jsx(PopoverContent, { align: "start", sideOffset: 4, className: cn('w-64 p-0', contentClassName), children: jsx(FilterPanel, { variant: "popover",
15878
15977
  // A searchable list has its own "x of y selected · Clear" row.
15879
15978
  title: isList ? undefined : label, selectedCount: isList ? undefined : value.length, onClear: !isList && active ? () => onChange([]) : undefined, children: jsx(PickListFilter, { ariaLabel: label, layout: pickListLayout, options: toPickListOptions(options), value: value, onChange: onChange, searchPlaceholder: isList ? (searchPlaceholder ?? 'Search') : undefined, alwaysSearchable: true, listClassName: listClassName }) }) })] }));
15880
15979
  };
@@ -38109,7 +38208,7 @@ function SelectScrollDownButton({ className, ...props }) {
38109
38208
 
38110
38209
  const FilterSelect = ({ label, value, onValueChange, options, resetValue = 'all', activeCount = 1, searchable, triggerClassName, contentClassName, }) => {
38111
38210
  const active = isFilterActive(value, resetValue);
38112
- return (jsxs(Select, { value: value, onValueChange: onValueChange, keepOpenOnSelect: true, children: [jsxs(SelectTrigger, { className: cn(TRIGGER_BASE, active && TRIGGER_ACTIVE, triggerClassName), children: [jsx(Funnel, { className: cn('h-4 w-4 shrink-0', active ? 'text-primary' : 'text-muted-foreground'), "aria-hidden": "true" }), jsxs("span", { className: "flex items-center gap-1", children: [jsx(SelectValue, { placeholder: label }), active && (jsx("span", { className: "ml-1 inline-flex h-4 min-w-4 items-center justify-center rounded bg-primary/10 px-1 text-[10px] font-semibold leading-none text-primary", children: activeCount }))] })] }), jsxs(SelectContent, { className: cn(CONTENT_BASE, contentClassName), searchable: searchable, children: [jsx(SelectItem, { value: resetValue, withCheckbox: true, children: label }), options.map((opt) => (jsx(SelectItem, { value: opt.value, searchValue: opt.searchValue, withCheckbox: true, children: opt.label }, opt.value)))] })] }));
38211
+ return (jsxs(Select, { value: value, onValueChange: onValueChange, keepOpenOnSelect: true, children: [jsxs(SelectTrigger, { className: cn(TRIGGER_BASE, active && TRIGGER_ACTIVE, triggerClassName), children: [jsx(Funnel, { className: cn('h-4 w-4 shrink-0', active ? 'text-primary' : 'text-muted-foreground'), "aria-hidden": "true" }), jsxs("span", { className: "flex items-center gap-1", children: [jsx(SelectValue, { placeholder: label }), active && (jsx("span", { className: cn('ml-1', FILTER_COUNT_BADGE_CLASS_NAME), children: activeCount }))] })] }), jsxs(SelectContent, { className: cn(CONTENT_BASE, contentClassName), searchable: searchable, children: [jsx(SelectItem, { value: resetValue, withCheckbox: true, children: label }), options.map((opt) => (jsx(SelectItem, { value: opt.value, searchValue: opt.searchValue, withCheckbox: true, children: opt.label }, opt.value)))] })] }));
38113
38212
  };
38114
38213
 
38115
38214
  /**
@@ -38458,7 +38557,7 @@ const getRemoveChipLabel = (label) => `Remove ${label} filter`;
38458
38557
  const FILTERED_BY_LABEL = 'Filtered by';
38459
38558
 
38460
38559
  /** Compact badge shape with the filter chip colours. */
38461
- const CHIP_CLASS = 'inline-flex h-6 max-w-full items-center gap-1 rounded-md border border-primary/30 bg-primary/5 px-2 text-xs text-foreground';
38560
+ const CHIP_CLASS = 'inline-flex h-7 max-w-full items-center gap-1 rounded-md border border-primary/30 bg-primary/5 px-2.5 text-xs text-foreground';
38462
38561
  const REMOVE_BUTTON_CLASS = 'inline-flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-full text-muted-foreground outline-none hover:bg-primary/10 hover:text-foreground focus-visible:ring-2 focus-visible:ring-primary/30';
38463
38562
  const CLEAR_ALL_CLASS = cn(FILTER_LINK_CLASS_NAME, 'underline');
38464
38563
  function getChipLabelText(label, variant) {
@@ -38466,10 +38565,13 @@ function getChipLabelText(label, variant) {
38466
38565
  }
38467
38566
 
38468
38567
  /** Applied filters as removable chips, with an optional Clear all. */
38469
- function ActiveFilterChips({ chips, onRemove, onClearAll, variant = 'inline', className, }) {
38568
+ function ActiveFilterChips({ chips, onRemove, onClearAll, variant = 'inline', actions, className, }) {
38470
38569
  if (chips.length === 0)
38471
38570
  return null;
38472
- return (jsxs("div", { className: cn('flex flex-wrap items-center gap-1.5', className), children: [variant === 'inline' && (jsx("span", { className: "mr-0.5 text-xs text-muted-foreground", children: FILTERED_BY_LABEL })), chips.map((chip) => (jsxs("span", { className: CHIP_CLASS, children: [jsx("span", { className: "shrink-0 font-semibold", children: getChipLabelText(chip.label, variant) }), jsx(TruncatedLabel, { text: chip.value }), onRemove && (jsx("button", { type: "button", "aria-label": getRemoveChipLabel(chip.label), onClick: () => onRemove(chip.id), className: REMOVE_BUTTON_CLASS, children: jsx(X$2, { "aria-hidden": "true", className: "size-3" }) }))] }, chip.id))), onClearAll && (jsx("button", { type: "button", onClick: onClearAll, className: CLEAR_ALL_CLASS, children: "Clear all" }))] }));
38571
+ const clearAll = onClearAll && (jsx("button", { type: "button", onClick: onClearAll, className: CLEAR_ALL_CLASS, children: "Clear all" }));
38572
+ return (jsxs("div", { className: cn('flex flex-wrap items-center gap-1.5', className), children: [variant === 'inline' && (jsx("span", { className: "mr-0.5 text-xs text-muted-foreground", children: FILTERED_BY_LABEL })), chips.map((chip) => (jsxs("span", { className: CHIP_CLASS, children: [jsx("span", { className: "shrink-0 font-semibold", children: getChipLabelText(chip.label, variant) }), jsx(TruncatedLabel, { text: chip.value }), onRemove && (jsx("button", { type: "button", "aria-label": getRemoveChipLabel(chip.label), onClick: () => onRemove(chip.id), className: REMOVE_BUTTON_CLASS, children: jsx(X$2, { "aria-hidden": "true", className: "size-3" }) }))] }, chip.id))), actions ? (
38573
+ // With actions, Clear all joins them at the row's right end.
38574
+ jsxs("div", { className: "ml-auto flex items-center gap-3 pl-3", children: [clearAll, actions] })) : (clearAll)] }));
38473
38575
  }
38474
38576
 
38475
38577
  const DEFAULT_CONTAINS_PLACEHOLDER = 'Contains…';
@@ -38585,9 +38687,7 @@ function togglePreset(value, preset) {
38585
38687
  return value?.preset === preset ? undefined : { preset };
38586
38688
  }
38587
38689
  /** Preset row; the picked one gets the primary tint, as in the design. */
38588
- function getPresetClassName$1(selected) {
38589
- return cn('w-full cursor-pointer whitespace-nowrap rounded-md px-3 py-2 text-left text-sm text-foreground transition-colors', FILTER_FOCUS_RING, selected ? 'bg-primary/5 font-semibold text-primary' : 'hover:bg-muted/60');
38590
- }
38690
+ const getPresetClassName$1 = (selected) => getOptionRowClassName(selected, 'whitespace-nowrap');
38591
38691
 
38592
38692
  const toIsoOrEmpty = (date) => date ? toIsoDate(date) : '';
38593
38693
  function useDateRangeFilter(value, onChange, today, fiscalYearStartMonth) {
@@ -38605,7 +38705,11 @@ function useDateRangeFilter(value, onChange, today, fiscalYearStartMonth) {
38605
38705
  /** Date filter body: presets on the left, a From / To range on the right. */
38606
38706
  function DateRangeFilter({ value, onChange, ariaLabel, fiscalYearStartMonth = 1, today = new Date(), }) {
38607
38707
  const { from, to, selectPreset, handleFromChange, handleToChange, clear } = useDateRangeFilter(value, onChange, today, fiscalYearStartMonth);
38608
- return (jsxs("div", { className: "grid grid-cols-[auto_minmax(0,1fr)] divide-x divide-border text-xs", children: [jsx("div", { role: "group", "aria-label": getPresetGroupLabel(ariaLabel), className: "flex flex-col gap-1 pr-3", children: DATE_PRESET_OPTIONS.map((preset) => (jsx("button", { type: "button", "aria-pressed": value?.preset === preset.value, onClick: () => selectPreset(preset.value), className: getPresetClassName$1(value?.preset === preset.value), children: preset.label }, preset.value))) }), jsxs("div", { className: "flex min-w-0 flex-col gap-3 pl-3", children: [jsxs("label", { className: "flex min-w-0 flex-col gap-1 text-muted-foreground", children: ["From", jsx(DateInput, { value: fromIsoDate(from), max: to || undefined, ariaLabel: getDateInputLabel(ariaLabel, 'from'), onChange: handleFromChange })] }), jsxs("label", { className: "flex min-w-0 flex-col gap-1 text-muted-foreground", children: ["To", jsx(DateInput, { value: fromIsoDate(to), min: from || undefined, ariaLabel: getDateInputLabel(ariaLabel, 'to'), onChange: handleToChange, align: "end" })] }), value && (jsx("button", { type: "button", onClick: clear, className: cn('self-start', FILTER_LINK_CLASS_NAME), children: "Clear" }))] })] }));
38708
+ return (jsxs("div", { className: "grid grid-cols-[auto_minmax(0,1fr)] divide-x divide-border text-xs", children: [jsx("div", { role: "group", "aria-label": getPresetGroupLabel(ariaLabel), className: "flex flex-col gap-1 pr-3", children: DATE_PRESET_OPTIONS.map((preset) => (jsx("button", { type: "button", "aria-pressed": value?.preset === preset.value, onClick: () => selectPreset(preset.value), className: getPresetClassName$1(value?.preset === preset.value), children: preset.label }, preset.value))) }), jsxs("div", { className: "flex min-w-0 flex-col gap-3 pl-3", children: [jsxs("label", { className: "flex min-w-0 flex-col gap-1 text-muted-foreground", children: ["From", jsx(DateInput
38709
+ // The inputs sit on the card's right; an end-aligned calendar stays under them.
38710
+ , {
38711
+ // The inputs sit on the card's right; an end-aligned calendar stays under them.
38712
+ align: "end", value: fromIsoDate(from), max: to || undefined, ariaLabel: getDateInputLabel(ariaLabel, 'from'), onChange: handleFromChange })] }), jsxs("label", { className: "flex min-w-0 flex-col gap-1 text-muted-foreground", children: ["To", jsx(DateInput, { value: fromIsoDate(to), min: from || undefined, ariaLabel: getDateInputLabel(ariaLabel, 'to'), onChange: handleToChange, align: "end" })] }), value && (jsx("button", { type: "button", onClick: clear, className: cn('self-start', FILTER_LINK_CLASS_NAME), children: "Clear" }))] })] }));
38609
38713
  }
38610
38714
 
38611
38715
  const getClearButtonLabel = (ariaLabel) => `Clear ${ariaLabel}`;
@@ -38616,7 +38720,7 @@ function FilterCellPopover({ label, placeholder, ariaLabel, state, disabledLabel
38616
38720
  if (state === 'disabled') {
38617
38721
  return (jsx(TooltipProvider, { delayDuration: 200, children: jsxs(Tooltip, { children: [jsx(TooltipTrigger, { asChild: true, children: jsx("span", { tabIndex: 0, "aria-label": disabledLabel, className: "block outline-none", children: jsx("div", { role: "presentation", className: getFilterFieldClassName('disabled', className) }) }) }), jsx(TooltipContent, { side: "top", children: disabledLabel })] }) }));
38618
38722
  }
38619
- return (jsxs(Popover, { open: open, onOpenChange: onOpenChange, children: [jsx(PopoverAnchor, { asChild: true, children: jsxs("div", { className: getFilterFieldClassName(state, cn('pr-1 focus-within:ring-2 focus-within:ring-primary/30', className)), children: [jsxs(PopoverTrigger, { "aria-label": ariaLabel, className: "flex h-full min-w-0 flex-1 cursor-pointer items-center gap-1 text-left outline-none", children: [icon && jsx("span", { className: "shrink-0 [&_svg]:size-3.5", children: icon }), jsx(TruncatedLabel, { text: label || placeholder, className: cn('min-w-0 flex-1', !label && 'font-normal text-placeholder') }), showChevron && (jsx(ChevronDown, { "aria-hidden": "true", className: "size-3.5 shrink-0 text-muted-foreground" }))] }), onClear && label && (jsx("button", { type: "button", "aria-label": getClearButtonLabel(ariaLabel), onClick: onClear, className: "inline-flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-sm outline-none hover:bg-primary/10", children: jsx(X$2, { "aria-hidden": "true", className: "size-3" }) }))] }) }), jsx(PopoverContent, { align: "start",
38723
+ return (jsxs(Popover, { open: open, onOpenChange: onOpenChange, children: [jsx(PopoverAnchor, { asChild: true, children: jsxs("div", { className: getFilterFieldClassName(state, cn('pr-1 focus-within:ring-2 focus-within:ring-primary/30', className)), children: [jsxs(PopoverTrigger, { "aria-label": ariaLabel, className: "flex h-full min-w-0 flex-1 cursor-pointer items-center gap-1 text-left outline-none", children: [icon && jsx("span", { className: "shrink-0 [&_svg]:size-3.5", children: icon }), jsx(TruncatedLabel, { text: label || placeholder, className: cn('min-w-0 flex-1', !label && 'font-normal text-placeholder') }), showChevron && (jsx(ChevronDown, { "aria-hidden": "true", className: "size-3.5 shrink-0 text-muted-foreground" }))] }), onClear && label && (jsx("button", { type: "button", "aria-label": getClearButtonLabel(ariaLabel), onClick: onClear, className: "inline-flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-full outline-none hover:bg-primary/10", children: jsx(X$2, { "aria-hidden": "true", className: "size-3" }) }))] }) }), jsx(PopoverContent, { align: "start",
38620
38724
  // The filter row moves when the "Filtered by" row appears; track it every frame so the popover never lags behind.
38621
38725
  updatePositionStrategy: "always", sideOffset: 4, className: cn('w-72 p-0', contentClassName), children: children })] }));
38622
38726
  }
@@ -38692,10 +38796,40 @@ function ScaleRangeFilter({ options, value, onChange, ariaLabel, columns, fill =
38692
38796
  const { selectOption } = useScaleRangeFilter({ value, onChange });
38693
38797
  return (jsx("div", { role: "group", "aria-label": ariaLabel, className: fill ? 'grid gap-2' : 'grid gap-1.5', style: getGridColumnsStyle(columns), children: options.map((option) => {
38694
38798
  const position = getScalePosition(options, value, option.value);
38695
- return (jsx("button", { type: "button", "aria-pressed": position !== 'outside', "aria-label": option.label, onClick: () => selectOption(option.value), className: getScaleButtonClassName(position, fill), children: jsx("span", { className: "line-clamp-2 leading-tight", children: option.label }) }, option.value));
38799
+ return (jsx("button", { type: "button", "aria-pressed": position !== 'outside', "aria-label": option.label, onClick: () => selectOption(option.value), className: getScaleButtonClassName(position, fill), children: jsx(TruncatedLabel, { text: option.label }) }, option.value));
38696
38800
  }) }));
38697
38801
  }
38698
38802
 
38803
+ /** Varied widths so placeholder rows and pills read as text, not a block. */
38804
+ const LIST_ROW_WIDTHS = ['55%', '40%', '62%', '48%', '35%'];
38805
+ const PILL_WIDTHS = [72, 88, 64, 96, 76, 84];
38806
+ const TILE_KEYS = ['a', 'b', 'c', 'd'];
38807
+ const CARD_CLASS_NAME = 'flex h-full min-w-0 flex-col gap-3 rounded-xl border border-border bg-card p-4';
38808
+
38809
+ function Pills({ count }) {
38810
+ return (jsx("div", { className: "flex flex-wrap gap-1.5", children: PILL_WIDTHS.slice(0, count).map((width) => (jsx(SquareSkeleton, { height: 32, width: width, rounded: "full" }, width))) }));
38811
+ }
38812
+ function Body({ variant, }) {
38813
+ switch (variant) {
38814
+ case 'list':
38815
+ return (jsxs(Fragment$2, { children: [jsx(SquareSkeleton, { height: 36, rounded: "md" }), jsx(SquareSkeleton, { height: 12, width: 96, rounded: "sm" }), jsx("div", { className: "flex flex-col gap-3 px-2 pt-1", children: LIST_ROW_WIDTHS.map((width) => (jsxs("div", { className: "flex items-center gap-3", children: [jsx(SquareSkeleton, { height: 18, width: 18, rounded: "sm" }), jsx(SquareSkeleton, { height: 14, width: width, rounded: "sm" })] }, width))) })] }));
38816
+ case 'chips':
38817
+ return (jsxs(Fragment$2, { children: [jsx(SquareSkeleton, { height: 12, width: 64, rounded: "sm" }), jsx(Pills, { count: 3 }), jsx(SquareSkeleton, { height: 12, width: 80, rounded: "sm" }), jsx(Pills, { count: 4 })] }));
38818
+ case 'tiles':
38819
+ return (jsx("div", { className: "grid grid-cols-2 gap-2", children: TILE_KEYS.map((key) => (jsx(SquareSkeleton, { height: 48, rounded: "md" }, key))) }));
38820
+ case 'range':
38821
+ return (jsxs(Fragment$2, { children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx(SquareSkeleton, { height: 36, rounded: "md" }), jsx(SquareSkeleton, { height: 2, width: 8, rounded: "full" }), jsx(SquareSkeleton, { height: 36, rounded: "md" })] }), jsx(SquareSkeleton, { height: 12, width: 88, rounded: "sm" }), jsx(Pills, { count: 6 })] }));
38822
+ case 'ids':
38823
+ return (jsxs(Fragment$2, { children: [jsx(SquareSkeleton, { height: 12, width: 64, rounded: "sm" }), jsx(SquareSkeleton, { height: 80, rounded: "md" }), jsx(SquareSkeleton, { height: 12, width: "75%", rounded: "sm" }), jsx(SquareSkeleton, { height: 12, width: 56, rounded: "sm" }), jsx(SquareSkeleton, { height: 36, rounded: "md" })] }));
38824
+ case 'select':
38825
+ return (jsxs(Fragment$2, { children: [jsx(SquareSkeleton, { height: 12, width: 64, rounded: "sm" }), jsx(SquareSkeleton, { height: 36, rounded: "md" })] }));
38826
+ }
38827
+ }
38828
+ /** Placeholder for one filter card while the filters load, shaped like the control it will hold. */
38829
+ function FilterCardSkeleton({ variant = 'list', className, }) {
38830
+ return (jsxs("div", { "aria-hidden": "true", className: cn(CARD_CLASS_NAME, className), children: [jsx(SquareSkeleton, { height: 16, width: 96, rounded: "sm" }), jsx(Body, { variant: variant })] }));
38831
+ }
38832
+
38699
38833
  const getClearIdsLabel = (ariaLabel) => `Clear ${ariaLabel}`;
38700
38834
 
38701
38835
  const DEFAULT_ID_HELPER_TEXT = 'Paste from Excel or an email. Commas, spaces and new lines all split IDs.';
@@ -38737,7 +38871,7 @@ function useIdListInput(value, onChange) {
38737
38871
  /** Paste-a-list body: a textarea split into IDs on commas, spaces and new lines, with the parsed IDs as chips. */
38738
38872
  function IdListInput({ value, onChange, ariaLabel, placeholder, helperText = DEFAULT_ID_HELPER_TEXT, showSummary = true, }) {
38739
38873
  const { draft, parsedIds, handleChange, handleBlur, clear } = useIdListInput(value, onChange);
38740
- return (jsxs("div", { className: "flex flex-col gap-2", children: [jsx(Textarea, { value: draft, placeholder: placeholder, "aria-label": ariaLabel, onChange: handleChange, onBlur: handleBlur, className: "min-h-20 bg-card" }), helperText && (jsx("p", { className: "text-xs text-muted-foreground", children: helperText })), showSummary && parsedIds.length > 0 && (jsxs(Fragment$2, { children: [jsx("ul", { className: "flex flex-wrap gap-1.5", children: parsedIds.map((id) => (jsx("li", { className: "inline-flex h-6 items-center rounded-full border border-primary/20 bg-primary/5 px-2 text-xs text-primary", children: id }, id))) }), jsxs("div", { className: "flex items-center justify-between text-xs", children: [jsx("span", { className: "text-muted-foreground", children: formatIdCount(parsedIds.length) }), jsx("button", { type: "button", "aria-label": getClearIdsLabel(ariaLabel), onClick: clear, className: FILTER_LINK_CLASS_NAME, children: "Clear" })] })] }))] }));
38874
+ return (jsxs("div", { className: "flex flex-col gap-2", children: [jsx(Textarea, { value: draft, placeholder: placeholder, "aria-label": ariaLabel, onChange: handleChange, onBlur: handleBlur, className: "min-h-20 bg-card" }), helperText && (jsx("p", { className: "text-xs text-muted-foreground", children: helperText })), showSummary && parsedIds.length > 0 && (jsxs(Fragment$2, { children: [jsx("ul", { className: "flex flex-wrap gap-1.5", children: parsedIds.map((id) => (jsx("li", { className: "inline-flex h-6 items-center rounded-full border border-primary/30 bg-primary/5 px-2 text-xs text-foreground", children: id }, id))) }), jsxs("div", { className: "flex items-center justify-between text-xs", children: [jsx("span", { className: "text-muted-foreground", children: formatIdCount(parsedIds.length) }), jsx("button", { type: "button", "aria-label": getClearIdsLabel(ariaLabel), onClick: clear, className: FILTER_LINK_CLASS_NAME, children: "Clear" })] })] }))] }));
38741
38875
  }
38742
38876
 
38743
38877
  const NUMBER_HELP_HEADING = 'Type a value or a rule';
@@ -38754,9 +38888,19 @@ function getNumberInputClassName(state, className) {
38754
38888
  return getFilterFieldClassName(state, cn('text-right tabular-nums', className));
38755
38889
  }
38756
38890
  /** Cheat-sheet row: the whole row is the click target, highlighted on hover. */
38757
- const RULE_BUTTON_CLASS_NAME = cn('flex h-8 w-full cursor-pointer items-center gap-3 rounded-md px-2 text-left text-xs transition-colors hover:bg-muted', FILTER_FOCUS_RING);
38891
+ const RULE_BUTTON_CLASS_NAME = getOptionRowClassName(false, 'py-1.5');
38758
38892
  /** Key-cap chip for the rule, fixed width so every meaning lines up. */
38759
- const RULE_CHIP_CLASS_NAME = 'inline-flex h-6 min-w-12 shrink-0 items-center justify-center rounded border border-border bg-background px-1.5 font-mono text-xs font-semibold text-foreground shadow-xs';
38893
+ // Every chip is as wide as the longest rule, so the meanings start at the same x.
38894
+ const RULE_CHIP_CLASS_NAME = 'inline-flex h-6 w-[calc(var(--rule-width)+1.25rem)] min-w-14 shrink-0 whitespace-nowrap items-center justify-center rounded-full border border-border bg-background px-2 text-xs font-semibold tabular-nums text-foreground';
38895
+ /** Note / error box in the help popover; text on a fixed 16px line. */
38896
+ const MESSAGE_CLASS_NAME = 'flex gap-2 rounded-md p-2 leading-4';
38897
+ /** One text line tall, so the icon centres on the first line however the text wraps. */
38898
+ const MESSAGE_ICON_SLOT_CLASS_NAME = 'flex h-4 shrink-0 items-center';
38899
+ /** Sets `--rule-width` to the longest rule, which sizes every chip in the list. */
38900
+ function getRuleListStyle(rules) {
38901
+ const longest = Math.max(...rules.map(({ rule }) => rule.length));
38902
+ return { '--rule-width': `${longest}ch` };
38903
+ }
38760
38904
 
38761
38905
  const COMMIT_DELAY_MS = 400;
38762
38906
  function useNumberExpressionFilter(value, onChange) {
@@ -38803,20 +38947,22 @@ function useNumberExpressionFilter(value, onChange) {
38803
38947
  handleChange,
38804
38948
  handleKeyDown,
38805
38949
  handleFocus: () => setHelpOpen(true),
38950
+ handleClick: () => setHelpOpen(true),
38806
38951
  handleBlur,
38807
38952
  applyRule,
38808
38953
  };
38809
38954
  }
38810
38955
 
38811
38956
  /** Filter-row number cell: type a value or a rule (`>1`, `1–3`, `1.52`). Invalid text never reaches the table. */
38812
- function NumberExpressionFilter({ value, onChange, ariaLabel, placeholder, note, className, }) {
38813
- const { draft, state, helpOpen, errorId, handleChange, handleKeyDown, handleFocus, handleBlur, applyRule, } = useNumberExpressionFilter(value, onChange);
38957
+ function NumberExpressionFilter({ value, onChange, ariaLabel, placeholder, note, ruleExamples, className, }) {
38958
+ const { draft, state, helpOpen, errorId, handleChange, handleKeyDown, handleFocus, handleClick, handleBlur, applyRule, } = useNumberExpressionFilter(value, onChange);
38814
38959
  const invalid = state === 'invalid';
38815
- return (jsxs(Popover, { open: helpOpen, children: [jsx(PopoverAnchor, { asChild: true, children: jsx("input", { type: "text", inputMode: "decimal", value: draft, placeholder: placeholder, "aria-label": ariaLabel, "aria-invalid": invalid || undefined, "aria-describedby": invalid ? getNumberErrorId(errorId) : undefined, onChange: handleChange, onKeyDown: handleKeyDown, onFocus: handleFocus, onBlur: handleBlur, className: getNumberInputClassName(state, className) }) }), jsxs(PopoverContent, { align: "start",
38960
+ const rules = buildNumberRuleHelp(ruleExamples);
38961
+ return (jsxs(Popover, { open: helpOpen, children: [jsx(PopoverAnchor, { asChild: true, children: jsx("input", { type: "text", inputMode: "decimal", value: draft, placeholder: placeholder, "aria-label": ariaLabel, "aria-invalid": invalid || undefined, "aria-describedby": invalid ? getNumberErrorId(errorId) : undefined, onChange: handleChange, onKeyDown: handleKeyDown, onFocus: handleFocus, onClick: handleClick, onBlur: handleBlur, className: getNumberInputClassName(state, className) }) }), jsxs(PopoverContent, { align: "start",
38816
38962
  // The filter row moves when the "Filtered by" row appears; track it every frame so the popover never lags behind.
38817
- updatePositionStrategy: "always", onOpenAutoFocus: (event) => event.preventDefault(), className: "flex w-72 flex-col gap-2 p-2 text-xs", children: [jsxs("div", { className: "px-2 pt-1", children: [jsx("p", { className: "font-medium text-foreground", children: NUMBER_HELP_HEADING }), jsx("p", { className: "text-muted-foreground", children: NUMBER_HELP_SUBTITLE })] }), jsx("ul", { className: "flex flex-col", children: NUMBER_EXPRESSION_HELP.map(({ rule, meaning }) => (jsx("li", { children: jsxs("button", { type: "button", "aria-label": getUseRuleLabel(rule, meaning),
38963
+ updatePositionStrategy: "always", onOpenAutoFocus: (event) => event.preventDefault(), className: "flex w-72 flex-col gap-2 p-2 text-xs", children: [jsxs("div", { className: "px-2 pt-1", children: [jsx("p", { className: "font-medium text-foreground", children: NUMBER_HELP_HEADING }), jsx("p", { className: "text-muted-foreground", children: NUMBER_HELP_SUBTITLE })] }), jsx("ul", { className: "flex flex-col", style: getRuleListStyle(rules), children: rules.map(({ rule, meaning }) => (jsx("li", { children: jsxs("button", { type: "button", "aria-label": getUseRuleLabel(rule, meaning),
38818
38964
  // Keep focus in the field so it doesn't blur and close this help first.
38819
- onMouseDown: (event) => event.preventDefault(), onClick: () => applyRule(rule), className: RULE_BUTTON_CLASS_NAME, children: [jsx("span", { className: RULE_CHIP_CLASS_NAME, children: rule }), jsx("span", { className: "whitespace-nowrap text-muted-foreground", children: meaning })] }) }, rule))) }), note && (jsxs("div", { className: "flex gap-2 rounded-md bg-muted/50 p-2 text-muted-foreground", children: [jsx(Info, { "aria-hidden": "true", className: "mt-0.5 size-3.5 shrink-0" }), jsx("div", { children: note })] })), invalid && (jsxs("div", { id: getNumberErrorId(errorId), role: "alert", className: "flex gap-2 rounded-md bg-destructive/10 p-2 text-destructive", children: [jsx(CircleAlert, { "aria-hidden": "true", className: "mt-0.5 size-3.5 shrink-0" }), jsxs("p", { children: ["Can't read \u201C", draft, "\u201D. Try ", jsx("strong", { children: "1\u20133" }), ",", ' ', jsx("strong", { children: ">1" }), " or ", jsx("strong", { children: "<=3" }), "."] })] }))] })] }));
38965
+ onMouseDown: (event) => event.preventDefault(), onClick: () => applyRule(rule), className: RULE_BUTTON_CLASS_NAME, children: [jsx("span", { className: RULE_CHIP_CLASS_NAME, children: rule }), jsx("span", { className: "whitespace-nowrap text-muted-foreground", children: meaning })] }) }, rule))) }), note && (jsxs("div", { className: cn(MESSAGE_CLASS_NAME, 'bg-muted/50 text-muted-foreground'), children: [jsx("span", { className: MESSAGE_ICON_SLOT_CLASS_NAME, children: jsx(Info, { "aria-hidden": "true", className: "size-3.5" }) }), jsx("div", { children: note })] })), invalid && (jsxs("div", { id: getNumberErrorId(errorId), role: "alert", className: cn(MESSAGE_CLASS_NAME, 'bg-destructive/10 text-destructive'), children: [jsx("span", { className: MESSAGE_ICON_SLOT_CLASS_NAME, children: jsx(CircleAlert, { "aria-hidden": "true", className: "size-3.5" }) }), jsxs("p", { children: ["Can't read \u201C", draft, "\u201D. Try ", jsx("strong", { children: "1\u20133" }), ",", ' ', jsx("strong", { children: ">1" }), " or ", jsx("strong", { children: "<=3" }), "."] })] }))] })] }));
38820
38966
  }
38821
38967
 
38822
38968
  const REVERSED_RANGE_MESSAGE = 'From must not be more than To.';
@@ -38857,9 +39003,7 @@ function isSameRange(a, b) {
38857
39003
  function getBoundInputClassName(filled) {
38858
39004
  return cn('h-9 min-w-0 flex-1 text-sm', filled && 'border-primary bg-primary/5');
38859
39005
  }
38860
- function getPresetClassName(selected) {
38861
- return getSelectableOptionClassName(selected, 'inline-flex h-7 items-center rounded-full px-2.5');
38862
- }
39006
+ const getPresetClassName = getPillClassName;
38863
39007
 
38864
39008
  function useNumberRangeInputs(value, onChange) {
38865
39009
  const minText = toBoundText(value?.min);
@@ -38920,9 +39064,7 @@ function createRadioGroupKeyDownHandler(current, onChange) {
38920
39064
  };
38921
39065
  }
38922
39066
 
38923
- function getRadioRowClassName(checked) {
38924
- return cn('flex w-full cursor-pointer items-center gap-2.5 rounded-md px-2.5 py-2 text-left text-xs text-foreground transition-colors', FILTER_FOCUS_RING, checked ? 'bg-muted font-medium' : 'hover:bg-muted/50');
38925
- }
39067
+ const getRadioRowClassName = (checked) => getOptionRowClassName(checked);
38926
39068
  function getRadioCircleClassName(checked) {
38927
39069
  return cn('flex size-4 shrink-0 items-center justify-center rounded-full border', checked ? 'border-primary' : 'border-input-border');
38928
39070
  }
@@ -38935,6 +39077,300 @@ function TriStateFilter({ value, onChange, ariaLabel, }) {
38935
39077
  }) }));
38936
39078
  }
38937
39079
 
39080
+ const SAVED_SEARCH_CHIP_CLASS_NAME = 'inline-flex h-6 min-w-0 max-w-full items-center rounded-full border border-primary/30 bg-primary/5 px-2 text-xs text-foreground';
39081
+ /** Children laid out below the first one's line. */
39082
+ function countWrapped(items) {
39083
+ if (items.length === 0)
39084
+ return 0;
39085
+ const firstTop = items[0].offsetTop;
39086
+ return items.filter((item) => item.offsetTop > firstTop).length;
39087
+ }
39088
+ const getShowMoreLabel = (hiddenCount) => `+${hiddenCount} more`;
39089
+
39090
+ /**
39091
+ * Fits chips on one line with the "+N more" link right after the last one. Renders every chip, counts
39092
+ * how many wrap, then drops chips until the link itself fits; a resize starts the measurement over.
39093
+ */
39094
+ function useChipOverflow(chips, enabled) {
39095
+ const [list, setList] = useState(null);
39096
+ const [expanded, setExpanded] = useState(false);
39097
+ const [visibleCount, setVisibleCount] = useState(chips.length);
39098
+ const collapsed = enabled && !expanded;
39099
+ const [measuredLength, setMeasuredLength] = useState(chips.length);
39100
+ if (measuredLength !== chips.length) {
39101
+ setMeasuredLength(chips.length);
39102
+ setVisibleCount(chips.length);
39103
+ }
39104
+ useLayoutEffect(() => {
39105
+ if (!collapsed || !list)
39106
+ return;
39107
+ const items = Array.from(list.children);
39108
+ if (visibleCount >= chips.length) {
39109
+ const wrapped = countWrapped(items);
39110
+ if (wrapped > 0)
39111
+ setVisibleCount(chips.length - wrapped);
39112
+ return;
39113
+ }
39114
+ // The last child is the "+N more" link; if it wrapped, give it one more chip's room.
39115
+ if (countWrapped(items) > 0 && visibleCount > 1)
39116
+ setVisibleCount(visibleCount - 1);
39117
+ }, [collapsed, list, visibleCount, chips.length]);
39118
+ useEffect(() => {
39119
+ if (!collapsed || !list)
39120
+ return;
39121
+ let width = list.clientWidth;
39122
+ const observer = new ResizeObserver(() => {
39123
+ if (list.clientWidth === width)
39124
+ return;
39125
+ width = list.clientWidth;
39126
+ setVisibleCount(chips.length);
39127
+ });
39128
+ observer.observe(list);
39129
+ return () => observer.disconnect();
39130
+ }, [collapsed, list, chips.length]);
39131
+ const shown = collapsed ? Math.min(visibleCount, chips.length) : chips.length;
39132
+ return {
39133
+ listRef: useCallback((node) => setList(node), []),
39134
+ expanded,
39135
+ toggle: () => {
39136
+ setExpanded((current) => !current);
39137
+ setVisibleCount(chips.length);
39138
+ },
39139
+ visibleChips: chips.slice(0, shown),
39140
+ hiddenCount: chips.length - shown,
39141
+ };
39142
+ }
39143
+
39144
+ /** Read-only filter summaries of a saved search, as pills; optionally one line ending in "+N more". */
39145
+ function SavedSearchChipList({ chips, emptyText = 'No filters', collapsible = false, className, }) {
39146
+ const { listRef, expanded, toggle, visibleChips, hiddenCount } = useChipOverflow(chips, collapsible);
39147
+ if (chips.length === 0) {
39148
+ return (jsx("p", { className: cn('text-xs text-muted-foreground', className), children: emptyText }));
39149
+ }
39150
+ const showToggle = collapsible && (expanded || hiddenCount > 0);
39151
+ return (jsxs("ul", { ref: listRef, className: cn('flex min-w-0 flex-wrap items-center gap-1.5', className), children: [visibleChips.map((chip) => (jsx("li", { className: SAVED_SEARCH_CHIP_CLASS_NAME, children: jsx(TruncatedLabel, { text: chip }) }, chip))), showToggle && (jsx("li", { className: "flex h-6 shrink-0 items-center", children: jsx("button", { type: "button", "aria-expanded": expanded, onClick: toggle,
39152
+ // Above a parent's stretched click area (e.g. a saved-search row).
39153
+ className: cn(FILTER_LINK_CLASS_NAME, 'relative z-10 whitespace-nowrap px-1 underline underline-offset-2'), children: expanded ? 'Show less' : getShowMoreLabel(hiddenCount) }) }))] }));
39154
+ }
39155
+
39156
+ const SEARCH_INPUT_LABEL = 'Find a saved search';
39157
+ const getRenameLabel = (name) => `Rename ${name}`;
39158
+ const getDeleteLabel = (name) => `Delete ${name}`;
39159
+ const NO_MATCH_TITLE = 'No matches';
39160
+ const getNoMatchText = (query) => `No saved searches match “${query.trim()}”.`;
39161
+
39162
+ /** Matches the name or any filter summary, ignoring case. */
39163
+ function filterSavedSearches(items, query) {
39164
+ const needle = query.trim().toLowerCase();
39165
+ if (!needle)
39166
+ return [...items];
39167
+ return items.filter((item) => [item.name, ...item.chips].some((text) => text.toLowerCase().includes(needle)));
39168
+ }
39169
+ const ROW_CLASS_NAME = 'relative flex items-center gap-4 rounded-md px-2 py-2.5 transition-colors hover:bg-muted/60';
39170
+ /** The name is the row's button; its `::after` stretches over the whole row so the row is the click target. */
39171
+ const ROW_BUTTON_CLASS_NAME = "block min-w-0 max-w-full cursor-pointer text-left text-sm font-semibold text-foreground outline-none after:absolute after:inset-0 after:rounded-md after:content-[''] focus-visible:after:ring-2 focus-visible:after:ring-primary/30";
39172
+ /** Lifts the name above the button's stretched area so its overflow tooltip gets the hover; clicks still reach the button. */
39173
+ const ROW_NAME_CLASS_NAME = 'relative z-10 block min-w-0';
39174
+ /** Rename / Delete as one outlined, button-shaped group with a divider between them. */
39175
+ const ROW_ACTIONS_CLASS_NAME = 'flex shrink-0 items-center divide-x divide-border overflow-hidden rounded-md border border-border bg-card shadow-xs';
39176
+ /** A cell of the actions group; Delete turns destructive on hover. */
39177
+ function getRowActionClassName(destructive) {
39178
+ return cn('size-7 rounded-none text-foreground/70 [&_svg]:size-3.5', destructive
39179
+ ? 'hover:bg-destructive/10 hover:text-destructive'
39180
+ : 'hover:bg-muted hover:text-foreground');
39181
+ }
39182
+ /** Controls inside the row that sit above the stretched button. */
39183
+ const ROW_CONTROL_CLASS_NAME = 'relative z-10';
39184
+ /** About three rows (name line + one pill line each) before the list scrolls. */
39185
+ const LIST_SCROLL_CLASS_NAME = 'max-h-54 overflow-y-auto';
39186
+
39187
+ function useSavedSearchesMenu(items, onOpenChange) {
39188
+ const [open, setOpenState] = useState(false);
39189
+ const [query, setQuery] = useState('');
39190
+ const setOpen = (next) => {
39191
+ setOpenState(next);
39192
+ if (!next)
39193
+ setQuery('');
39194
+ onOpenChange?.(next);
39195
+ };
39196
+ const visibleItems = useMemo(() => filterSavedSearches(items, query), [items, query]);
39197
+ const closeThen = (action, item) => () => {
39198
+ setOpen(false);
39199
+ action(item);
39200
+ };
39201
+ return { open, setOpen, query, setQuery, visibleItems, closeThen };
39202
+ }
39203
+
39204
+ /** Small icon button on a row, named by its tooltip. */
39205
+ function RowActionButton({ label, onClick, destructive = false, children, }) {
39206
+ return (jsxs(Tooltip, { children: [jsx(TooltipTrigger, { asChild: true, children: jsx(IconButton, { appearance: "ghost", size: "xs", "aria-label": label, onClick: onClick, className: getRowActionClassName(destructive), children: children }) }), jsx(TooltipContent, { side: "top", children: label })] }));
39207
+ }
39208
+ /** One saved search: name, filter pills, when it was saved, and Rename / Delete buttons. */
39209
+ function SavedSearchRow({ item, onSelect, onRename, onDelete, }) {
39210
+ const hasCount = item.countLoading || item.count !== undefined;
39211
+ return (jsxs("li", { className: ROW_CLASS_NAME, children: [jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1.5", children: [jsxs("div", { className: "flex min-w-0 items-baseline gap-2", children: [jsx("button", { type: "button", onClick: onSelect, className: ROW_BUTTON_CLASS_NAME, children: jsx("span", { className: ROW_NAME_CLASS_NAME, children: jsx(TruncatedLabel, { text: item.name }) }) }), hasCount &&
39212
+ (item.countLoading ? (jsx(SquareSkeleton, { height: 12, width: 40, rounded: "sm" })) : (jsx("span", { className: "shrink-0 text-xs font-medium tabular-nums text-foreground", children: item.countLabel ?? item.count }))), item.meta && (jsx("span", { className: "shrink-0 text-xs text-muted-foreground before:mr-2 before:content-['\u00B7']", children: item.meta }))] }), jsx(SavedSearchChipList, { chips: item.chips, collapsible: true })] }), (onRename || onDelete) && (jsxs("div", { className: cn(ROW_CONTROL_CLASS_NAME, ROW_ACTIONS_CLASS_NAME), children: [onRename && (jsx(RowActionButton, { label: getRenameLabel(item.name), onClick: onRename, children: jsx(Pencil, {}) })), onDelete && (jsx(RowActionButton, { label: getDeleteLabel(item.name), onClick: onDelete, destructive: true, children: jsx(Trash2, {}) }))] }))] }));
39213
+ }
39214
+ /** Centered empty / no-match state inside the dropdown. */
39215
+ function SavedSearchesEmpty({ icon, title, description, }) {
39216
+ return (jsxs("div", { className: "flex flex-col items-center gap-1 px-4 py-6 text-center", children: [jsx("span", { className: "mb-2 flex size-10 items-center justify-center rounded-full bg-muted text-primary [&>svg]:size-5", children: icon }), jsx("p", { className: "text-sm font-semibold text-foreground", children: title }), jsx("p", { className: "max-w-xs text-xs text-muted-foreground", children: description })] }));
39217
+ }
39218
+
39219
+ /** "Saved searches" dropdown: find, pick, rename or delete a saved filter set. */
39220
+ function SavedSearchesMenu({ items, onSelect, onRename, onDelete, loading = false, onOpenChange, label = 'Saved searches', footnote, emptyTitle = 'No saved searches yet', emptyDescription = 'Apply some filters, then choose Save search to keep them here.', align = 'start', triggerClassName, }) {
39221
+ const { open, setOpen, query, setQuery, visibleItems, closeThen } = useSavedSearchesMenu(items, onOpenChange);
39222
+ const hasNone = !loading && items.length === 0;
39223
+ return (jsxs(Popover, { open: open, onOpenChange: setOpen, children: [jsx(PopoverTrigger, { asChild: true, children: jsx(Button, { appearance: "outline", color: open ? 'primary' : 'secondary', size: "md", leftIcon: jsx(Bookmark, {}), rightIcon: open ? jsx(ChevronUp, {}) : jsx(ChevronDown, {}), className: triggerClassName, children: label }) }), jsxs(PopoverContent, { align: align, sideOffset: 4, className: "flex w-120 max-w-[calc(100vw-2rem)] flex-col gap-2 p-2", children: [!hasNone && (jsxs("label", { className: FILTER_SEARCH_BOX_CLASS_NAME, children: [jsx(Search, { "aria-hidden": "true", className: "size-4 shrink-0 text-muted-foreground" }), jsx("input", { value: query, onChange: (event) => setQuery(event.target.value), placeholder: SEARCH_INPUT_LABEL, "aria-label": SEARCH_INPUT_LABEL, className: "min-w-0 flex-1 bg-transparent text-sm text-foreground outline-none placeholder:text-placeholder" })] })), loading ? (jsxs("div", { className: "flex flex-col gap-2 p-2", "aria-busy": "true", children: [jsx(SquareSkeleton, { height: 44, rounded: "md" }), jsx(SquareSkeleton, { height: 44, rounded: "md" })] })) : hasNone ? (jsx(SavedSearchesEmpty, { icon: jsx(Bookmark, {}), title: emptyTitle, description: emptyDescription })) : visibleItems.length === 0 ? (jsx(SavedSearchesEmpty, { icon: jsx(SearchX, {}), title: NO_MATCH_TITLE, description: getNoMatchText(query) })) : (jsx(ScrollFade, { className: LIST_SCROLL_CLASS_NAME, children: jsx(TooltipProvider, { delayDuration: 300, children: jsx("ul", { className: "flex flex-col", children: visibleItems.map((item) => (jsx(SavedSearchRow, { item: item, onSelect: closeThen(onSelect, item), onRename: onRename && closeThen(onRename, item), onDelete: onDelete && closeThen(onDelete, item) }, item.id))) }) }) })), footnote && !hasNone && (jsx("p", { className: "border-t border-border px-2 pt-2 text-xs text-muted-foreground", children: footnote }))] })] }));
39224
+ }
39225
+
39226
+ /**
39227
+ * App-wide modal wrapper with a fixed header / body / footer layout.
39228
+ * Built on top of shadcn DialogContent, so it inherits viewport-centered
39229
+ * positioning, focus trapping, portal rendering, and overlay handling.
39230
+ */
39231
+ function Modal({ open, onClose, title, description, icon, children, footer, size = 'default', hideCloseButton = false, className, bodyClassName, }) {
39232
+ // See ConfirmDialog: overlapping dismissable layers leak the <body> lock.
39233
+ useOverlayBodyLockRelease(open);
39234
+ return (jsx(Dialog, { open: open, onOpenChange: (o) => !o && onClose(), children: jsxs(DialogContent, { hideCloseButton: true, size: size === 'wide' ? 'wide' : 'default', className: cn('flex flex-col gap-0 overflow-hidden p-0', className), children: [jsxs("header", { className: "flex shrink-0 items-start justify-between gap-4 px-6 pt-5 pb-4", children: [jsxs("div", { className: cn('flex min-w-0 gap-3.5', description ? 'items-start' : 'items-center'), children: [icon ? jsx(DialogIcon, { children: icon }) : null, jsxs("div", { className: "flex min-w-0 flex-col", children: [jsx(DialogPrimitive.Title, { className: "m-0 text-lg font-semibold leading-6 text-foreground", children: title }), description ? (jsx(DialogPrimitive.Description, { className: "m-0 text-sm leading-5 text-muted-foreground", children: description })) : null] })] }), !hideCloseButton && (jsx(DialogPrimitive.Close, { "aria-label": "Close", className: "-mr-1.5 inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: jsx(X$2, { className: "h-4 w-4" }) }))] }), jsx("div", { className: cn('flex-1 overflow-y-auto', bodyClassName), children: children }), footer && (jsx("footer", { className: cn('flex items-center justify-end gap-3 border-t border-border bg-[color-mix(in_srgb,var(--muted)_40%,var(--card))] px-6 py-4', DIALOG_FOOTER_BUTTONS), children: footer }))] }) }));
39235
+ }
39236
+
39237
+ const NAME_LABEL = 'Name';
39238
+ const FILTERS_LABEL = 'Filters saved';
39239
+ const NAME_REQUIRED_ERROR = 'Enter a name for this search.';
39240
+ const DUPLICATE_TITLE = 'Name already in use';
39241
+ const DUPLICATE_DESCRIPTION = 'Save another search with this name?';
39242
+ const DUPLICATE_DETAIL_LABEL = 'Existing saved search';
39243
+ const SAVE_ANYWAY_LABEL = 'Save anyway';
39244
+ const CHANGE_NAME_LABEL = 'Change name';
39245
+ const GO_BACK_LABEL = 'Go back';
39246
+ const CANCEL_LABEL = 'Cancel';
39247
+
39248
+ const SAVED_SEARCH_NAME_MAX_LENGTH = 100;
39249
+ const isValidSearchName = (name) => {
39250
+ const trimmed = name.trim();
39251
+ return trimmed.length > 0 && trimmed.length <= SAVED_SEARCH_NAME_MAX_LENGTH;
39252
+ };
39253
+ const isDuplicateSearchName = (name, existingNames) => {
39254
+ const needle = name.trim().toLowerCase();
39255
+ return existingNames.some((taken) => taken.trim().toLowerCase() === needle);
39256
+ };
39257
+ const FILTERS_PANEL_CLASS_NAME = 'rounded-lg border border-border bg-muted/40 p-3';
39258
+ /** The warning for a step: the caller's for the limit and already-saved steps, built-in copy for a reused name. */
39259
+ function getStepWarning(step, name, warnings) {
39260
+ if (step === 'limit')
39261
+ return warnings.limitWarning;
39262
+ if (step === 'existing')
39263
+ return warnings.existingWarning;
39264
+ if (step === 'duplicate') {
39265
+ return {
39266
+ title: DUPLICATE_TITLE,
39267
+ description: DUPLICATE_DESCRIPTION,
39268
+ detail: { label: DUPLICATE_DETAIL_LABEL, value: name.trim() },
39269
+ };
39270
+ }
39271
+ return undefined;
39272
+ }
39273
+ /** Cancel closes before the form; later warnings go back to it. */
39274
+ function getWarningCancelLabel(step) {
39275
+ if (step === 'existing')
39276
+ return CANCEL_LABEL;
39277
+ if (step === 'limit')
39278
+ return GO_BACK_LABEL;
39279
+ return CHANGE_NAME_LABEL;
39280
+ }
39281
+ const WARNING_DETAIL_CLASS_NAME = 'flex min-w-0 flex-col gap-0.5 rounded-xl border border-border bg-muted/30 px-3.5 py-3';
39282
+
39283
+ /**
39284
+ * The name field restarts from `defaultName` every time the dialog opens. Save stays enabled and reports a
39285
+ * missing name; an optional warning can come before the form (e.g. already saved), and a reused name, then the
39286
+ * saved-search limit, each get a follow-up warning that replaces the
39287
+ * form until the user confirms (the last one stays up, showing progress, until the caller closes on success).
39288
+ */
39289
+ function useSaveSearchDialog({ open, defaultName, onSave, saving, existingNames, hasLimitWarning, hasExistingWarning, onClose, }) {
39290
+ const formId = useId$2();
39291
+ const inputId = useId$2();
39292
+ const [name, setNameState] = useState(defaultName);
39293
+ const [error, setError] = useState();
39294
+ const firstStep = hasExistingWarning ? 'existing' : 'form';
39295
+ const [step, setStep] = useState(firstStep);
39296
+ const [wasOpen, setWasOpen] = useState(open);
39297
+ if (open !== wasOpen) {
39298
+ setWasOpen(open);
39299
+ if (open) {
39300
+ setNameState(defaultName);
39301
+ setError(undefined);
39302
+ setStep(firstStep);
39303
+ }
39304
+ }
39305
+ const save = () => onSave(name.trim());
39306
+ const afterDuplicate = () => hasLimitWarning ? setStep('limit') : save();
39307
+ return {
39308
+ formId,
39309
+ inputId,
39310
+ name,
39311
+ setName: (next) => {
39312
+ setNameState(next);
39313
+ if (error)
39314
+ setError(undefined);
39315
+ },
39316
+ error,
39317
+ submit: () => {
39318
+ if (saving)
39319
+ return;
39320
+ if (!isValidSearchName(name)) {
39321
+ setError(NAME_REQUIRED_ERROR);
39322
+ return;
39323
+ }
39324
+ if (isDuplicateSearchName(name, existingNames)) {
39325
+ setStep('duplicate');
39326
+ return;
39327
+ }
39328
+ afterDuplicate();
39329
+ },
39330
+ step,
39331
+ confirmWarning: () => {
39332
+ if (step === 'existing')
39333
+ setStep('form');
39334
+ else if (step === 'duplicate')
39335
+ afterDuplicate();
39336
+ else
39337
+ save();
39338
+ },
39339
+ cancelWarning: () => step === 'existing' ? onClose() : setStep('form'),
39340
+ };
39341
+ }
39342
+
39343
+ /** The search a warning is about, in the dialog body (long names stay on one line, full text on hover). */
39344
+ function WarningDetail({ label, value, }) {
39345
+ return (jsxs("div", { className: WARNING_DETAIL_CLASS_NAME, children: [jsx("span", { className: "text-xs text-muted-foreground", children: label }), jsx(TruncatedLabel, { text: value, className: "text-sm font-semibold text-foreground" })] }));
39346
+ }
39347
+
39348
+ /** Names the current filters and saves them; also used to rename a saved search. */
39349
+ function SaveSearchDialog({ open, onClose, onSave, defaultName = '', chips, title = 'Save search', icon = jsx(Bookmark, { className: "size-5" }), submitLabel = 'Save search', note, existingNames, limitWarning, existingWarning, saving = false, }) {
39350
+ const { formId, inputId, name, setName, error, submit, step, confirmWarning, cancelWarning, } = useSaveSearchDialog({
39351
+ open,
39352
+ defaultName,
39353
+ onSave,
39354
+ saving,
39355
+ existingNames: existingNames ?? [],
39356
+ hasLimitWarning: Boolean(limitWarning),
39357
+ hasExistingWarning: Boolean(existingWarning),
39358
+ onClose,
39359
+ });
39360
+ const warning = getStepWarning(step, name, {
39361
+ limitWarning,
39362
+ existingWarning,
39363
+ });
39364
+ return (jsxs(Fragment$2, { children: [jsx(Modal
39365
+ // One dialog at a time: the duplicate-name warning replaces this one and hands back to it.
39366
+ , {
39367
+ // One dialog at a time: the duplicate-name warning replaces this one and hands back to it.
39368
+ open: open && step === 'form', onClose: onClose, title: title, icon: icon, footer: jsxs(Fragment$2, { children: [jsx(Button, { appearance: "outline", color: "secondary", size: "md", onClick: onClose, children: "Cancel" }), jsx(Button, { appearance: "solid", color: "primary", size: "md", type: "submit", form: formId, loading: saving, children: submitLabel })] }), children: jsxs("form", { id: formId, noValidate: true, className: "flex flex-col gap-4 px-6 pb-5", onSubmit: (event) => {
39369
+ event.preventDefault();
39370
+ submit();
39371
+ }, children: [jsx(Field, { label: NAME_LABEL, required: true, error: error, input: jsx(Input, { id: inputId, "aria-label": NAME_LABEL, "aria-invalid": Boolean(error) || undefined, value: name, maxLength: SAVED_SEARCH_NAME_MAX_LENGTH, onChange: (event) => setName(event.target.value), autoFocus: true }) }), chips && (jsxs("div", { className: "flex flex-col gap-1", children: [jsx("span", { className: "text-[13px] text-label", children: FILTERS_LABEL }), jsx(SavedSearchChipList, { chips: chips, className: FILTERS_PANEL_CLASS_NAME })] })), note && (jsxs("p", { className: "flex items-start gap-1.5 text-xs text-muted-foreground", children: [jsx(Info, { "aria-hidden": "true", className: "mt-px size-3.5 shrink-0" }), jsx("span", { children: note })] }))] }) }), jsx(ConfirmDialog, { open: open && step !== 'form', onOpenChange: (next) => !next && !saving && cancelWarning(), icon: TriangleAlert, title: warning?.title ?? '', description: warning?.description, cancelLabel: getWarningCancelLabel(step), confirmLabel: warning?.confirmLabel ?? SAVE_ANYWAY_LABEL, confirmVariant: "default", disabled: saving, onConfirm: confirmWarning, children: warning?.detail && jsx(WarningDetail, { ...warning.detail }) })] }));
39372
+ }
39373
+
38938
39374
  /**
38939
39375
  * Compact "time ago" label, e.g. "5m ago". Falls back to a locale date past a
38940
39376
  * week so older entries stay scannable.
@@ -39547,17 +39983,6 @@ const TONE_ICON_BG = {
39547
39983
  };
39548
39984
  const MetricTile = ({ label, value, sub, icon, tone, className, }) => (jsxs("div", { className: cn('flex min-w-0 items-center gap-3 rounded-xl border px-4 py-3', TONE_TILE_BG[tone], className), children: [jsx("span", { "aria-hidden": "true", className: cn('inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-md [&_svg]:h-5 [&_svg]:w-5', TONE_ICON_BG[tone]), children: icon }), jsxs("div", { className: "flex min-w-0 flex-col", children: [jsx("span", { className: "truncate text-xs text-muted-foreground", children: label }), jsx("span", { className: "truncate text-lg font-semibold text-foreground", children: value }), sub && (jsx("span", { className: "truncate text-xs text-muted-foreground", children: sub }))] })] }));
39549
39985
 
39550
- /**
39551
- * App-wide modal wrapper with a fixed header / body / footer layout.
39552
- * Built on top of shadcn DialogContent, so it inherits viewport-centered
39553
- * positioning, focus trapping, portal rendering, and overlay handling.
39554
- */
39555
- function Modal({ open, onClose, title, description, icon, children, footer, size = 'default', hideCloseButton = false, className, bodyClassName, }) {
39556
- // See ConfirmDialog: overlapping dismissable layers leak the <body> lock.
39557
- useOverlayBodyLockRelease(open);
39558
- return (jsx(Dialog, { open: open, onOpenChange: (o) => !o && onClose(), children: jsxs(DialogContent, { hideCloseButton: true, size: size === 'wide' ? 'wide' : 'default', className: cn('flex flex-col gap-0 overflow-hidden p-0', className), children: [jsxs("header", { className: "flex shrink-0 items-start justify-between gap-4 px-6 pt-5 pb-4", children: [jsxs("div", { className: cn('flex min-w-0 gap-3.5', description ? 'items-start' : 'items-center'), children: [icon ? jsx(DialogIcon, { children: icon }) : null, jsxs("div", { className: "flex min-w-0 flex-col", children: [jsx(DialogPrimitive.Title, { className: "m-0 text-lg font-semibold leading-6 text-foreground", children: title }), description ? (jsx(DialogPrimitive.Description, { className: "m-0 text-sm leading-5 text-muted-foreground", children: description })) : null] })] }), !hideCloseButton && (jsx(DialogPrimitive.Close, { "aria-label": "Close", className: "-mr-1.5 inline-flex size-7 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: jsx(X$2, { className: "h-4 w-4" }) }))] }), jsx("div", { className: cn('flex-1 overflow-y-auto', bodyClassName), children: children }), footer && (jsx("footer", { className: cn('flex items-center justify-end gap-3 border-t border-border bg-[color-mix(in_srgb,var(--muted)_40%,var(--card))] px-6 py-4', DIALOG_FOOTER_BUTTONS), children: footer }))] }) }));
39559
- }
39560
-
39561
39986
  /**
39562
39987
  * Side info panel that sits adjacent to the form content (not a modal/drawer).
39563
39988
  * The parent page is responsible for layout: render this inside a flex row
@@ -76507,7 +76932,7 @@ function describeFilterValue(field, value) {
76507
76932
  ], value.value);
76508
76933
  }
76509
76934
  }
76510
- /** Short value shown on the filter-row trigger, e.g. `Red +1`, `VG – F`, `3 IDs`. */
76935
+ /** Short value shown on the filter-row trigger, e.g. `Red +1`, `VG – F`, `A-102`, `3 IDs`. */
76511
76936
  function getCellLabel(field, value) {
76512
76937
  if (!value || !isFilterValueActive(value))
76513
76938
  return '';
@@ -76515,8 +76940,6 @@ function getCellLabel(field, value) {
76515
76940
  return summarizeSelection(value.values, field.options ?? []);
76516
76941
  if (value.type === 'scale')
76517
76942
  return formatScaleRange(field.options ?? [], value.range, field.shortLabels);
76518
- if (value.type === 'ids')
76519
- return `${value.ids.length} IDs`;
76520
76943
  return describeFilterValue(field, value);
76521
76944
  }
76522
76945
  /** Filter-row popovers hold the filter's card at a compact, fixed width. */
@@ -76536,31 +76959,31 @@ function resolveListLayout(field) {
76536
76959
  ? 'list'
76537
76960
  : (field.layout ?? 'chips');
76538
76961
  }
76539
- /** Popover variant: tile and option grids drop to two columns; chip lists become the checkbox list. */
76962
+ /** The empty single-select dropdown on a card: `inputPlaceholder`, else `Any <label>` (set `inputPlaceholder` for acronyms). */
76963
+ const getSingleSelectPlaceholder = (field) => field.inputPlaceholder ?? `Any ${field.label.toLowerCase()}`;
76964
+ /** Popover variant: the same control and layout as the card (pills up to 10 options, then the list); tile grids drop to two columns. */
76540
76965
  function toPopoverField(field) {
76541
76966
  if (field.type === 'scale' ||
76542
76967
  (field.type === 'list' && resolveListLayout(field) === 'tiles')) {
76543
76968
  return { ...field, columns: POPOVER_TILE_COLUMNS };
76544
76969
  }
76545
- // Chip filters read better as the checkbox list in a narrow popover.
76546
- return field.type === 'list' ? { ...field, layout: 'list' } : field;
76970
+ return field;
76547
76971
  }
76548
76972
  /** ID lists and searchable lists carry their own "x selected · Clear" row, so the card skips its Clear (and, in a popover, its title). */
76549
76973
  const ownsClearRow = (field) => field.type === 'ids' ||
76550
76974
  (field.type === 'list' && resolveListLayout(field) === 'list');
76551
- /** Popover header text in place of the title: `2 of 17 selected`, or the applied value (`VG – F`, `Last 30 days`). */
76975
+ /** Popover header text in place of the title: `2 of 17 selected`, or the applied value (`VG – F`, `Last 30 days`); none when nothing is applied. */
76552
76976
  function getPopoverStatus(field, value) {
76553
76977
  if (ownsClearRow(field))
76554
76978
  return undefined;
76555
76979
  if (field.type === 'list') {
76556
76980
  return formatSelectedCount(valueOfType(value, 'list')?.values.length ?? 0, field.options?.length ?? 0);
76557
76981
  }
76558
- return describeFilterValue(field, value) || 'Any';
76982
+ // Nothing applied: the trigger already reads "Any", so the popover skips the header.
76983
+ return describeFilterValue(field, value) || undefined;
76559
76984
  }
76560
- /** The empty single-select trigger: `inputPlaceholder`, else `Any <label>` (lowercased — set `inputPlaceholder` for acronyms). */
76561
- const getSingleSelectPlaceholder = (field) => field.inputPlaceholder ?? `Any ${field.label.toLowerCase()}`;
76562
76985
 
76563
- /** Single-choice list as a searchable dropdown, e.g. "Any vendor". */
76986
+ /** Single-choice list on a card, as the design's dropdown ("Any supplier"); the filter row lists the same options as a pick-one list. */
76564
76987
  function SingleSelectFilter({ field, selected, onSelect, }) {
76565
76988
  const options = field.options ?? [];
76566
76989
  return (jsx(SearchableSelect, { options: options, selectedItem: options.find((option) => option.value === selected) ?? null, onChange: (option) => onSelect(option.value), getOptionKey: (option) => option.value, getOptionLabel: (option) => option.label, searchPlaceholder: getSingleSelectPlaceholder(field), hideTriggerSearchIcon: true }));
@@ -76574,7 +76997,7 @@ function FilterFieldControl({ field, value, onChange, fiscalYearStartMonth, fill
76574
76997
  return (jsx(SingleSelectFilter, { field: field, selected: valueOfType(value, 'list')?.values[0], onSelect: (next) => onChange(toListValue([next])) }));
76575
76998
  }
76576
76999
  const layout = resolveListLayout(field);
76577
- return (jsx(PickListFilter, { ariaLabel: ariaLabel, options: field.options ?? [], value: valueOfType(value, 'list')?.values ?? [], onChange: (values) => onChange(toListValue(values)), layout: layout, searchPlaceholder: layout === 'list' ? field.searchPlaceholder : undefined, columns: field.columns, fill: fill }));
77000
+ return (jsx(PickListFilter, { ariaLabel: ariaLabel, options: field.options ?? [], value: valueOfType(value, 'list')?.values ?? [], onChange: (values) => onChange(toListValue(values)), layout: layout, searchPlaceholder: layout === 'list' ? field.searchPlaceholder : undefined, columns: field.columns, fill: fill, single: field.single }));
76578
77001
  }
76579
77002
  case 'scale':
76580
77003
  return (jsx(ScaleRangeFilter, { ariaLabel: ariaLabel, options: field.options ?? [], value: valueOfType(value, 'scale')?.range, onChange: (range) => onChange(toScaleValue(range)), columns: field.columns, fill: fill }));
@@ -76585,7 +77008,7 @@ function FilterFieldControl({ field, value, onChange, fiscalYearStartMonth, fill
76585
77008
  // Cards show one shared hint instead of a helper under every box.
76586
77009
  helperText: inPopover ? field.helperText : '' }));
76587
77010
  case 'contains':
76588
- return (jsx(ContainsFilter, { ariaLabel: ariaLabel, size: "field", value: valueOfType(value, 'contains')?.text ?? '', onChange: (text) => onChange(toContainsValue(text)) }));
77011
+ return (jsx(ContainsFilter, { ariaLabel: ariaLabel, size: "field", placeholder: field.inputPlaceholder, value: valueOfType(value, 'contains')?.text ?? '', onChange: (text) => onChange(toContainsValue(text)) }));
76589
77012
  case 'date':
76590
77013
  return (jsx(DateRangeFilter, { ariaLabel: ariaLabel, value: valueOfType(value, 'date')?.range, onChange: (range) => onChange(toDateValue(range)), fiscalYearStartMonth: fiscalYearStartMonth }));
76591
77014
  case 'bool':
@@ -76599,7 +77022,7 @@ function FilterFieldCell({ field, value, onChange, fiscalYearStartMonth, classNa
76599
77022
  const placeholder = field.placeholder ?? DEFAULT_CELL_PLACEHOLDERS[field.type];
76600
77023
  const clear = () => onChange(undefined);
76601
77024
  if (field.type === 'number' && state !== 'disabled') {
76602
- return (jsx(NumberExpressionFilter, { ariaLabel: ariaLabel, value: valueOfType(value, 'number')?.range, onChange: (range) => onChange(toNumberValue(range)), placeholder: placeholder, note: field.note, className: className }));
77025
+ return (jsx(NumberExpressionFilter, { ariaLabel: ariaLabel, value: valueOfType(value, 'number')?.range, onChange: (range) => onChange(toNumberValue(range)), placeholder: placeholder, note: field.note, ruleExamples: field.ruleExamples, className: className }));
76603
77026
  }
76604
77027
  if (field.type === 'contains' && state !== 'disabled') {
76605
77028
  return (jsx(ContainsFilter, { ariaLabel: ariaLabel, size: "cell", value: valueOfType(value, 'contains')?.text ?? '', onChange: (text) => onChange(toContainsValue(text)), placeholder: placeholder, className: className }));
@@ -76626,15 +77049,34 @@ function FilterField(props) {
76626
77049
  /** Both leave without applying — the draft is discarded. */
76627
77050
  const BACK_LABEL = 'Back without applying';
76628
77051
  const CLOSE_LABEL = 'Close without applying';
77052
+ const LOADING_LABEL = 'Loading filters';
77053
+ const ERROR_TITLE = "Couldn't load filters";
77054
+ const DEFAULT_ERROR_MESSAGE = 'Something went wrong while loading the filters. Check your connection and try again.';
77055
+ const RETRY_LABEL = 'Try again';
77056
+
77057
+ /** Placeholder cards while the filters load; roughly the first rows of a card grid. */
77058
+ const SKELETON_CARD_COUNT = 8;
77059
+ const SKELETON_GRID_CLASS_NAME = 'grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4';
77060
+
77061
+ const DEFAULT_SKELETON_CARDS = Array.from({ length: SKELETON_CARD_COUNT }, (_, index) => `card-${index}`);
77062
+ /** Loading placeholder: the page's own skeleton, or generic list cards. */
77063
+ function FilterSurfaceSkeleton({ children, }) {
77064
+ return (jsx("div", { role: "status", "aria-label": LOADING_LABEL, children: children ?? (jsx("div", { className: SKELETON_GRID_CLASS_NAME, children: DEFAULT_SKELETON_CARDS.map((id) => (jsx(FilterCardSkeleton, {}, id))) })) }));
77065
+ }
77066
+ /** Shown in place of the cards when the filters couldn't load. */
77067
+ function FilterSurfaceError({ message, onRetry, }) {
77068
+ return (jsxs("div", { role: "alert", className: "flex flex-col items-center rounded-xl border border-border bg-card px-6 py-12 text-center", children: [jsx("span", { className: "flex size-10 items-center justify-center rounded-full bg-destructive/10 text-destructive", children: jsx(TriangleAlert, { "aria-hidden": "true", className: "size-5" }) }), jsx("p", { className: "mt-4 text-base font-semibold text-foreground", children: ERROR_TITLE }), jsx("p", { className: "mt-1.5 max-w-sm text-sm text-muted-foreground", children: message }), onRetry && (jsx(Button, { appearance: "outline", color: "secondary", size: "md", leftIcon: jsx(RotateCcw, {}), onClick: onRetry, className: "mt-5", children: RETRY_LABEL }))] }));
77069
+ }
76629
77070
 
77071
+ const NESTED_LAYER_SELECTOR = '[data-slot="popover-content"], [role="dialog"], [role="menu"], [role="listbox"]';
76630
77072
  function useCloseOnEscape(onClose) {
76631
77073
  useEffect(() => {
76632
77074
  const handleKeyDown = (event) => {
76633
77075
  if (event.key !== 'Escape' || event.defaultPrevented)
76634
77076
  return;
76635
- // Escape inside an open popover only closes that popover (Radix doesn't mark the event handled).
77077
+ // Escape inside an open popover, dialog or menu only closes that layer (Radix doesn't mark the event handled).
76636
77078
  if (event.target instanceof Element &&
76637
- event.target.closest('[data-slot="popover-content"]'))
77079
+ event.target.closest(NESTED_LAYER_SELECTOR))
76638
77080
  return;
76639
77081
  onClose();
76640
77082
  };
@@ -76648,17 +77090,17 @@ function useFilterSurfaceMore(defaultExpanded = false) {
76648
77090
  }
76649
77091
 
76650
77092
  /** Full-page filter screen (e.g. an advanced search): header, scrolling card grid, sticky apply footer. */
76651
- function FilterSurface({ title, headerActions, footerChips, footerActions, onClose, children, }) {
77093
+ function FilterSurface({ title, headerActions, footerChips, footerActions, onClose, status = 'ready', errorMessage, onRetry, skeleton, children, }) {
76652
77094
  useCloseOnEscape(onClose);
76653
- return (jsxs("div", { role: "region", "aria-label": title, className: "flex h-full min-h-0 flex-col bg-background", children: [jsxs("div", { className: "min-h-0 flex-1 overflow-y-auto px-3 pt-2 pb-3", children: [jsxs("header", { className: "mb-3 flex flex-wrap items-end justify-between gap-3", children: [jsx("div", { className: "flex flex-col gap-1", children: jsxs("div", { className: "flex items-center gap-2", children: [jsx(IconButton, { appearance: "ghost", size: "sm", "aria-label": BACK_LABEL, title: BACK_LABEL, onClick: onClose, children: jsx(ArrowLeft, {}) }), jsx("h1", { className: "text-xl font-semibold text-foreground", children: title })] }) }), jsxs("div", { className: "flex items-center gap-2", children: [headerActions, jsx(IconButton, { appearance: "outline", size: "md", "aria-label": CLOSE_LABEL, title: CLOSE_LABEL, onClick: onClose, children: jsx(X$2, {}) })] })] }), jsx("div", { className: "flex flex-col gap-4", children: children })] }), (footerChips || footerActions) && (jsxs("footer", { className: "flex flex-wrap items-center justify-between gap-3 border-t border-border bg-card px-3 py-2", children: [jsx("div", { className: "min-w-0 flex-1", children: footerChips }), jsx("div", { className: "flex shrink-0 items-center gap-2", children: footerActions })] }))] }));
77095
+ return (jsxs("div", { role: "region", "aria-label": title, className: "flex h-full min-h-0 flex-col bg-background", children: [jsxs("header", { className: "sticky top-0 z-20 flex shrink-0 flex-wrap items-end justify-between gap-3 bg-background px-3 pt-2 pb-3", children: [jsx("div", { className: "flex flex-col gap-1", children: jsxs("div", { className: "flex items-center gap-2", children: [jsx(IconButton, { appearance: "ghost", size: "sm", "aria-label": BACK_LABEL, title: BACK_LABEL, onClick: onClose, children: jsx(ArrowLeft, {}) }), jsx("h1", { className: "text-xl font-semibold text-foreground", children: title })] }) }), jsxs("div", { className: "flex items-center gap-2", children: [headerActions, jsx(IconButton, { appearance: "outline", size: "md", "aria-label": CLOSE_LABEL, title: CLOSE_LABEL, onClick: onClose, children: jsx(X$2, {}) })] })] }), jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-3 pb-3", children: status === 'loading' ? (jsx(FilterSurfaceSkeleton, { children: skeleton })) : status === 'error' ? (jsx(FilterSurfaceError, { message: errorMessage ?? DEFAULT_ERROR_MESSAGE, onRetry: onRetry })) : (jsx("div", { className: "flex flex-col gap-3", children: children })) }), status === 'ready' && (footerChips || footerActions) && (jsxs("footer", { className: "sticky bottom-0 z-20 flex flex-wrap items-center justify-between gap-3 border-t border-border bg-card px-3 py-2", children: [jsx("div", { className: "min-w-0 flex-1", children: footerChips }), jsx("div", { className: "flex shrink-0 items-center gap-2", children: footerActions })] }))] }));
76654
77096
  }
76655
77097
  function FilterSurfaceGroup({ title, className, children, }) {
76656
- return (jsxs("section", { className: "flex flex-col gap-3", children: [title && (jsx("h2", { className: "text-xs font-semibold uppercase tracking-wide text-label", children: title })), jsx("div", { className: cn('grid grid-cols-1 gap-4 lg:grid-cols-6', className), children: children })] }));
77098
+ return (jsxs("section", { className: "flex flex-col gap-3", children: [title && (jsx("h2", { className: "text-xs font-semibold uppercase tracking-wide text-label", children: title })), jsx("div", { className: cn('grid grid-cols-1 gap-3 lg:grid-cols-6', className), children: children })] }));
76657
77099
  }
76658
77100
  /** Collapsed "More filters" divider that reveals extra cards. */
76659
77101
  function FilterSurfaceMore({ label, defaultExpanded, children, }) {
76660
77102
  const { expanded, toggle } = useFilterSurfaceMore(defaultExpanded);
76661
- return (jsxs("section", { className: "flex flex-col gap-6", children: [jsxs("div", { className: "flex items-center gap-3", children: [jsx("span", { className: "h-px flex-1 bg-border" }), jsxs("button", { type: "button", "aria-expanded": expanded, onClick: toggle, className: "inline-flex cursor-pointer items-center gap-1.5 rounded-full border border-border bg-card px-3.5 py-1.5 text-xs font-medium text-primary outline-none hover:bg-muted/50 focus-visible:ring-2 focus-visible:ring-primary/30", children: [label, jsx(ChevronDown, { "aria-hidden": "true", className: cn('size-3.5 transition-transform', expanded && 'rotate-180') })] }), jsx("span", { className: "h-px flex-1 bg-border" })] }), expanded && children] }));
77103
+ return (jsxs("section", { className: "flex flex-col gap-3", children: [jsxs("div", { className: "flex items-center gap-3", children: [jsx("span", { className: "h-px flex-1 bg-border" }), jsxs("button", { type: "button", "aria-expanded": expanded, onClick: toggle, className: "inline-flex cursor-pointer items-center gap-1.5 rounded-full border border-border bg-card px-3.5 py-1.5 text-xs font-medium text-primary outline-none hover:bg-muted/50 focus-visible:ring-2 focus-visible:ring-primary/30", children: [label, jsx(ChevronDown, { "aria-hidden": "true", className: cn('size-3.5 transition-transform', expanded && 'rotate-180') })] }), jsx("span", { className: "h-px flex-1 bg-border" })] }), expanded && children] }));
76662
77104
  }
76663
77105
 
76664
77106
  /** Falls back to counting the current page when the caller has no total. */
@@ -79234,5 +79676,5 @@ var RichTextAreaImpl = /*#__PURE__*/Object.freeze({
79234
79676
  RichTextarea: RichTextarea
79235
79677
  });
79236
79678
 
79237
- export { ACTIVITY_CATEGORIES, ACTIVITY_CATEGORY_META, ActionBadge, ActionButtonWithTooltip, ActiveFilterChips, ActivityFeed, AdvancedSearchDrawer, Alert, ApiComboBox, AppSidebar, AuditEntryCard, AuditHistoryPanel, AuditTimeline, AuditTimelineShimmer, Badge, BadgeType, BusinessContactStatusFilter, Button, CUSTOMER_AUDIT_CONFIG, CertificateRowList, ChangePill, Collapsible, CollapsibleCard, CollapsibleContent, CollapsibleTrigger, CompanyCard, ConfirmDialog, ContactTypeFilter, ContainsFilter, CopyButton, CountrySelect, CreateFormPageHeader, CreateFormPageShell, CurrencyDisplayTabs, CurrencyInput, CurrencyToggle, CustomCombobox, CustomFieldInput, CustomFieldValue, CustomTable, CustomizeColumnsDrawer, DATE_PRESET_OPTIONS, DIAMOND_AUDIT_CONFIG, DashboardShell, DataEditableTable, DataTable, DateInput, DateRangeFilter, DetailChip, DetailPageLayout, DetailPageSkeleton, DetailSection, DocumentDeleteDialog, DocumentDetailSkeleton, DocumentHero, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyValue, EntityHeader, Field, FieldSkeleton, FileUploader, FilterCellPopover, FilterEmptyState, FilterField, FilterFieldCard, FilterFieldCell, FilterFieldControl, FilterMultiSelect, FilterPanel, FilterSelect, FilterSurface, FilterSurfaceGroup, FilterSurfaceMore, FormSectionCard, FormSectionCardSkeleton, GEM_AUDIT_CONFIG, HistoryEntryCard, HistoryTimeline, HistoryTimelineShimmer, INVOICE_AUDIT_CONFIG, IconButton, IdHyperlinkText, IdListInput, InAppNotificationCard, InAppNotificationsPanel, InfoBanner, InventoryComboBox, InventoryItemCard, InventoryItemRow, InvoiceComboBox, KYCStatusFilter, KeyValueGrid, LAYOUT_AUDIT_CONFIG, LabeledToggle, LineItemsCard, LineProductCell, LineProductThumb, LineProductTypeChip, LineRowActionsMenu, LineTable, LineTableEmpty, MEMO_IN_AUDIT_CONFIG, MEMO_OUT_AUDIT_CONFIG, MediaGallery, MemoInComboBox, MetricCard, MetricRow, MetricTile, Modal, MoreInfoPanel, MoreInfoTrigger, NOT_CAPTURED, Navbar, NavbarActions, NavbarAvatar, NavbarIconButton, NavbarSearch, NavbarTitle, NumberExpressionFilter, NumberInput, NumberRangeInputs, NumberedStepCard, OtpInput, OwnershipFilter, OwnershipSplitCard, PROFORMA_AUDIT_CONFIG, PageHeader, PageTabs, Pagination, PaginationSelect, PartnerShareCard, PickListFilter, PriceInput, Protected, PurchaseOrderComboBox, QUOTATION_AUDIT_CONFIG, RadioCardGroup, ReadMoreText, RefreshButton, RichTextarea$1 as RichTextarea, SEARCHABLE_SELECT_PAGE_SIZE, SafeImage, ScaleRangeFilter, ScrollFade, SearchBox, SearchInput, SearchableSelect, SectionCard, SectionIcon, SegmentedControl, ShareDialog, ShareMenu, ShimmerTable, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, SlideOut, SlideOutClose, SlideOutContent, SlideOutDescription, SlideOutHeader, SlideOutOverlay, SlideOutPortal, SlideOutTitle, SlideOutTrigger, Slider, SpecList, Spinner, SquareSkeleton, StateSelect, StatusBadge$1 as StatusBadge, StatusFilter, Stepper, StockTypeFilter, TablePagination, TableRowsSkeleton, TableSkeleton, Tabs, TabsContent, TabsList, TabsTrigger, TagsInput, TextHyperlink, TimePicker, ToggleSwitch, TriStateFilter, TruncateTooltip, TruncatedLabel, WarehouseComboBox, WarehouseFilter, ZoomSplitViewer, asList, asText, badgeVariants, buildBulkShareMessage, buildBulkShareTitle, buildInventoryPublicUrl, buildInventoryRowProps, buildInventoryShareTitle, buildWhatsappUrl, buttonVariants, cn, countries, countryByCode, createVideoMediaItem, describeFilterValue, dropdownMenuItemDestructiveClass, expandScaleRange, fieldTypeIcon, findRegion, flagEmoji, formatAddressLocation, formatDateRange, formatFileSize, formatNumberRange, formatScaleRange, formatSelectedCount, generateActionDescription, generateTitle, getBadgeTypeForStatus, getChangePills, getCountryName, getInitials, getStatesOfCountry, iconButtonVariants, inAppNotificationCardA11y, inAppNotificationsPanelA11y, isBlank, isFilterValueActive, isIndiaCountry, isKnownRegion, isPathActive, isValidAlpha2CountryCode, isValueEmpty, notify, parseNumberExpression, releaseStaleOverlayBodyLock, renderBadge, resolveCountryCode, resolveDatePreset, resolveDateRange, splitIdList, toAddressFormValues, toBoolValue, toContainsValue, toDateValue, toIdsValue, toListValue, toNumberValue, toScaleValue, useAuditShowMore, useBadge, useButton, useDropdownMenu, useInAppNotificationsPanel, useNavbar, useSidebar, valueOfType, videoThumbnailSrc, watchOverlayBodyLock };
79679
+ export { ACTIVITY_CATEGORIES, ACTIVITY_CATEGORY_META, ActionBadge, ActionButtonWithTooltip, ActiveFilterChips, ActivityFeed, AdvancedSearchDrawer, Alert, ApiComboBox, AppSidebar, AuditEntryCard, AuditHistoryPanel, AuditTimeline, AuditTimelineShimmer, Badge, BadgeType, BusinessContactStatusFilter, Button, CUSTOMER_AUDIT_CONFIG, CertificateRowList, ChangePill, Collapsible, CollapsibleCard, CollapsibleContent, CollapsibleTrigger, CompanyCard, ConfirmDialog, ContactTypeFilter, ContainsFilter, CopyButton, CountrySelect, CreateFormPageHeader, CreateFormPageShell, CurrencyDisplayTabs, CurrencyInput, CurrencyToggle, CustomCombobox, CustomFieldInput, CustomFieldValue, CustomTable, CustomizeColumnsDrawer, DATE_PRESET_OPTIONS, DIAMOND_AUDIT_CONFIG, DashboardShell, DataEditableTable, DataTable, DateInput, DateRangeFilter, DetailChip, DetailPageLayout, DetailPageSkeleton, DetailSection, DocumentDeleteDialog, DocumentDetailSkeleton, DocumentHero, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyValue, EntityHeader, FILTER_COUNT_BADGE_CLASS_NAME, Field, FieldSkeleton, FileUploader, FilterCardSkeleton, FilterCellPopover, FilterEmptyState, FilterField, FilterFieldCard, FilterFieldCell, FilterFieldControl, FilterMultiSelect, FilterPanel, FilterSelect, FilterSurface, FilterSurfaceGroup, FilterSurfaceMore, FormSectionCard, FormSectionCardSkeleton, GEM_AUDIT_CONFIG, HistoryEntryCard, HistoryTimeline, HistoryTimelineShimmer, INVOICE_AUDIT_CONFIG, IconButton, IdHyperlinkText, IdListInput, InAppNotificationCard, InAppNotificationsPanel, InfoBanner, InventoryComboBox, InventoryItemCard, InventoryItemRow, InvoiceComboBox, KYCStatusFilter, KeyValueGrid, LAYOUT_AUDIT_CONFIG, LabeledToggle, LineItemsCard, LineProductCell, LineProductThumb, LineProductTypeChip, LineRowActionsMenu, LineTable, LineTableEmpty, MEMO_IN_AUDIT_CONFIG, MEMO_OUT_AUDIT_CONFIG, MediaGallery, MemoInComboBox, MetricCard, MetricRow, MetricTile, Modal, MoreInfoPanel, MoreInfoTrigger, NOT_CAPTURED, Navbar, NavbarActions, NavbarAvatar, NavbarIconButton, NavbarSearch, NavbarTitle, NumberExpressionFilter, NumberInput, NumberRangeInputs, NumberedStepCard, OtpInput, OwnershipFilter, OwnershipSplitCard, PROFORMA_AUDIT_CONFIG, PageHeader, PageTabs, Pagination, PaginationSelect, PartnerShareCard, PickListFilter, PriceInput, Protected, PurchaseOrderComboBox, QUOTATION_AUDIT_CONFIG, RadioCardGroup, ReadMoreText, RefreshButton, RichTextarea$1 as RichTextarea, SAVED_SEARCH_NAME_MAX_LENGTH, SEARCHABLE_SELECT_PAGE_SIZE, SafeImage, SaveSearchDialog, SavedSearchChipList, SavedSearchesMenu, ScaleRangeFilter, ScrollFade, SearchBox, SearchInput, SearchableSelect, SectionCard, SectionIcon, SegmentedControl, ShareDialog, ShareMenu, ShimmerTable, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, SlideOut, SlideOutClose, SlideOutContent, SlideOutDescription, SlideOutHeader, SlideOutOverlay, SlideOutPortal, SlideOutTitle, SlideOutTrigger, Slider, SpecList, Spinner, SquareSkeleton, StateSelect, StatusBadge$1 as StatusBadge, StatusFilter, Stepper, StockTypeFilter, TablePagination, TableRowsSkeleton, TableSkeleton, Tabs, TabsContent, TabsList, TabsTrigger, TagsInput, TextHyperlink, TimePicker, ToggleSwitch, TriStateFilter, TruncateTooltip, TruncatedLabel, WarehouseComboBox, WarehouseFilter, ZoomSplitViewer, asList, asText, badgeVariants, buildBulkShareMessage, buildBulkShareTitle, buildInventoryPublicUrl, buildInventoryRowProps, buildInventoryShareTitle, buildNumberRuleHelp, buildWhatsappUrl, buttonVariants, cn, countries, countryByCode, createVideoMediaItem, describeFilterValue, dropdownMenuItemDestructiveClass, expandScaleRange, fieldTypeIcon, filterSavedSearches, findRegion, flagEmoji, formatAddressLocation, formatDateRange, formatFileSize, formatNumberRange, formatScaleRange, formatSelectedCount, generateActionDescription, generateTitle, getBadgeTypeForStatus, getChangePills, getCountryName, getInitials, getStatesOfCountry, iconButtonVariants, inAppNotificationCardA11y, inAppNotificationsPanelA11y, isBlank, isDuplicateSearchName, isFilterValueActive, isIndiaCountry, isKnownRegion, isPathActive, isValidAlpha2CountryCode, isValidSearchName, isValueEmpty, notify, parseNumberExpression, releaseStaleOverlayBodyLock, renderBadge, resolveCountryCode, resolveDatePreset, resolveDateRange, splitIdList, toAddressFormValues, toBoolValue, toContainsValue, toDateValue, toIdsValue, toListValue, toNumberValue, toScaleValue, useAuditShowMore, useBadge, useButton, useDropdownMenu, useInAppNotificationsPanel, useNavbar, useSidebar, valueOfType, videoThumbnailSrc, watchOverlayBodyLock };
79238
79680
  //# sourceMappingURL=index.esm.js.map