@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.
- package/dist/components/molecules/FilterSelect/FilterMultiSelect.d.ts.map +1 -1
- package/dist/components/molecules/FilterSelect/FilterSelect.d.ts.map +1 -1
- package/dist/components/molecules/FilterSelect/FilterSelect.utils.d.ts +1 -1
- package/dist/components/molecules/FilterSelect/FilterSelect.utils.d.ts.map +1 -1
- package/dist/components/molecules/Filters/ActiveFilterChips/ActiveFilterChips.d.ts +1 -1
- package/dist/components/molecules/Filters/ActiveFilterChips/ActiveFilterChips.d.ts.map +1 -1
- package/dist/components/molecules/Filters/ActiveFilterChips/ActiveFilterChips.types.d.ts +3 -0
- package/dist/components/molecules/Filters/ActiveFilterChips/ActiveFilterChips.types.d.ts.map +1 -1
- package/dist/components/molecules/Filters/ActiveFilterChips/ActiveFilterChips.utils.d.ts +1 -1
- package/dist/components/molecules/Filters/ActiveFilterChips/ActiveFilterChips.utils.d.ts.map +1 -1
- package/dist/components/molecules/Filters/DateRangeFilter/DateRangeFilter.d.ts.map +1 -1
- package/dist/components/molecules/Filters/DateRangeFilter/DateRangeFilter.utils.d.ts +1 -1
- package/dist/components/molecules/Filters/DateRangeFilter/DateRangeFilter.utils.d.ts.map +1 -1
- package/dist/components/molecules/Filters/FilterCardSkeleton/FilterCardSkeleton.d.ts +6 -0
- package/dist/components/molecules/Filters/FilterCardSkeleton/FilterCardSkeleton.d.ts.map +1 -0
- package/dist/components/molecules/Filters/FilterCardSkeleton/FilterCardSkeleton.types.d.ts +8 -0
- package/dist/components/molecules/Filters/FilterCardSkeleton/FilterCardSkeleton.types.d.ts.map +1 -0
- package/dist/components/molecules/Filters/FilterCardSkeleton/FilterCardSkeleton.utils.d.ts +6 -0
- package/dist/components/molecules/Filters/FilterCardSkeleton/FilterCardSkeleton.utils.d.ts.map +1 -0
- package/dist/components/molecules/Filters/FilterCardSkeleton/index.d.ts +3 -0
- package/dist/components/molecules/Filters/FilterCardSkeleton/index.d.ts.map +1 -0
- package/dist/components/molecules/Filters/FilterPanel/FilterPanel.d.ts.map +1 -1
- package/dist/components/molecules/Filters/Filters.types.d.ts +9 -0
- package/dist/components/molecules/Filters/Filters.types.d.ts.map +1 -1
- package/dist/components/molecules/Filters/Filters.utils.d.ts +16 -3
- package/dist/components/molecules/Filters/Filters.utils.d.ts.map +1 -1
- package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.d.ts +1 -1
- package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.d.ts.map +1 -1
- package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.hooks.d.ts +2 -0
- package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.hooks.d.ts.map +1 -1
- package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.types.d.ts +3 -1
- package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.types.d.ts.map +1 -1
- package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.utils.d.ts +12 -1
- package/dist/components/molecules/Filters/NumberExpressionFilter/NumberExpressionFilter.utils.d.ts.map +1 -1
- package/dist/components/molecules/Filters/NumberRangeInputs/NumberRangeInputs.utils.d.ts +2 -1
- package/dist/components/molecules/Filters/NumberRangeInputs/NumberRangeInputs.utils.d.ts.map +1 -1
- package/dist/components/molecules/Filters/PickListFilter/PickListFilter.d.ts +2 -2
- package/dist/components/molecules/Filters/PickListFilter/PickListFilter.d.ts.map +1 -1
- package/dist/components/molecules/Filters/PickListFilter/PickListFilter.types.d.ts +2 -0
- package/dist/components/molecules/Filters/PickListFilter/PickListFilter.types.d.ts.map +1 -1
- package/dist/components/molecules/Filters/PickListFilter/PickListFilter.utils.d.ts +8 -3
- package/dist/components/molecules/Filters/PickListFilter/PickListFilter.utils.d.ts.map +1 -1
- package/dist/components/molecules/Filters/ScaleRangeFilter/ScaleRangeFilter.d.ts.map +1 -1
- package/dist/components/molecules/Filters/TriStateFilter/TriStateFilter.utils.d.ts +1 -1
- package/dist/components/molecules/Filters/TriStateFilter/TriStateFilter.utils.d.ts.map +1 -1
- package/dist/components/molecules/Filters/index.d.ts +3 -2
- package/dist/components/molecules/Filters/index.d.ts.map +1 -1
- package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.accessibility.d.ts +11 -0
- package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.accessibility.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.d.ts +6 -0
- package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.hooks.d.ts +9 -0
- package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.hooks.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.parts.d.ts +5 -0
- package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.parts.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.types.d.ts +66 -0
- package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.types.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.utils.d.ts +14 -0
- package/dist/components/molecules/SavedSearches/SaveSearchDialog/SaveSearchDialog.utils.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SaveSearchDialog/index.d.ts +5 -0
- package/dist/components/molecules/SavedSearches/SaveSearchDialog/index.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.d.ts +6 -0
- package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.hooks.d.ts +7 -0
- package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.hooks.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.types.d.ts +19 -0
- package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.types.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.utils.d.ts +5 -0
- package/dist/components/molecules/SavedSearches/SavedSearchChipList/SavedSearchChipList.utils.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SavedSearchChipList/index.d.ts +3 -0
- package/dist/components/molecules/SavedSearches/SavedSearchChipList/index.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.accessibility.d.ts +6 -0
- package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.accessibility.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.d.ts +6 -0
- package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.hooks.d.ts +3 -0
- package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.hooks.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.parts.d.ts +7 -0
- package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.parts.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.types.d.ts +56 -0
- package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.types.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.utils.d.ts +18 -0
- package/dist/components/molecules/SavedSearches/SavedSearchesMenu/SavedSearchesMenu.utils.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/SavedSearchesMenu/index.d.ts +4 -0
- package/dist/components/molecules/SavedSearches/SavedSearchesMenu/index.d.ts.map +1 -0
- package/dist/components/molecules/SavedSearches/index.d.ts +4 -0
- package/dist/components/molecules/SavedSearches/index.d.ts.map +1 -0
- package/dist/components/organisms/Filters/FilterField/FilterField.d.ts.map +1 -1
- package/dist/components/organisms/Filters/FilterField/FilterField.types.d.ts +6 -4
- package/dist/components/organisms/Filters/FilterField/FilterField.types.d.ts.map +1 -1
- package/dist/components/organisms/Filters/FilterField/FilterField.utils.d.ts +5 -5
- package/dist/components/organisms/Filters/FilterField/FilterField.utils.d.ts.map +1 -1
- package/dist/components/organisms/Filters/FilterSurface/FilterSurface.accessibility.d.ts +4 -0
- package/dist/components/organisms/Filters/FilterSurface/FilterSurface.accessibility.d.ts.map +1 -1
- package/dist/components/organisms/Filters/FilterSurface/FilterSurface.d.ts +2 -2
- package/dist/components/organisms/Filters/FilterSurface/FilterSurface.d.ts.map +1 -1
- package/dist/components/organisms/Filters/FilterSurface/FilterSurface.hooks.d.ts.map +1 -1
- package/dist/components/organisms/Filters/FilterSurface/FilterSurface.parts.d.ts +7 -0
- package/dist/components/organisms/Filters/FilterSurface/FilterSurface.parts.d.ts.map +1 -0
- package/dist/components/organisms/Filters/FilterSurface/FilterSurface.types.d.ts +16 -0
- package/dist/components/organisms/Filters/FilterSurface/FilterSurface.types.d.ts.map +1 -1
- package/dist/components/organisms/Filters/FilterSurface/FilterSurface.utils.d.ts +4 -0
- package/dist/components/organisms/Filters/FilterSurface/FilterSurface.utils.d.ts.map +1 -0
- package/dist/components/organisms/Filters/FilterSurface/index.d.ts +1 -1
- package/dist/components/organisms/Filters/FilterSurface/index.d.ts.map +1 -1
- package/dist/hooks/useTruncatedText.d.ts.map +1 -1
- package/dist/index.cjs.js +690 -238
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +682 -240
- package/dist/index.esm.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.js
CHANGED
|
@@ -2698,12 +2698,12 @@ const createLucideIcon = (iconName, iconNode) => {
|
|
|
2698
2698
|
*/
|
|
2699
2699
|
|
|
2700
2700
|
|
|
2701
|
-
const __iconNode$
|
|
2701
|
+
const __iconNode$1x = [
|
|
2702
2702
|
["path", { d: "M15 12H3", key: "6jk70r" }],
|
|
2703
2703
|
["path", { d: "M17 18H3", key: "1amg6g" }],
|
|
2704
2704
|
["path", { d: "M21 6H3", key: "1jwq7v" }]
|
|
2705
2705
|
];
|
|
2706
|
-
const AlignLeft = createLucideIcon("align-left", __iconNode$
|
|
2706
|
+
const AlignLeft = createLucideIcon("align-left", __iconNode$1x);
|
|
2707
2707
|
|
|
2708
2708
|
/**
|
|
2709
2709
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2713,12 +2713,12 @@ const AlignLeft = createLucideIcon("align-left", __iconNode$1v);
|
|
|
2713
2713
|
*/
|
|
2714
2714
|
|
|
2715
2715
|
|
|
2716
|
-
const __iconNode$
|
|
2716
|
+
const __iconNode$1w = [
|
|
2717
2717
|
["rect", { width: "20", height: "5", x: "2", y: "3", rx: "1", key: "1wp1u1" }],
|
|
2718
2718
|
["path", { d: "M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8", key: "1s80jp" }],
|
|
2719
2719
|
["path", { d: "M10 12h4", key: "a56b0p" }]
|
|
2720
2720
|
];
|
|
2721
|
-
const Archive = createLucideIcon("archive", __iconNode$
|
|
2721
|
+
const Archive = createLucideIcon("archive", __iconNode$1w);
|
|
2722
2722
|
|
|
2723
2723
|
/**
|
|
2724
2724
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2728,11 +2728,11 @@ const Archive = createLucideIcon("archive", __iconNode$1u);
|
|
|
2728
2728
|
*/
|
|
2729
2729
|
|
|
2730
2730
|
|
|
2731
|
-
const __iconNode$
|
|
2731
|
+
const __iconNode$1v = [
|
|
2732
2732
|
["path", { d: "m12 19-7-7 7-7", key: "1l729n" }],
|
|
2733
2733
|
["path", { d: "M19 12H5", key: "x3x0zl" }]
|
|
2734
2734
|
];
|
|
2735
|
-
const ArrowLeft = createLucideIcon("arrow-left", __iconNode$
|
|
2735
|
+
const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1v);
|
|
2736
2736
|
|
|
2737
2737
|
/**
|
|
2738
2738
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2742,11 +2742,11 @@ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$1t);
|
|
|
2742
2742
|
*/
|
|
2743
2743
|
|
|
2744
2744
|
|
|
2745
|
-
const __iconNode$
|
|
2745
|
+
const __iconNode$1u = [
|
|
2746
2746
|
["path", { d: "M5 12h14", key: "1ays0h" }],
|
|
2747
2747
|
["path", { d: "m12 5 7 7-7 7", key: "xquz4c" }]
|
|
2748
2748
|
];
|
|
2749
|
-
const ArrowRight = createLucideIcon("arrow-right", __iconNode$
|
|
2749
|
+
const ArrowRight = createLucideIcon("arrow-right", __iconNode$1u);
|
|
2750
2750
|
|
|
2751
2751
|
/**
|
|
2752
2752
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2756,11 +2756,11 @@ const ArrowRight = createLucideIcon("arrow-right", __iconNode$1s);
|
|
|
2756
2756
|
*/
|
|
2757
2757
|
|
|
2758
2758
|
|
|
2759
|
-
const __iconNode$
|
|
2759
|
+
const __iconNode$1t = [
|
|
2760
2760
|
["path", { d: "M4.929 4.929 19.07 19.071", key: "196cmz" }],
|
|
2761
2761
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]
|
|
2762
2762
|
];
|
|
2763
|
-
const Ban = createLucideIcon("ban", __iconNode$
|
|
2763
|
+
const Ban = createLucideIcon("ban", __iconNode$1t);
|
|
2764
2764
|
|
|
2765
2765
|
/**
|
|
2766
2766
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2770,7 +2770,7 @@ const Ban = createLucideIcon("ban", __iconNode$1r);
|
|
|
2770
2770
|
*/
|
|
2771
2771
|
|
|
2772
2772
|
|
|
2773
|
-
const __iconNode$
|
|
2773
|
+
const __iconNode$1s = [
|
|
2774
2774
|
["path", { d: "M10.268 21a2 2 0 0 0 3.464 0", key: "vwvbt9" }],
|
|
2775
2775
|
[
|
|
2776
2776
|
"path",
|
|
@@ -2781,7 +2781,7 @@ const __iconNode$1q = [
|
|
|
2781
2781
|
],
|
|
2782
2782
|
["circle", { cx: "18", cy: "8", r: "3", key: "1g0gzu" }]
|
|
2783
2783
|
];
|
|
2784
|
-
const BellDot = createLucideIcon("bell-dot", __iconNode$
|
|
2784
|
+
const BellDot = createLucideIcon("bell-dot", __iconNode$1s);
|
|
2785
2785
|
|
|
2786
2786
|
/**
|
|
2787
2787
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2791,7 +2791,7 @@ const BellDot = createLucideIcon("bell-dot", __iconNode$1q);
|
|
|
2791
2791
|
*/
|
|
2792
2792
|
|
|
2793
2793
|
|
|
2794
|
-
const __iconNode$
|
|
2794
|
+
const __iconNode$1r = [
|
|
2795
2795
|
["path", { d: "M10.268 21a2 2 0 0 0 3.464 0", key: "vwvbt9" }],
|
|
2796
2796
|
["path", { d: "M22 8c0-2.3-.8-4.3-2-6", key: "5bb3ad" }],
|
|
2797
2797
|
[
|
|
@@ -2803,7 +2803,7 @@ const __iconNode$1p = [
|
|
|
2803
2803
|
],
|
|
2804
2804
|
["path", { d: "M4 2C2.8 3.7 2 5.7 2 8", key: "tap9e0" }]
|
|
2805
2805
|
];
|
|
2806
|
-
const BellRing = createLucideIcon("bell-ring", __iconNode$
|
|
2806
|
+
const BellRing = createLucideIcon("bell-ring", __iconNode$1r);
|
|
2807
2807
|
|
|
2808
2808
|
/**
|
|
2809
2809
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2813,7 +2813,7 @@ const BellRing = createLucideIcon("bell-ring", __iconNode$1p);
|
|
|
2813
2813
|
*/
|
|
2814
2814
|
|
|
2815
2815
|
|
|
2816
|
-
const __iconNode$
|
|
2816
|
+
const __iconNode$1q = [
|
|
2817
2817
|
["path", { d: "M10.268 21a2 2 0 0 0 3.464 0", key: "vwvbt9" }],
|
|
2818
2818
|
[
|
|
2819
2819
|
"path",
|
|
@@ -2823,7 +2823,7 @@ const __iconNode$1o = [
|
|
|
2823
2823
|
}
|
|
2824
2824
|
]
|
|
2825
2825
|
];
|
|
2826
|
-
const Bell = createLucideIcon("bell", __iconNode$
|
|
2826
|
+
const Bell = createLucideIcon("bell", __iconNode$1q);
|
|
2827
2827
|
|
|
2828
2828
|
/**
|
|
2829
2829
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2833,13 +2833,13 @@ const Bell = createLucideIcon("bell", __iconNode$1o);
|
|
|
2833
2833
|
*/
|
|
2834
2834
|
|
|
2835
2835
|
|
|
2836
|
-
const __iconNode$
|
|
2836
|
+
const __iconNode$1p = [
|
|
2837
2837
|
[
|
|
2838
2838
|
"path",
|
|
2839
2839
|
{ 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" }
|
|
2840
2840
|
]
|
|
2841
2841
|
];
|
|
2842
|
-
const Bold$1 = createLucideIcon("bold", __iconNode$
|
|
2842
|
+
const Bold$1 = createLucideIcon("bold", __iconNode$1p);
|
|
2843
2843
|
|
|
2844
2844
|
/**
|
|
2845
2845
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2849,7 +2849,20 @@ const Bold$1 = createLucideIcon("bold", __iconNode$1n);
|
|
|
2849
2849
|
*/
|
|
2850
2850
|
|
|
2851
2851
|
|
|
2852
|
-
const __iconNode$
|
|
2852
|
+
const __iconNode$1o = [
|
|
2853
|
+
["path", { d: "m19 21-7-4-7 4V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v16z", key: "1fy3hk" }]
|
|
2854
|
+
];
|
|
2855
|
+
const Bookmark = createLucideIcon("bookmark", __iconNode$1o);
|
|
2856
|
+
|
|
2857
|
+
/**
|
|
2858
|
+
* @license lucide-react v0.539.0 - ISC
|
|
2859
|
+
*
|
|
2860
|
+
* This source code is licensed under the ISC license.
|
|
2861
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
2862
|
+
*/
|
|
2863
|
+
|
|
2864
|
+
|
|
2865
|
+
const __iconNode$1n = [
|
|
2853
2866
|
[
|
|
2854
2867
|
"path",
|
|
2855
2868
|
{
|
|
@@ -2860,7 +2873,7 @@ const __iconNode$1m = [
|
|
|
2860
2873
|
["path", { d: "m3.3 7 8.7 5 8.7-5", key: "g66t2b" }],
|
|
2861
2874
|
["path", { d: "M12 22V12", key: "d0xqtd" }]
|
|
2862
2875
|
];
|
|
2863
|
-
const Box = createLucideIcon("box", __iconNode$
|
|
2876
|
+
const Box = createLucideIcon("box", __iconNode$1n);
|
|
2864
2877
|
|
|
2865
2878
|
/**
|
|
2866
2879
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2870,7 +2883,7 @@ const Box = createLucideIcon("box", __iconNode$1m);
|
|
|
2870
2883
|
*/
|
|
2871
2884
|
|
|
2872
2885
|
|
|
2873
|
-
const __iconNode$
|
|
2886
|
+
const __iconNode$1m = [
|
|
2874
2887
|
["path", { d: "M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z", key: "1b4qmf" }],
|
|
2875
2888
|
["path", { d: "M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2", key: "i71pzd" }],
|
|
2876
2889
|
["path", { d: "M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2", key: "10jefs" }],
|
|
@@ -2879,7 +2892,7 @@ const __iconNode$1l = [
|
|
|
2879
2892
|
["path", { d: "M10 14h4", key: "kelpxr" }],
|
|
2880
2893
|
["path", { d: "M10 18h4", key: "1ulq68" }]
|
|
2881
2894
|
];
|
|
2882
|
-
const Building2 = createLucideIcon("building-2", __iconNode$
|
|
2895
|
+
const Building2 = createLucideIcon("building-2", __iconNode$1m);
|
|
2883
2896
|
|
|
2884
2897
|
/**
|
|
2885
2898
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2889,7 +2902,7 @@ const Building2 = createLucideIcon("building-2", __iconNode$1l);
|
|
|
2889
2902
|
*/
|
|
2890
2903
|
|
|
2891
2904
|
|
|
2892
|
-
const __iconNode$
|
|
2905
|
+
const __iconNode$1l = [
|
|
2893
2906
|
["path", { d: "M8 2v4", key: "1cmpym" }],
|
|
2894
2907
|
["path", { d: "M16 2v4", key: "4m81vk" }],
|
|
2895
2908
|
["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
|
|
@@ -2901,7 +2914,7 @@ const __iconNode$1k = [
|
|
|
2901
2914
|
["path", { d: "M12 18h.01", key: "mhygvu" }],
|
|
2902
2915
|
["path", { d: "M16 18h.01", key: "kzsmim" }]
|
|
2903
2916
|
];
|
|
2904
|
-
const CalendarDays = createLucideIcon("calendar-days", __iconNode$
|
|
2917
|
+
const CalendarDays = createLucideIcon("calendar-days", __iconNode$1l);
|
|
2905
2918
|
|
|
2906
2919
|
/**
|
|
2907
2920
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2911,13 +2924,13 @@ const CalendarDays = createLucideIcon("calendar-days", __iconNode$1k);
|
|
|
2911
2924
|
*/
|
|
2912
2925
|
|
|
2913
2926
|
|
|
2914
|
-
const __iconNode$
|
|
2927
|
+
const __iconNode$1k = [
|
|
2915
2928
|
["path", { d: "M8 2v4", key: "1cmpym" }],
|
|
2916
2929
|
["path", { d: "M16 2v4", key: "4m81vk" }],
|
|
2917
2930
|
["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
|
|
2918
2931
|
["path", { d: "M3 10h18", key: "8toen8" }]
|
|
2919
2932
|
];
|
|
2920
|
-
const Calendar$1 = createLucideIcon("calendar", __iconNode$
|
|
2933
|
+
const Calendar$1 = createLucideIcon("calendar", __iconNode$1k);
|
|
2921
2934
|
|
|
2922
2935
|
/**
|
|
2923
2936
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2927,11 +2940,11 @@ const Calendar$1 = createLucideIcon("calendar", __iconNode$1j);
|
|
|
2927
2940
|
*/
|
|
2928
2941
|
|
|
2929
2942
|
|
|
2930
|
-
const __iconNode$
|
|
2943
|
+
const __iconNode$1j = [
|
|
2931
2944
|
["path", { d: "M18 6 7 17l-5-5", key: "116fxf" }],
|
|
2932
2945
|
["path", { d: "m22 10-7.5 7.5L13 16", key: "ke71qq" }]
|
|
2933
2946
|
];
|
|
2934
|
-
const CheckCheck = createLucideIcon("check-check", __iconNode$
|
|
2947
|
+
const CheckCheck = createLucideIcon("check-check", __iconNode$1j);
|
|
2935
2948
|
|
|
2936
2949
|
/**
|
|
2937
2950
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2941,8 +2954,8 @@ const CheckCheck = createLucideIcon("check-check", __iconNode$1i);
|
|
|
2941
2954
|
*/
|
|
2942
2955
|
|
|
2943
2956
|
|
|
2944
|
-
const __iconNode$
|
|
2945
|
-
const Check = createLucideIcon("check", __iconNode$
|
|
2957
|
+
const __iconNode$1i = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
|
|
2958
|
+
const Check = createLucideIcon("check", __iconNode$1i);
|
|
2946
2959
|
|
|
2947
2960
|
/**
|
|
2948
2961
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2952,8 +2965,8 @@ const Check = createLucideIcon("check", __iconNode$1h);
|
|
|
2952
2965
|
*/
|
|
2953
2966
|
|
|
2954
2967
|
|
|
2955
|
-
const __iconNode$
|
|
2956
|
-
const ChevronDown = createLucideIcon("chevron-down", __iconNode$
|
|
2968
|
+
const __iconNode$1h = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
|
|
2969
|
+
const ChevronDown = createLucideIcon("chevron-down", __iconNode$1h);
|
|
2957
2970
|
|
|
2958
2971
|
/**
|
|
2959
2972
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2963,8 +2976,8 @@ const ChevronDown = createLucideIcon("chevron-down", __iconNode$1g);
|
|
|
2963
2976
|
*/
|
|
2964
2977
|
|
|
2965
2978
|
|
|
2966
|
-
const __iconNode$
|
|
2967
|
-
const ChevronLeft = createLucideIcon("chevron-left", __iconNode$
|
|
2979
|
+
const __iconNode$1g = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
|
|
2980
|
+
const ChevronLeft = createLucideIcon("chevron-left", __iconNode$1g);
|
|
2968
2981
|
|
|
2969
2982
|
/**
|
|
2970
2983
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2974,8 +2987,8 @@ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$1f);
|
|
|
2974
2987
|
*/
|
|
2975
2988
|
|
|
2976
2989
|
|
|
2977
|
-
const __iconNode$
|
|
2978
|
-
const ChevronRight = createLucideIcon("chevron-right", __iconNode$
|
|
2990
|
+
const __iconNode$1f = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
|
|
2991
|
+
const ChevronRight = createLucideIcon("chevron-right", __iconNode$1f);
|
|
2979
2992
|
|
|
2980
2993
|
/**
|
|
2981
2994
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2985,8 +2998,8 @@ const ChevronRight = createLucideIcon("chevron-right", __iconNode$1e);
|
|
|
2985
2998
|
*/
|
|
2986
2999
|
|
|
2987
3000
|
|
|
2988
|
-
const __iconNode$
|
|
2989
|
-
const ChevronUp = createLucideIcon("chevron-up", __iconNode$
|
|
3001
|
+
const __iconNode$1e = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
|
|
3002
|
+
const ChevronUp = createLucideIcon("chevron-up", __iconNode$1e);
|
|
2990
3003
|
|
|
2991
3004
|
/**
|
|
2992
3005
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -2996,11 +3009,11 @@ const ChevronUp = createLucideIcon("chevron-up", __iconNode$1d);
|
|
|
2996
3009
|
*/
|
|
2997
3010
|
|
|
2998
3011
|
|
|
2999
|
-
const __iconNode$
|
|
3012
|
+
const __iconNode$1d = [
|
|
3000
3013
|
["path", { d: "m11 17-5-5 5-5", key: "13zhaf" }],
|
|
3001
3014
|
["path", { d: "m18 17-5-5 5-5", key: "h8a8et" }]
|
|
3002
3015
|
];
|
|
3003
|
-
const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$
|
|
3016
|
+
const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$1d);
|
|
3004
3017
|
|
|
3005
3018
|
/**
|
|
3006
3019
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3010,11 +3023,11 @@ const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$1c);
|
|
|
3010
3023
|
*/
|
|
3011
3024
|
|
|
3012
3025
|
|
|
3013
|
-
const __iconNode$
|
|
3026
|
+
const __iconNode$1c = [
|
|
3014
3027
|
["path", { d: "m6 17 5-5-5-5", key: "xnjwq" }],
|
|
3015
3028
|
["path", { d: "m13 17 5-5-5-5", key: "17xmmf" }]
|
|
3016
3029
|
];
|
|
3017
|
-
const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$
|
|
3030
|
+
const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$1c);
|
|
3018
3031
|
|
|
3019
3032
|
/**
|
|
3020
3033
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3024,12 +3037,12 @@ const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$1b);
|
|
|
3024
3037
|
*/
|
|
3025
3038
|
|
|
3026
3039
|
|
|
3027
|
-
const __iconNode$
|
|
3040
|
+
const __iconNode$1b = [
|
|
3028
3041
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
3029
3042
|
["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
|
|
3030
3043
|
["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
|
|
3031
3044
|
];
|
|
3032
|
-
const CircleAlert = createLucideIcon("circle-alert", __iconNode$
|
|
3045
|
+
const CircleAlert = createLucideIcon("circle-alert", __iconNode$1b);
|
|
3033
3046
|
|
|
3034
3047
|
/**
|
|
3035
3048
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3039,11 +3052,11 @@ const CircleAlert = createLucideIcon("circle-alert", __iconNode$1a);
|
|
|
3039
3052
|
*/
|
|
3040
3053
|
|
|
3041
3054
|
|
|
3042
|
-
const __iconNode$
|
|
3055
|
+
const __iconNode$1a = [
|
|
3043
3056
|
["path", { d: "M21.801 10A10 10 0 1 1 17 3.335", key: "yps3ct" }],
|
|
3044
3057
|
["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }]
|
|
3045
3058
|
];
|
|
3046
|
-
const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$
|
|
3059
|
+
const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$1a);
|
|
3047
3060
|
|
|
3048
3061
|
/**
|
|
3049
3062
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3053,11 +3066,11 @@ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$19);
|
|
|
3053
3066
|
*/
|
|
3054
3067
|
|
|
3055
3068
|
|
|
3056
|
-
const __iconNode$
|
|
3069
|
+
const __iconNode$19 = [
|
|
3057
3070
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
3058
3071
|
["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
|
|
3059
3072
|
];
|
|
3060
|
-
const CircleCheck = createLucideIcon("circle-check", __iconNode$
|
|
3073
|
+
const CircleCheck = createLucideIcon("circle-check", __iconNode$19);
|
|
3061
3074
|
|
|
3062
3075
|
/**
|
|
3063
3076
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3067,11 +3080,11 @@ const CircleCheck = createLucideIcon("circle-check", __iconNode$18);
|
|
|
3067
3080
|
*/
|
|
3068
3081
|
|
|
3069
3082
|
|
|
3070
|
-
const __iconNode$
|
|
3083
|
+
const __iconNode$18 = [
|
|
3071
3084
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
3072
3085
|
["path", { d: "m16 10-4 4-4-4", key: "894hmk" }]
|
|
3073
3086
|
];
|
|
3074
|
-
const CircleChevronDown = createLucideIcon("circle-chevron-down", __iconNode$
|
|
3087
|
+
const CircleChevronDown = createLucideIcon("circle-chevron-down", __iconNode$18);
|
|
3075
3088
|
|
|
3076
3089
|
/**
|
|
3077
3090
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3081,11 +3094,11 @@ const CircleChevronDown = createLucideIcon("circle-chevron-down", __iconNode$17)
|
|
|
3081
3094
|
*/
|
|
3082
3095
|
|
|
3083
3096
|
|
|
3084
|
-
const __iconNode$
|
|
3097
|
+
const __iconNode$17 = [
|
|
3085
3098
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
3086
3099
|
["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }]
|
|
3087
3100
|
];
|
|
3088
|
-
const CircleDot = createLucideIcon("circle-dot", __iconNode$
|
|
3101
|
+
const CircleDot = createLucideIcon("circle-dot", __iconNode$17);
|
|
3089
3102
|
|
|
3090
3103
|
/**
|
|
3091
3104
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3095,12 +3108,12 @@ const CircleDot = createLucideIcon("circle-dot", __iconNode$16);
|
|
|
3095
3108
|
*/
|
|
3096
3109
|
|
|
3097
3110
|
|
|
3098
|
-
const __iconNode$
|
|
3111
|
+
const __iconNode$16 = [
|
|
3099
3112
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
3100
3113
|
["path", { d: "m15 9-6 6", key: "1uzhvr" }],
|
|
3101
3114
|
["path", { d: "m9 9 6 6", key: "z0biqf" }]
|
|
3102
3115
|
];
|
|
3103
|
-
const CircleX = createLucideIcon("circle-x", __iconNode$
|
|
3116
|
+
const CircleX = createLucideIcon("circle-x", __iconNode$16);
|
|
3104
3117
|
|
|
3105
3118
|
/**
|
|
3106
3119
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3110,8 +3123,8 @@ const CircleX = createLucideIcon("circle-x", __iconNode$15);
|
|
|
3110
3123
|
*/
|
|
3111
3124
|
|
|
3112
3125
|
|
|
3113
|
-
const __iconNode$
|
|
3114
|
-
const Circle = createLucideIcon("circle", __iconNode$
|
|
3126
|
+
const __iconNode$15 = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
|
|
3127
|
+
const Circle = createLucideIcon("circle", __iconNode$15);
|
|
3115
3128
|
|
|
3116
3129
|
/**
|
|
3117
3130
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3121,11 +3134,11 @@ const Circle = createLucideIcon("circle", __iconNode$14);
|
|
|
3121
3134
|
*/
|
|
3122
3135
|
|
|
3123
3136
|
|
|
3124
|
-
const __iconNode$
|
|
3137
|
+
const __iconNode$14 = [
|
|
3125
3138
|
["path", { d: "M12 6v6l4 2", key: "mmk7yg" }],
|
|
3126
3139
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]
|
|
3127
3140
|
];
|
|
3128
|
-
const Clock = createLucideIcon("clock", __iconNode$
|
|
3141
|
+
const Clock = createLucideIcon("clock", __iconNode$14);
|
|
3129
3142
|
|
|
3130
3143
|
/**
|
|
3131
3144
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3135,11 +3148,11 @@ const Clock = createLucideIcon("clock", __iconNode$13);
|
|
|
3135
3148
|
*/
|
|
3136
3149
|
|
|
3137
3150
|
|
|
3138
|
-
const __iconNode$
|
|
3151
|
+
const __iconNode$13 = [
|
|
3139
3152
|
["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
|
|
3140
3153
|
["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" }]
|
|
3141
3154
|
];
|
|
3142
|
-
const Copy = createLucideIcon("copy", __iconNode$
|
|
3155
|
+
const Copy = createLucideIcon("copy", __iconNode$13);
|
|
3143
3156
|
|
|
3144
3157
|
/**
|
|
3145
3158
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3149,11 +3162,11 @@ const Copy = createLucideIcon("copy", __iconNode$12);
|
|
|
3149
3162
|
*/
|
|
3150
3163
|
|
|
3151
3164
|
|
|
3152
|
-
const __iconNode$
|
|
3165
|
+
const __iconNode$12 = [
|
|
3153
3166
|
["path", { d: "M6 2v14a2 2 0 0 0 2 2h14", key: "ron5a4" }],
|
|
3154
3167
|
["path", { d: "M18 22V8a2 2 0 0 0-2-2H2", key: "7s9ehn" }]
|
|
3155
3168
|
];
|
|
3156
|
-
const Crop = createLucideIcon("crop", __iconNode$
|
|
3169
|
+
const Crop = createLucideIcon("crop", __iconNode$12);
|
|
3157
3170
|
|
|
3158
3171
|
/**
|
|
3159
3172
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3163,12 +3176,12 @@ const Crop = createLucideIcon("crop", __iconNode$11);
|
|
|
3163
3176
|
*/
|
|
3164
3177
|
|
|
3165
3178
|
|
|
3166
|
-
const __iconNode$
|
|
3179
|
+
const __iconNode$11 = [
|
|
3167
3180
|
["path", { d: "M12 15V3", key: "m9g1x1" }],
|
|
3168
3181
|
["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }],
|
|
3169
3182
|
["path", { d: "m7 10 5 5 5-5", key: "brsn70" }]
|
|
3170
3183
|
];
|
|
3171
|
-
const Download = createLucideIcon("download", __iconNode$
|
|
3184
|
+
const Download = createLucideIcon("download", __iconNode$11);
|
|
3172
3185
|
|
|
3173
3186
|
/**
|
|
3174
3187
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3178,12 +3191,12 @@ const Download = createLucideIcon("download", __iconNode$10);
|
|
|
3178
3191
|
*/
|
|
3179
3192
|
|
|
3180
3193
|
|
|
3181
|
-
const __iconNode
|
|
3194
|
+
const __iconNode$10 = [
|
|
3182
3195
|
["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
|
|
3183
3196
|
["circle", { cx: "12", cy: "5", r: "1", key: "gxeob9" }],
|
|
3184
3197
|
["circle", { cx: "12", cy: "19", r: "1", key: "lyex9k" }]
|
|
3185
3198
|
];
|
|
3186
|
-
const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode
|
|
3199
|
+
const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$10);
|
|
3187
3200
|
|
|
3188
3201
|
/**
|
|
3189
3202
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3193,12 +3206,12 @@ const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$$);
|
|
|
3193
3206
|
*/
|
|
3194
3207
|
|
|
3195
3208
|
|
|
3196
|
-
const __iconNode
|
|
3209
|
+
const __iconNode$$ = [
|
|
3197
3210
|
["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
|
|
3198
3211
|
["circle", { cx: "19", cy: "12", r: "1", key: "1wjl8i" }],
|
|
3199
3212
|
["circle", { cx: "5", cy: "12", r: "1", key: "1pcz8c" }]
|
|
3200
3213
|
];
|
|
3201
|
-
const Ellipsis = createLucideIcon("ellipsis", __iconNode
|
|
3214
|
+
const Ellipsis = createLucideIcon("ellipsis", __iconNode$$);
|
|
3202
3215
|
|
|
3203
3216
|
/**
|
|
3204
3217
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3208,12 +3221,12 @@ const Ellipsis = createLucideIcon("ellipsis", __iconNode$_);
|
|
|
3208
3221
|
*/
|
|
3209
3222
|
|
|
3210
3223
|
|
|
3211
|
-
const __iconNode$
|
|
3224
|
+
const __iconNode$_ = [
|
|
3212
3225
|
["path", { d: "M15 3h6v6", key: "1q9fwt" }],
|
|
3213
3226
|
["path", { d: "M10 14 21 3", key: "gplh6r" }],
|
|
3214
3227
|
["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
|
|
3215
3228
|
];
|
|
3216
|
-
const ExternalLink = createLucideIcon("external-link", __iconNode$
|
|
3229
|
+
const ExternalLink = createLucideIcon("external-link", __iconNode$_);
|
|
3217
3230
|
|
|
3218
3231
|
/**
|
|
3219
3232
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3223,7 +3236,7 @@ const ExternalLink = createLucideIcon("external-link", __iconNode$Z);
|
|
|
3223
3236
|
*/
|
|
3224
3237
|
|
|
3225
3238
|
|
|
3226
|
-
const __iconNode$
|
|
3239
|
+
const __iconNode$Z = [
|
|
3227
3240
|
[
|
|
3228
3241
|
"path",
|
|
3229
3242
|
{
|
|
@@ -3233,7 +3246,7 @@ const __iconNode$Y = [
|
|
|
3233
3246
|
],
|
|
3234
3247
|
["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
|
|
3235
3248
|
];
|
|
3236
|
-
const Eye = createLucideIcon("eye", __iconNode$
|
|
3249
|
+
const Eye = createLucideIcon("eye", __iconNode$Z);
|
|
3237
3250
|
|
|
3238
3251
|
/**
|
|
3239
3252
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3243,13 +3256,13 @@ const Eye = createLucideIcon("eye", __iconNode$Y);
|
|
|
3243
3256
|
*/
|
|
3244
3257
|
|
|
3245
3258
|
|
|
3246
|
-
const __iconNode$
|
|
3259
|
+
const __iconNode$Y = [
|
|
3247
3260
|
[
|
|
3248
3261
|
"path",
|
|
3249
3262
|
{ d: "M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z", key: "1jg4f8" }
|
|
3250
3263
|
]
|
|
3251
3264
|
];
|
|
3252
|
-
const Facebook = createLucideIcon("facebook", __iconNode$
|
|
3265
|
+
const Facebook = createLucideIcon("facebook", __iconNode$Y);
|
|
3253
3266
|
|
|
3254
3267
|
/**
|
|
3255
3268
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3259,7 +3272,7 @@ const Facebook = createLucideIcon("facebook", __iconNode$X);
|
|
|
3259
3272
|
*/
|
|
3260
3273
|
|
|
3261
3274
|
|
|
3262
|
-
const __iconNode$
|
|
3275
|
+
const __iconNode$X = [
|
|
3263
3276
|
["path", { d: "M12 22h6a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v3.072", key: "n6s66f" }],
|
|
3264
3277
|
["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
|
|
3265
3278
|
[
|
|
@@ -3271,7 +3284,7 @@ const __iconNode$W = [
|
|
|
3271
3284
|
],
|
|
3272
3285
|
["circle", { cx: "5", cy: "14", r: "3", key: "ufru5t" }]
|
|
3273
3286
|
];
|
|
3274
|
-
const FileBadge = createLucideIcon("file-badge", __iconNode$
|
|
3287
|
+
const FileBadge = createLucideIcon("file-badge", __iconNode$X);
|
|
3275
3288
|
|
|
3276
3289
|
/**
|
|
3277
3290
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3281,12 +3294,12 @@ const FileBadge = createLucideIcon("file-badge", __iconNode$W);
|
|
|
3281
3294
|
*/
|
|
3282
3295
|
|
|
3283
3296
|
|
|
3284
|
-
const __iconNode$
|
|
3297
|
+
const __iconNode$W = [
|
|
3285
3298
|
["path", { d: "M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4", key: "1pf5j1" }],
|
|
3286
3299
|
["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
|
|
3287
3300
|
["path", { d: "m3 15 2 2 4-4", key: "1lhrkk" }]
|
|
3288
3301
|
];
|
|
3289
|
-
const FileCheck2 = createLucideIcon("file-check-2", __iconNode$
|
|
3302
|
+
const FileCheck2 = createLucideIcon("file-check-2", __iconNode$W);
|
|
3290
3303
|
|
|
3291
3304
|
/**
|
|
3292
3305
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3296,14 +3309,14 @@ const FileCheck2 = createLucideIcon("file-check-2", __iconNode$V);
|
|
|
3296
3309
|
*/
|
|
3297
3310
|
|
|
3298
3311
|
|
|
3299
|
-
const __iconNode$
|
|
3312
|
+
const __iconNode$V = [
|
|
3300
3313
|
["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
|
|
3301
3314
|
["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
|
|
3302
3315
|
["path", { d: "M10 9H8", key: "b1mrlr" }],
|
|
3303
3316
|
["path", { d: "M16 13H8", key: "t4e002" }],
|
|
3304
3317
|
["path", { d: "M16 17H8", key: "z1uh3a" }]
|
|
3305
3318
|
];
|
|
3306
|
-
const FileText = createLucideIcon("file-text", __iconNode$
|
|
3319
|
+
const FileText = createLucideIcon("file-text", __iconNode$V);
|
|
3307
3320
|
|
|
3308
3321
|
/**
|
|
3309
3322
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3313,7 +3326,7 @@ const FileText = createLucideIcon("file-text", __iconNode$U);
|
|
|
3313
3326
|
*/
|
|
3314
3327
|
|
|
3315
3328
|
|
|
3316
|
-
const __iconNode$
|
|
3329
|
+
const __iconNode$U = [
|
|
3317
3330
|
[
|
|
3318
3331
|
"path",
|
|
3319
3332
|
{
|
|
@@ -3324,7 +3337,7 @@ const __iconNode$T = [
|
|
|
3324
3337
|
["path", { d: "m16.5 3.5 5 5", key: "15e6fa" }],
|
|
3325
3338
|
["path", { d: "m21.5 3.5-5 5", key: "m0lwru" }]
|
|
3326
3339
|
];
|
|
3327
|
-
const FunnelX = createLucideIcon("funnel-x", __iconNode$
|
|
3340
|
+
const FunnelX = createLucideIcon("funnel-x", __iconNode$U);
|
|
3328
3341
|
|
|
3329
3342
|
/**
|
|
3330
3343
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3334,7 +3347,7 @@ const FunnelX = createLucideIcon("funnel-x", __iconNode$T);
|
|
|
3334
3347
|
*/
|
|
3335
3348
|
|
|
3336
3349
|
|
|
3337
|
-
const __iconNode$
|
|
3350
|
+
const __iconNode$T = [
|
|
3338
3351
|
[
|
|
3339
3352
|
"path",
|
|
3340
3353
|
{
|
|
@@ -3343,7 +3356,7 @@ const __iconNode$S = [
|
|
|
3343
3356
|
}
|
|
3344
3357
|
]
|
|
3345
3358
|
];
|
|
3346
|
-
const Funnel = createLucideIcon("funnel", __iconNode$
|
|
3359
|
+
const Funnel = createLucideIcon("funnel", __iconNode$T);
|
|
3347
3360
|
|
|
3348
3361
|
/**
|
|
3349
3362
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3353,7 +3366,7 @@ const Funnel = createLucideIcon("funnel", __iconNode$S);
|
|
|
3353
3366
|
*/
|
|
3354
3367
|
|
|
3355
3368
|
|
|
3356
|
-
const __iconNode$
|
|
3369
|
+
const __iconNode$S = [
|
|
3357
3370
|
["path", { d: "M10.5 3 8 9l4 13 4-13-2.5-6", key: "b3dvk1" }],
|
|
3358
3371
|
[
|
|
3359
3372
|
"path",
|
|
@@ -3364,7 +3377,7 @@ const __iconNode$R = [
|
|
|
3364
3377
|
],
|
|
3365
3378
|
["path", { d: "M2 9h20", key: "16fsjt" }]
|
|
3366
3379
|
];
|
|
3367
|
-
const Gem = createLucideIcon("gem", __iconNode$
|
|
3380
|
+
const Gem = createLucideIcon("gem", __iconNode$S);
|
|
3368
3381
|
|
|
3369
3382
|
/**
|
|
3370
3383
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3374,7 +3387,7 @@ const Gem = createLucideIcon("gem", __iconNode$R);
|
|
|
3374
3387
|
*/
|
|
3375
3388
|
|
|
3376
3389
|
|
|
3377
|
-
const __iconNode$
|
|
3390
|
+
const __iconNode$R = [
|
|
3378
3391
|
["circle", { cx: "12", cy: "9", r: "1", key: "124mty" }],
|
|
3379
3392
|
["circle", { cx: "19", cy: "9", r: "1", key: "1ruzo2" }],
|
|
3380
3393
|
["circle", { cx: "5", cy: "9", r: "1", key: "1a8b28" }],
|
|
@@ -3382,7 +3395,7 @@ const __iconNode$Q = [
|
|
|
3382
3395
|
["circle", { cx: "19", cy: "15", r: "1", key: "1a92ep" }],
|
|
3383
3396
|
["circle", { cx: "5", cy: "15", r: "1", key: "5r1jwy" }]
|
|
3384
3397
|
];
|
|
3385
|
-
const GripHorizontal = createLucideIcon("grip-horizontal", __iconNode$
|
|
3398
|
+
const GripHorizontal = createLucideIcon("grip-horizontal", __iconNode$R);
|
|
3386
3399
|
|
|
3387
3400
|
/**
|
|
3388
3401
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3392,7 +3405,7 @@ const GripHorizontal = createLucideIcon("grip-horizontal", __iconNode$Q);
|
|
|
3392
3405
|
*/
|
|
3393
3406
|
|
|
3394
3407
|
|
|
3395
|
-
const __iconNode$
|
|
3408
|
+
const __iconNode$Q = [
|
|
3396
3409
|
["circle", { cx: "9", cy: "12", r: "1", key: "1vctgf" }],
|
|
3397
3410
|
["circle", { cx: "9", cy: "5", r: "1", key: "hp0tcf" }],
|
|
3398
3411
|
["circle", { cx: "9", cy: "19", r: "1", key: "fkjjf6" }],
|
|
@@ -3400,7 +3413,7 @@ const __iconNode$P = [
|
|
|
3400
3413
|
["circle", { cx: "15", cy: "5", r: "1", key: "19l28e" }],
|
|
3401
3414
|
["circle", { cx: "15", cy: "19", r: "1", key: "f4zoj3" }]
|
|
3402
3415
|
];
|
|
3403
|
-
const GripVertical = createLucideIcon("grip-vertical", __iconNode$
|
|
3416
|
+
const GripVertical = createLucideIcon("grip-vertical", __iconNode$Q);
|
|
3404
3417
|
|
|
3405
3418
|
/**
|
|
3406
3419
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3410,13 +3423,13 @@ const GripVertical = createLucideIcon("grip-vertical", __iconNode$P);
|
|
|
3410
3423
|
*/
|
|
3411
3424
|
|
|
3412
3425
|
|
|
3413
|
-
const __iconNode$
|
|
3426
|
+
const __iconNode$P = [
|
|
3414
3427
|
["line", { x1: "4", x2: "20", y1: "9", y2: "9", key: "4lhtct" }],
|
|
3415
3428
|
["line", { x1: "4", x2: "20", y1: "15", y2: "15", key: "vyu0kd" }],
|
|
3416
3429
|
["line", { x1: "10", x2: "8", y1: "3", y2: "21", key: "1ggp8o" }],
|
|
3417
3430
|
["line", { x1: "16", x2: "14", y1: "3", y2: "21", key: "weycgp" }]
|
|
3418
3431
|
];
|
|
3419
|
-
const Hash = createLucideIcon("hash", __iconNode$
|
|
3432
|
+
const Hash = createLucideIcon("hash", __iconNode$P);
|
|
3420
3433
|
|
|
3421
3434
|
/**
|
|
3422
3435
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3426,13 +3439,13 @@ const Hash = createLucideIcon("hash", __iconNode$O);
|
|
|
3426
3439
|
*/
|
|
3427
3440
|
|
|
3428
3441
|
|
|
3429
|
-
const __iconNode$
|
|
3442
|
+
const __iconNode$O = [
|
|
3430
3443
|
["path", { d: "M4 12h8", key: "17cfdx" }],
|
|
3431
3444
|
["path", { d: "M4 18V6", key: "1rz3zl" }],
|
|
3432
3445
|
["path", { d: "M12 18V6", key: "zqpxq5" }],
|
|
3433
3446
|
["path", { d: "m17 12 3-2v8", key: "1hhhft" }]
|
|
3434
3447
|
];
|
|
3435
|
-
const Heading1 = createLucideIcon("heading-1", __iconNode$
|
|
3448
|
+
const Heading1 = createLucideIcon("heading-1", __iconNode$O);
|
|
3436
3449
|
|
|
3437
3450
|
/**
|
|
3438
3451
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3442,13 +3455,13 @@ const Heading1 = createLucideIcon("heading-1", __iconNode$N);
|
|
|
3442
3455
|
*/
|
|
3443
3456
|
|
|
3444
3457
|
|
|
3445
|
-
const __iconNode$
|
|
3458
|
+
const __iconNode$N = [
|
|
3446
3459
|
["path", { d: "M4 12h8", key: "17cfdx" }],
|
|
3447
3460
|
["path", { d: "M4 18V6", key: "1rz3zl" }],
|
|
3448
3461
|
["path", { d: "M12 18V6", key: "zqpxq5" }],
|
|
3449
3462
|
["path", { d: "M21 18h-4c0-4 4-3 4-6 0-1.5-2-2.5-4-1", key: "9jr5yi" }]
|
|
3450
3463
|
];
|
|
3451
|
-
const Heading2 = createLucideIcon("heading-2", __iconNode$
|
|
3464
|
+
const Heading2 = createLucideIcon("heading-2", __iconNode$N);
|
|
3452
3465
|
|
|
3453
3466
|
/**
|
|
3454
3467
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3458,14 +3471,14 @@ const Heading2 = createLucideIcon("heading-2", __iconNode$M);
|
|
|
3458
3471
|
*/
|
|
3459
3472
|
|
|
3460
3473
|
|
|
3461
|
-
const __iconNode$
|
|
3474
|
+
const __iconNode$M = [
|
|
3462
3475
|
["path", { d: "M4 12h8", key: "17cfdx" }],
|
|
3463
3476
|
["path", { d: "M4 18V6", key: "1rz3zl" }],
|
|
3464
3477
|
["path", { d: "M12 18V6", key: "zqpxq5" }],
|
|
3465
3478
|
["path", { d: "M17.5 10.5c1.7-1 3.5 0 3.5 1.5a2 2 0 0 1-2 2", key: "68ncm8" }],
|
|
3466
3479
|
["path", { d: "M17 17.5c2 1.5 4 .3 4-1.5a2 2 0 0 0-2-2", key: "1ejuhz" }]
|
|
3467
3480
|
];
|
|
3468
|
-
const Heading3 = createLucideIcon("heading-3", __iconNode$
|
|
3481
|
+
const Heading3 = createLucideIcon("heading-3", __iconNode$M);
|
|
3469
3482
|
|
|
3470
3483
|
/**
|
|
3471
3484
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3475,12 +3488,12 @@ const Heading3 = createLucideIcon("heading-3", __iconNode$L);
|
|
|
3475
3488
|
*/
|
|
3476
3489
|
|
|
3477
3490
|
|
|
3478
|
-
const __iconNode$
|
|
3491
|
+
const __iconNode$L = [
|
|
3479
3492
|
["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8", key: "1357e3" }],
|
|
3480
3493
|
["path", { d: "M3 3v5h5", key: "1xhq8a" }],
|
|
3481
3494
|
["path", { d: "M12 7v5l4 2", key: "1fdv2h" }]
|
|
3482
3495
|
];
|
|
3483
|
-
const History = createLucideIcon("history", __iconNode$
|
|
3496
|
+
const History = createLucideIcon("history", __iconNode$L);
|
|
3484
3497
|
|
|
3485
3498
|
/**
|
|
3486
3499
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3490,12 +3503,12 @@ const History = createLucideIcon("history", __iconNode$K);
|
|
|
3490
3503
|
*/
|
|
3491
3504
|
|
|
3492
3505
|
|
|
3493
|
-
const __iconNode$
|
|
3506
|
+
const __iconNode$K = [
|
|
3494
3507
|
["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", ry: "2", key: "1m3agn" }],
|
|
3495
3508
|
["circle", { cx: "9", cy: "9", r: "2", key: "af1f0g" }],
|
|
3496
3509
|
["path", { d: "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21", key: "1xmnt7" }]
|
|
3497
3510
|
];
|
|
3498
|
-
const Image$1 = createLucideIcon("image", __iconNode$
|
|
3511
|
+
const Image$1 = createLucideIcon("image", __iconNode$K);
|
|
3499
3512
|
|
|
3500
3513
|
/**
|
|
3501
3514
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3505,12 +3518,12 @@ const Image$1 = createLucideIcon("image", __iconNode$J);
|
|
|
3505
3518
|
*/
|
|
3506
3519
|
|
|
3507
3520
|
|
|
3508
|
-
const __iconNode$
|
|
3521
|
+
const __iconNode$J = [
|
|
3509
3522
|
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
3510
3523
|
["path", { d: "M12 16v-4", key: "1dtifu" }],
|
|
3511
3524
|
["path", { d: "M12 8h.01", key: "e9boi3" }]
|
|
3512
3525
|
];
|
|
3513
|
-
const Info = createLucideIcon("info", __iconNode$
|
|
3526
|
+
const Info = createLucideIcon("info", __iconNode$J);
|
|
3514
3527
|
|
|
3515
3528
|
/**
|
|
3516
3529
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3520,12 +3533,12 @@ const Info = createLucideIcon("info", __iconNode$I);
|
|
|
3520
3533
|
*/
|
|
3521
3534
|
|
|
3522
3535
|
|
|
3523
|
-
const __iconNode$
|
|
3536
|
+
const __iconNode$I = [
|
|
3524
3537
|
["line", { x1: "19", x2: "10", y1: "4", y2: "4", key: "15jd3p" }],
|
|
3525
3538
|
["line", { x1: "14", x2: "5", y1: "20", y2: "20", key: "bu0au3" }],
|
|
3526
3539
|
["line", { x1: "15", x2: "9", y1: "4", y2: "20", key: "uljnxc" }]
|
|
3527
3540
|
];
|
|
3528
|
-
const Italic$1 = createLucideIcon("italic", __iconNode$
|
|
3541
|
+
const Italic$1 = createLucideIcon("italic", __iconNode$I);
|
|
3529
3542
|
|
|
3530
3543
|
/**
|
|
3531
3544
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3535,7 +3548,7 @@ const Italic$1 = createLucideIcon("italic", __iconNode$H);
|
|
|
3535
3548
|
*/
|
|
3536
3549
|
|
|
3537
3550
|
|
|
3538
|
-
const __iconNode$
|
|
3551
|
+
const __iconNode$H = [
|
|
3539
3552
|
[
|
|
3540
3553
|
"path",
|
|
3541
3554
|
{
|
|
@@ -3545,7 +3558,7 @@ const __iconNode$G = [
|
|
|
3545
3558
|
],
|
|
3546
3559
|
["circle", { cx: "16.5", cy: "7.5", r: ".5", fill: "currentColor", key: "w0ekpg" }]
|
|
3547
3560
|
];
|
|
3548
|
-
const KeyRound = createLucideIcon("key-round", __iconNode$
|
|
3561
|
+
const KeyRound = createLucideIcon("key-round", __iconNode$H);
|
|
3549
3562
|
|
|
3550
3563
|
/**
|
|
3551
3564
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3555,12 +3568,12 @@ const KeyRound = createLucideIcon("key-round", __iconNode$G);
|
|
|
3555
3568
|
*/
|
|
3556
3569
|
|
|
3557
3570
|
|
|
3558
|
-
const __iconNode$
|
|
3571
|
+
const __iconNode$G = [
|
|
3559
3572
|
["path", { d: "M9 17H7A5 5 0 0 1 7 7h2", key: "8i5ue5" }],
|
|
3560
3573
|
["path", { d: "M15 7h2a5 5 0 1 1 0 10h-2", key: "1b9ql8" }],
|
|
3561
3574
|
["line", { x1: "8", x2: "16", y1: "12", y2: "12", key: "1jonct" }]
|
|
3562
3575
|
];
|
|
3563
|
-
const Link2 = createLucideIcon("link-2", __iconNode$
|
|
3576
|
+
const Link2 = createLucideIcon("link-2", __iconNode$G);
|
|
3564
3577
|
|
|
3565
3578
|
/**
|
|
3566
3579
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3570,14 +3583,14 @@ const Link2 = createLucideIcon("link-2", __iconNode$F);
|
|
|
3570
3583
|
*/
|
|
3571
3584
|
|
|
3572
3585
|
|
|
3573
|
-
const __iconNode$
|
|
3586
|
+
const __iconNode$F = [
|
|
3574
3587
|
["path", { d: "m3 17 2 2 4-4", key: "1jhpwq" }],
|
|
3575
3588
|
["path", { d: "m3 7 2 2 4-4", key: "1obspn" }],
|
|
3576
3589
|
["path", { d: "M13 6h8", key: "15sg57" }],
|
|
3577
3590
|
["path", { d: "M13 12h8", key: "h98zly" }],
|
|
3578
3591
|
["path", { d: "M13 18h8", key: "oe0vm4" }]
|
|
3579
3592
|
];
|
|
3580
|
-
const ListChecks = createLucideIcon("list-checks", __iconNode$
|
|
3593
|
+
const ListChecks = createLucideIcon("list-checks", __iconNode$F);
|
|
3581
3594
|
|
|
3582
3595
|
/**
|
|
3583
3596
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3587,7 +3600,7 @@ const ListChecks = createLucideIcon("list-checks", __iconNode$E);
|
|
|
3587
3600
|
*/
|
|
3588
3601
|
|
|
3589
3602
|
|
|
3590
|
-
const __iconNode$
|
|
3603
|
+
const __iconNode$E = [
|
|
3591
3604
|
["path", { d: "M10 12h11", key: "6m4ad9" }],
|
|
3592
3605
|
["path", { d: "M10 18h11", key: "11hvi2" }],
|
|
3593
3606
|
["path", { d: "M10 6h11", key: "c7qv1k" }],
|
|
@@ -3595,7 +3608,7 @@ const __iconNode$D = [
|
|
|
3595
3608
|
["path", { d: "M4 6h1v4", key: "cnovpq" }],
|
|
3596
3609
|
["path", { d: "M6 18H4c0-1 2-2 2-3s-1-1.5-2-1", key: "m9a95d" }]
|
|
3597
3610
|
];
|
|
3598
|
-
const ListOrdered = createLucideIcon("list-ordered", __iconNode$
|
|
3611
|
+
const ListOrdered = createLucideIcon("list-ordered", __iconNode$E);
|
|
3599
3612
|
|
|
3600
3613
|
/**
|
|
3601
3614
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3605,7 +3618,7 @@ const ListOrdered = createLucideIcon("list-ordered", __iconNode$D);
|
|
|
3605
3618
|
*/
|
|
3606
3619
|
|
|
3607
3620
|
|
|
3608
|
-
const __iconNode$
|
|
3621
|
+
const __iconNode$D = [
|
|
3609
3622
|
["path", { d: "M3 12h.01", key: "nlz23k" }],
|
|
3610
3623
|
["path", { d: "M3 18h.01", key: "1tta3j" }],
|
|
3611
3624
|
["path", { d: "M3 6h.01", key: "1rqtza" }],
|
|
@@ -3613,7 +3626,7 @@ const __iconNode$C = [
|
|
|
3613
3626
|
["path", { d: "M8 18h13", key: "1lx6n3" }],
|
|
3614
3627
|
["path", { d: "M8 6h13", key: "ik3vkj" }]
|
|
3615
3628
|
];
|
|
3616
|
-
const List = createLucideIcon("list", __iconNode$
|
|
3629
|
+
const List = createLucideIcon("list", __iconNode$D);
|
|
3617
3630
|
|
|
3618
3631
|
/**
|
|
3619
3632
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3623,8 +3636,8 @@ const List = createLucideIcon("list", __iconNode$C);
|
|
|
3623
3636
|
*/
|
|
3624
3637
|
|
|
3625
3638
|
|
|
3626
|
-
const __iconNode$
|
|
3627
|
-
const LoaderCircle = createLucideIcon("loader-circle", __iconNode$
|
|
3639
|
+
const __iconNode$C = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
|
|
3640
|
+
const LoaderCircle = createLucideIcon("loader-circle", __iconNode$C);
|
|
3628
3641
|
|
|
3629
3642
|
/**
|
|
3630
3643
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3634,7 +3647,7 @@ const LoaderCircle = createLucideIcon("loader-circle", __iconNode$B);
|
|
|
3634
3647
|
*/
|
|
3635
3648
|
|
|
3636
3649
|
|
|
3637
|
-
const __iconNode$
|
|
3650
|
+
const __iconNode$B = [
|
|
3638
3651
|
["path", { d: "M12 2v4", key: "3427ic" }],
|
|
3639
3652
|
["path", { d: "m16.2 7.8 2.9-2.9", key: "r700ao" }],
|
|
3640
3653
|
["path", { d: "M18 12h4", key: "wj9ykh" }],
|
|
@@ -3644,7 +3657,7 @@ const __iconNode$A = [
|
|
|
3644
3657
|
["path", { d: "M2 12h4", key: "j09sii" }],
|
|
3645
3658
|
["path", { d: "m4.9 4.9 2.9 2.9", key: "giyufr" }]
|
|
3646
3659
|
];
|
|
3647
|
-
const Loader = createLucideIcon("loader", __iconNode$
|
|
3660
|
+
const Loader = createLucideIcon("loader", __iconNode$B);
|
|
3648
3661
|
|
|
3649
3662
|
/**
|
|
3650
3663
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3654,12 +3667,12 @@ const Loader = createLucideIcon("loader", __iconNode$A);
|
|
|
3654
3667
|
*/
|
|
3655
3668
|
|
|
3656
3669
|
|
|
3657
|
-
const __iconNode$
|
|
3670
|
+
const __iconNode$A = [
|
|
3658
3671
|
["path", { d: "m16 17 5-5-5-5", key: "1bji2h" }],
|
|
3659
3672
|
["path", { d: "M21 12H9", key: "dn1m92" }],
|
|
3660
3673
|
["path", { d: "M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4", key: "1uf3rs" }]
|
|
3661
3674
|
];
|
|
3662
|
-
const LogOut = createLucideIcon("log-out", __iconNode$
|
|
3675
|
+
const LogOut = createLucideIcon("log-out", __iconNode$A);
|
|
3663
3676
|
|
|
3664
3677
|
/**
|
|
3665
3678
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3669,11 +3682,11 @@ const LogOut = createLucideIcon("log-out", __iconNode$z);
|
|
|
3669
3682
|
*/
|
|
3670
3683
|
|
|
3671
3684
|
|
|
3672
|
-
const __iconNode$
|
|
3685
|
+
const __iconNode$z = [
|
|
3673
3686
|
["path", { d: "m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7", key: "132q7q" }],
|
|
3674
3687
|
["rect", { x: "2", y: "4", width: "20", height: "16", rx: "2", key: "izxlao" }]
|
|
3675
3688
|
];
|
|
3676
|
-
const Mail = createLucideIcon("mail", __iconNode$
|
|
3689
|
+
const Mail = createLucideIcon("mail", __iconNode$z);
|
|
3677
3690
|
|
|
3678
3691
|
/**
|
|
3679
3692
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3683,12 +3696,12 @@ const Mail = createLucideIcon("mail", __iconNode$y);
|
|
|
3683
3696
|
*/
|
|
3684
3697
|
|
|
3685
3698
|
|
|
3686
|
-
const __iconNode$
|
|
3699
|
+
const __iconNode$y = [
|
|
3687
3700
|
["path", { d: "M4 12h16", key: "1lakjw" }],
|
|
3688
3701
|
["path", { d: "M4 18h16", key: "19g7jn" }],
|
|
3689
3702
|
["path", { d: "M4 6h16", key: "1o0s65" }]
|
|
3690
3703
|
];
|
|
3691
|
-
const Menu = createLucideIcon("menu", __iconNode$
|
|
3704
|
+
const Menu = createLucideIcon("menu", __iconNode$y);
|
|
3692
3705
|
|
|
3693
3706
|
/**
|
|
3694
3707
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3698,8 +3711,8 @@ const Menu = createLucideIcon("menu", __iconNode$x);
|
|
|
3698
3711
|
*/
|
|
3699
3712
|
|
|
3700
3713
|
|
|
3701
|
-
const __iconNode$
|
|
3702
|
-
const Minus = createLucideIcon("minus", __iconNode$
|
|
3714
|
+
const __iconNode$x = [["path", { d: "M5 12h14", key: "1ays0h" }]];
|
|
3715
|
+
const Minus = createLucideIcon("minus", __iconNode$x);
|
|
3703
3716
|
|
|
3704
3717
|
/**
|
|
3705
3718
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3709,7 +3722,7 @@ const Minus = createLucideIcon("minus", __iconNode$w);
|
|
|
3709
3722
|
*/
|
|
3710
3723
|
|
|
3711
3724
|
|
|
3712
|
-
const __iconNode$
|
|
3725
|
+
const __iconNode$w = [
|
|
3713
3726
|
[
|
|
3714
3727
|
"path",
|
|
3715
3728
|
{
|
|
@@ -3718,7 +3731,7 @@ const __iconNode$v = [
|
|
|
3718
3731
|
}
|
|
3719
3732
|
]
|
|
3720
3733
|
];
|
|
3721
|
-
const Moon = createLucideIcon("moon", __iconNode$
|
|
3734
|
+
const Moon = createLucideIcon("moon", __iconNode$w);
|
|
3722
3735
|
|
|
3723
3736
|
/**
|
|
3724
3737
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3728,7 +3741,7 @@ const Moon = createLucideIcon("moon", __iconNode$v);
|
|
|
3728
3741
|
*/
|
|
3729
3742
|
|
|
3730
3743
|
|
|
3731
|
-
const __iconNode$
|
|
3744
|
+
const __iconNode$v = [
|
|
3732
3745
|
[
|
|
3733
3746
|
"path",
|
|
3734
3747
|
{
|
|
@@ -3741,7 +3754,7 @@ const __iconNode$u = [
|
|
|
3741
3754
|
["circle", { cx: "6.5", cy: "12.5", r: ".5", fill: "currentColor", key: "qy21gx" }],
|
|
3742
3755
|
["circle", { cx: "8.5", cy: "7.5", r: ".5", fill: "currentColor", key: "fotxhn" }]
|
|
3743
3756
|
];
|
|
3744
|
-
const Palette = createLucideIcon("palette", __iconNode$
|
|
3757
|
+
const Palette = createLucideIcon("palette", __iconNode$v);
|
|
3745
3758
|
|
|
3746
3759
|
/**
|
|
3747
3760
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3751,12 +3764,12 @@ const Palette = createLucideIcon("palette", __iconNode$u);
|
|
|
3751
3764
|
*/
|
|
3752
3765
|
|
|
3753
3766
|
|
|
3754
|
-
const __iconNode$
|
|
3767
|
+
const __iconNode$u = [
|
|
3755
3768
|
["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }],
|
|
3756
3769
|
["path", { d: "M9 3v18", key: "fh3hqa" }],
|
|
3757
3770
|
["path", { d: "m16 15-3-3 3-3", key: "14y99z" }]
|
|
3758
3771
|
];
|
|
3759
|
-
const PanelLeftClose = createLucideIcon("panel-left-close", __iconNode$
|
|
3772
|
+
const PanelLeftClose = createLucideIcon("panel-left-close", __iconNode$u);
|
|
3760
3773
|
|
|
3761
3774
|
/**
|
|
3762
3775
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3766,7 +3779,7 @@ const PanelLeftClose = createLucideIcon("panel-left-close", __iconNode$t);
|
|
|
3766
3779
|
*/
|
|
3767
3780
|
|
|
3768
3781
|
|
|
3769
|
-
const __iconNode$
|
|
3782
|
+
const __iconNode$t = [
|
|
3770
3783
|
[
|
|
3771
3784
|
"path",
|
|
3772
3785
|
{
|
|
@@ -3775,7 +3788,7 @@ const __iconNode$s = [
|
|
|
3775
3788
|
}
|
|
3776
3789
|
]
|
|
3777
3790
|
];
|
|
3778
|
-
const Paperclip = createLucideIcon("paperclip", __iconNode$
|
|
3791
|
+
const Paperclip = createLucideIcon("paperclip", __iconNode$t);
|
|
3779
3792
|
|
|
3780
3793
|
/**
|
|
3781
3794
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3785,7 +3798,7 @@ const Paperclip = createLucideIcon("paperclip", __iconNode$s);
|
|
|
3785
3798
|
*/
|
|
3786
3799
|
|
|
3787
3800
|
|
|
3788
|
-
const __iconNode$
|
|
3801
|
+
const __iconNode$s = [
|
|
3789
3802
|
[
|
|
3790
3803
|
"path",
|
|
3791
3804
|
{
|
|
@@ -3795,7 +3808,7 @@ const __iconNode$r = [
|
|
|
3795
3808
|
],
|
|
3796
3809
|
["path", { d: "m15 5 4 4", key: "1mk7zo" }]
|
|
3797
3810
|
];
|
|
3798
|
-
const Pencil = createLucideIcon("pencil", __iconNode$
|
|
3811
|
+
const Pencil = createLucideIcon("pencil", __iconNode$s);
|
|
3799
3812
|
|
|
3800
3813
|
/**
|
|
3801
3814
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3805,7 +3818,7 @@ const Pencil = createLucideIcon("pencil", __iconNode$r);
|
|
|
3805
3818
|
*/
|
|
3806
3819
|
|
|
3807
3820
|
|
|
3808
|
-
const __iconNode$
|
|
3821
|
+
const __iconNode$r = [
|
|
3809
3822
|
[
|
|
3810
3823
|
"path",
|
|
3811
3824
|
{
|
|
@@ -3814,7 +3827,7 @@ const __iconNode$q = [
|
|
|
3814
3827
|
}
|
|
3815
3828
|
]
|
|
3816
3829
|
];
|
|
3817
|
-
const Phone = createLucideIcon("phone", __iconNode$
|
|
3830
|
+
const Phone = createLucideIcon("phone", __iconNode$r);
|
|
3818
3831
|
|
|
3819
3832
|
/**
|
|
3820
3833
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3824,7 +3837,7 @@ const Phone = createLucideIcon("phone", __iconNode$q);
|
|
|
3824
3837
|
*/
|
|
3825
3838
|
|
|
3826
3839
|
|
|
3827
|
-
const __iconNode$
|
|
3840
|
+
const __iconNode$q = [
|
|
3828
3841
|
[
|
|
3829
3842
|
"path",
|
|
3830
3843
|
{
|
|
@@ -3833,7 +3846,7 @@ const __iconNode$p = [
|
|
|
3833
3846
|
}
|
|
3834
3847
|
]
|
|
3835
3848
|
];
|
|
3836
|
-
const Play = createLucideIcon("play", __iconNode$
|
|
3849
|
+
const Play = createLucideIcon("play", __iconNode$q);
|
|
3837
3850
|
|
|
3838
3851
|
/**
|
|
3839
3852
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3843,11 +3856,11 @@ const Play = createLucideIcon("play", __iconNode$p);
|
|
|
3843
3856
|
*/
|
|
3844
3857
|
|
|
3845
3858
|
|
|
3846
|
-
const __iconNode$
|
|
3859
|
+
const __iconNode$p = [
|
|
3847
3860
|
["path", { d: "M5 12h14", key: "1ays0h" }],
|
|
3848
3861
|
["path", { d: "M12 5v14", key: "s699le" }]
|
|
3849
3862
|
];
|
|
3850
|
-
const Plus = createLucideIcon("plus", __iconNode$
|
|
3863
|
+
const Plus = createLucideIcon("plus", __iconNode$p);
|
|
3851
3864
|
|
|
3852
3865
|
/**
|
|
3853
3866
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3857,10 +3870,10 @@ const Plus = createLucideIcon("plus", __iconNode$o);
|
|
|
3857
3870
|
*/
|
|
3858
3871
|
|
|
3859
3872
|
|
|
3860
|
-
const __iconNode$
|
|
3873
|
+
const __iconNode$o = [
|
|
3861
3874
|
["rect", { width: "20", height: "12", x: "2", y: "6", rx: "2", key: "9lu3g6" }]
|
|
3862
3875
|
];
|
|
3863
|
-
const RectangleHorizontal = createLucideIcon("rectangle-horizontal", __iconNode$
|
|
3876
|
+
const RectangleHorizontal = createLucideIcon("rectangle-horizontal", __iconNode$o);
|
|
3864
3877
|
|
|
3865
3878
|
/**
|
|
3866
3879
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3870,11 +3883,11 @@ const RectangleHorizontal = createLucideIcon("rectangle-horizontal", __iconNode$
|
|
|
3870
3883
|
*/
|
|
3871
3884
|
|
|
3872
3885
|
|
|
3873
|
-
const __iconNode$
|
|
3886
|
+
const __iconNode$n = [
|
|
3874
3887
|
["path", { d: "M21 7v6h-6", key: "3ptur4" }],
|
|
3875
3888
|
["path", { d: "M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3l3 2.7", key: "1kgawr" }]
|
|
3876
3889
|
];
|
|
3877
|
-
const Redo = createLucideIcon("redo", __iconNode$
|
|
3890
|
+
const Redo = createLucideIcon("redo", __iconNode$n);
|
|
3878
3891
|
|
|
3879
3892
|
/**
|
|
3880
3893
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3884,13 +3897,13 @@ const Redo = createLucideIcon("redo", __iconNode$m);
|
|
|
3884
3897
|
*/
|
|
3885
3898
|
|
|
3886
3899
|
|
|
3887
|
-
const __iconNode$
|
|
3900
|
+
const __iconNode$m = [
|
|
3888
3901
|
["path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8", key: "v9h5vc" }],
|
|
3889
3902
|
["path", { d: "M21 3v5h-5", key: "1q7to0" }],
|
|
3890
3903
|
["path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16", key: "3uifl3" }],
|
|
3891
3904
|
["path", { d: "M8 16H3v5", key: "1cv678" }]
|
|
3892
3905
|
];
|
|
3893
|
-
const RefreshCw = createLucideIcon("refresh-cw", __iconNode$
|
|
3906
|
+
const RefreshCw = createLucideIcon("refresh-cw", __iconNode$m);
|
|
3894
3907
|
|
|
3895
3908
|
/**
|
|
3896
3909
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3900,14 +3913,14 @@ const RefreshCw = createLucideIcon("refresh-cw", __iconNode$l);
|
|
|
3900
3913
|
*/
|
|
3901
3914
|
|
|
3902
3915
|
|
|
3903
|
-
const __iconNode$
|
|
3916
|
+
const __iconNode$l = [
|
|
3904
3917
|
["path", { d: "M4 7V4h16v3", key: "9msm58" }],
|
|
3905
3918
|
["path", { d: "M5 20h6", key: "1h6pxn" }],
|
|
3906
3919
|
["path", { d: "M13 4 8 20", key: "kqq6aj" }],
|
|
3907
3920
|
["path", { d: "m15 15 5 5", key: "me55sn" }],
|
|
3908
3921
|
["path", { d: "m20 15-5 5", key: "11p7ol" }]
|
|
3909
3922
|
];
|
|
3910
|
-
const RemoveFormatting = createLucideIcon("remove-formatting", __iconNode$
|
|
3923
|
+
const RemoveFormatting = createLucideIcon("remove-formatting", __iconNode$l);
|
|
3911
3924
|
|
|
3912
3925
|
/**
|
|
3913
3926
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3917,11 +3930,11 @@ const RemoveFormatting = createLucideIcon("remove-formatting", __iconNode$k);
|
|
|
3917
3930
|
*/
|
|
3918
3931
|
|
|
3919
3932
|
|
|
3920
|
-
const __iconNode$
|
|
3933
|
+
const __iconNode$k = [
|
|
3921
3934
|
["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8", key: "1357e3" }],
|
|
3922
3935
|
["path", { d: "M3 3v5h5", key: "1xhq8a" }]
|
|
3923
3936
|
];
|
|
3924
|
-
const RotateCcw = createLucideIcon("rotate-ccw", __iconNode$
|
|
3937
|
+
const RotateCcw = createLucideIcon("rotate-ccw", __iconNode$k);
|
|
3925
3938
|
|
|
3926
3939
|
/**
|
|
3927
3940
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -3931,14 +3944,30 @@ const RotateCcw = createLucideIcon("rotate-ccw", __iconNode$j);
|
|
|
3931
3944
|
*/
|
|
3932
3945
|
|
|
3933
3946
|
|
|
3934
|
-
const __iconNode$
|
|
3947
|
+
const __iconNode$j = [
|
|
3935
3948
|
["circle", { cx: "6", cy: "6", r: "3", key: "1lh9wr" }],
|
|
3936
3949
|
["path", { d: "M8.12 8.12 12 12", key: "1alkpv" }],
|
|
3937
3950
|
["path", { d: "M20 4 8.12 15.88", key: "xgtan2" }],
|
|
3938
3951
|
["circle", { cx: "6", cy: "18", r: "3", key: "fqmcym" }],
|
|
3939
3952
|
["path", { d: "M14.8 14.8 20 20", key: "ptml3r" }]
|
|
3940
3953
|
];
|
|
3941
|
-
const Scissors = createLucideIcon("scissors", __iconNode$
|
|
3954
|
+
const Scissors = createLucideIcon("scissors", __iconNode$j);
|
|
3955
|
+
|
|
3956
|
+
/**
|
|
3957
|
+
* @license lucide-react v0.539.0 - ISC
|
|
3958
|
+
*
|
|
3959
|
+
* This source code is licensed under the ISC license.
|
|
3960
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
3961
|
+
*/
|
|
3962
|
+
|
|
3963
|
+
|
|
3964
|
+
const __iconNode$i = [
|
|
3965
|
+
["path", { d: "m13.5 8.5-5 5", key: "1cs55j" }],
|
|
3966
|
+
["path", { d: "m8.5 8.5 5 5", key: "a8mexj" }],
|
|
3967
|
+
["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }],
|
|
3968
|
+
["path", { d: "m21 21-4.3-4.3", key: "1qie3q" }]
|
|
3969
|
+
];
|
|
3970
|
+
const SearchX = createLucideIcon("search-x", __iconNode$i);
|
|
3942
3971
|
|
|
3943
3972
|
/**
|
|
3944
3973
|
* @license lucide-react v0.539.0 - ISC
|
|
@@ -15446,19 +15475,66 @@ function ApiComboBox({ contactType, selectedItem, onSelect, fetchBusinessContact
|
|
|
15446
15475
|
: '', fetchPage: fetchPage, resolveById: resolveById, preSelectedId: customerCode, searchPlaceholder: searchPlaceholder, emptyMessage: "No business contacts found.", disabled: disabled, className: className, align: align, debounceMs: 300, hideTriggerSearchIcon: hideTriggerSearchIcon }));
|
|
15447
15476
|
}
|
|
15448
15477
|
|
|
15449
|
-
|
|
15478
|
+
// A number with an optional `k` (thousand), `M` (million) or `B` (billion), any case, e.g. `1.5`, `2k`, `1.2M`.
|
|
15479
|
+
const NUMBER = String.raw `((?:\d+(?:\.\d+)?|\.\d+)[kKmMbB]?)`;
|
|
15480
|
+
const SUFFIX_MULTIPLIER = {
|
|
15481
|
+
k: 1000,
|
|
15482
|
+
m: 1000000,
|
|
15483
|
+
b: 1000000000,
|
|
15484
|
+
};
|
|
15485
|
+
function toExpressionNumber(raw) {
|
|
15486
|
+
const suffix = raw.slice(-1).toLowerCase();
|
|
15487
|
+
const multiplier = SUFFIX_MULTIPLIER[suffix];
|
|
15488
|
+
return multiplier
|
|
15489
|
+
? Math.round(Number(raw.slice(0, -1)) * multiplier * 1e6) / 1e6
|
|
15490
|
+
: Number(raw);
|
|
15491
|
+
}
|
|
15450
15492
|
const COMPARISON_RE = new RegExp(`^(>=|<=|>|<)${NUMBER}$`);
|
|
15451
15493
|
const BETWEEN_RE = new RegExp(`^${NUMBER}-${NUMBER}$`);
|
|
15452
15494
|
const EXACT_RE = new RegExp(`^${NUMBER}$`);
|
|
15453
|
-
|
|
15454
|
-
|
|
15455
|
-
|
|
15456
|
-
|
|
15457
|
-
|
|
15458
|
-
|
|
15459
|
-
|
|
15495
|
+
/** Neutral defaults for a number column with no known scale. */
|
|
15496
|
+
const DEFAULT_NUMBER_RULE_EXAMPLES = {
|
|
15497
|
+
low: 1,
|
|
15498
|
+
high: 10,
|
|
15499
|
+
exact: 5,
|
|
15500
|
+
};
|
|
15501
|
+
const SHORT_SCALES = [
|
|
15502
|
+
[1000000000, 'B'],
|
|
15503
|
+
[1000000, 'M'],
|
|
15504
|
+
[1000, 'k'],
|
|
15460
15505
|
];
|
|
15461
|
-
/**
|
|
15506
|
+
/** Rule text for a value: `1k`, `2.5k`, `1M`, `1B` so chips stay short; the parser reads them back. */
|
|
15507
|
+
function formatRuleNumber(value) {
|
|
15508
|
+
const [divisor, suffix] = SHORT_SCALES.find(([scale]) => Math.abs(value) >= scale) ?? [1, ''];
|
|
15509
|
+
const scaled = Math.round((value / divisor) * 100) / 100;
|
|
15510
|
+
return `${scaled}${suffix}`;
|
|
15511
|
+
}
|
|
15512
|
+
function formatRuleValue(value, unit) {
|
|
15513
|
+
const number = value.toLocaleString('en-US', { maximumFractionDigits: 2 });
|
|
15514
|
+
if (!unit)
|
|
15515
|
+
return number;
|
|
15516
|
+
return unit === '%' ? `${number}%` : `${number} ${unit}`;
|
|
15517
|
+
}
|
|
15518
|
+
/** The help popover's rule list for a column's typical range; rules use short numbers (`1k`) that the field accepts as typed. */
|
|
15519
|
+
function buildNumberRuleHelp({ low, high, exact, unit, } = DEFAULT_NUMBER_RULE_EXAMPLES) {
|
|
15520
|
+
const lowText = formatRuleValue(low, unit);
|
|
15521
|
+
const highText = formatRuleValue(high, unit);
|
|
15522
|
+
const lowRule = formatRuleNumber(low);
|
|
15523
|
+
const highRule = formatRuleNumber(high);
|
|
15524
|
+
// Smallest value first: the low bound, the range, a value inside it, then the high bound.
|
|
15525
|
+
return [
|
|
15526
|
+
{ rule: `>${lowRule}`, meaning: `More than ${lowText}` },
|
|
15527
|
+
{ rule: `>=${lowRule}`, meaning: `${lowText} or more` },
|
|
15528
|
+
{ rule: `${lowRule}–${highRule}`, meaning: `${lowText} to ${highText}` },
|
|
15529
|
+
{
|
|
15530
|
+
rule: formatRuleNumber(exact),
|
|
15531
|
+
meaning: `Exactly ${formatRuleValue(exact, unit)}`,
|
|
15532
|
+
},
|
|
15533
|
+
{ rule: `<${highRule}`, meaning: `Less than ${highText}` },
|
|
15534
|
+
{ rule: `<=${highRule}`, meaning: `${highText} or less` },
|
|
15535
|
+
];
|
|
15536
|
+
}
|
|
15537
|
+
/** Parses the typed rules listed by `buildNumberRuleHelp`. Accepts `-`, `–` or `—` for ranges and ignores spaces and thousands commas. */
|
|
15462
15538
|
function parseNumberExpression(text) {
|
|
15463
15539
|
const normalized = text.replace(/[\s,]/g, '').replace(/[–—]/g, '-');
|
|
15464
15540
|
if (!normalized)
|
|
@@ -15466,7 +15542,7 @@ function parseNumberExpression(text) {
|
|
|
15466
15542
|
const comparison = COMPARISON_RE.exec(normalized);
|
|
15467
15543
|
if (comparison) {
|
|
15468
15544
|
const [, operator, raw] = comparison;
|
|
15469
|
-
const value =
|
|
15545
|
+
const value = toExpressionNumber(raw);
|
|
15470
15546
|
if (operator.startsWith('>')) {
|
|
15471
15547
|
return {
|
|
15472
15548
|
ok: true,
|
|
@@ -15477,13 +15553,13 @@ function parseNumberExpression(text) {
|
|
|
15477
15553
|
}
|
|
15478
15554
|
const between = BETWEEN_RE.exec(normalized);
|
|
15479
15555
|
if (between) {
|
|
15480
|
-
const min =
|
|
15481
|
-
const max =
|
|
15556
|
+
const min = toExpressionNumber(between[1]);
|
|
15557
|
+
const max = toExpressionNumber(between[2]);
|
|
15482
15558
|
return min <= max ? { ok: true, range: { min, max } } : { ok: false };
|
|
15483
15559
|
}
|
|
15484
15560
|
const exact = EXACT_RE.exec(normalized);
|
|
15485
15561
|
if (exact) {
|
|
15486
|
-
const value =
|
|
15562
|
+
const value = toExpressionNumber(exact[1]);
|
|
15487
15563
|
return { ok: true, range: { min: value, max: value } };
|
|
15488
15564
|
}
|
|
15489
15565
|
return { ok: false };
|
|
@@ -15654,6 +15730,18 @@ function isFilterValueActive(value) {
|
|
|
15654
15730
|
const FILTER_FOCUS_RING = 'outline-none focus-visible:ring-2 focus-visible:ring-primary/30';
|
|
15655
15731
|
/** Text-link actions such as Clear and "Show all". */
|
|
15656
15732
|
const FILTER_LINK_CLASS_NAME = cn('cursor-pointer rounded-sm text-xs font-medium text-primary hover:underline', FILTER_FOCUS_RING);
|
|
15733
|
+
/** One look for every pickable row in a filter (list rows, Yes/No, date presets, number rules). */
|
|
15734
|
+
function getOptionRowClassName(selected = false, className) {
|
|
15735
|
+
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);
|
|
15736
|
+
}
|
|
15737
|
+
/** A selectable pill (chip options, range presets); one height and shape everywhere. */
|
|
15738
|
+
function getPillClassName(selected) {
|
|
15739
|
+
return getSelectableOptionClassName(selected, 'inline-flex h-8 items-center gap-1.5 rounded-full px-3');
|
|
15740
|
+
}
|
|
15741
|
+
/** Search box above a list (pick lists, saved searches); matches the inputs' height and corners. */
|
|
15742
|
+
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';
|
|
15743
|
+
/** Solid count bubble, e.g. a filter button's or card title's selected count. */
|
|
15744
|
+
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';
|
|
15657
15745
|
/** A fixed column count, or (when omitted) as many columns as fit at `minWidth` each. */
|
|
15658
15746
|
function getGridColumnsStyle(columns, minWidth = '7rem') {
|
|
15659
15747
|
return {
|
|
@@ -15670,7 +15758,7 @@ function getSelectableOptionClassName(selected, className) {
|
|
|
15670
15758
|
}
|
|
15671
15759
|
/** Shared look of every filter-row control (trigger buttons and inline inputs). */
|
|
15672
15760
|
function getFilterFieldClassName(state, className) {
|
|
15673
|
-
return cn('flex h-7 w-full min-w-0 items-center gap-1 rounded-
|
|
15761
|
+
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' &&
|
|
15674
15762
|
'border-input bg-card text-foreground placeholder:text-placeholder', state === 'applied' &&
|
|
15675
15763
|
'border-primary bg-primary/5 font-medium text-primary', state === 'invalid' && 'border-destructive bg-card text-destructive', state === 'disabled' &&
|
|
15676
15764
|
'pointer-events-none border-dashed border-border bg-transparent', className);
|
|
@@ -15688,7 +15776,7 @@ function getTitleClassName(variant) {
|
|
|
15688
15776
|
/** Shell for one filter: title, selected badge, applied summary, Clear and a hint. Same content in popovers and on full-page surfaces. */
|
|
15689
15777
|
function FilterPanel({ title, status, selectedCount, summary, action, onClear, hint, active = false, variant = 'card', className, children, }) {
|
|
15690
15778
|
const hasHeader = Boolean(title || status || summary || action || onClear);
|
|
15691
|
-
return (jsxRuntime.jsxs("section", { className: getPanelClassName(variant, active, className), children: [hasHeader && (jsxRuntime.jsxs("header", { className: "flex min-h-5 items-center justify-between gap-3", children: [title ? (jsxRuntime.jsxs("h3", { className: getTitleClassName(variant), children: [title, selectedCount ? (jsxRuntime.jsx("span", { className:
|
|
15779
|
+
return (jsxRuntime.jsxs("section", { className: getPanelClassName(variant, active, className), children: [hasHeader && (jsxRuntime.jsxs("header", { className: "flex min-h-5 items-center justify-between gap-3", children: [title ? (jsxRuntime.jsxs("h3", { className: getTitleClassName(variant), children: [title, selectedCount ? (jsxRuntime.jsx("span", { className: FILTER_COUNT_BADGE_CLASS_NAME, children: selectedCount })) : null] })) : (jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: status })), jsxRuntime.jsxs("div", { className: "flex items-center gap-3 text-xs", children: [summary && (jsxRuntime.jsx("span", { className: "font-medium text-primary", children: summary })), action, onClear && (jsxRuntime.jsx("button", { type: "button", onClick: onClear, className: FILTER_LINK_CLASS_NAME, children: "Clear" }))] })] })), children, hint && jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: hint })] }));
|
|
15692
15780
|
}
|
|
15693
15781
|
|
|
15694
15782
|
function Checkbox({ className, ...props }) {
|
|
@@ -15750,7 +15838,9 @@ const OVERFLOW_TOLERANCE_PX = 1;
|
|
|
15750
15838
|
function findClippedLabel(root) {
|
|
15751
15839
|
const spans = root.querySelectorAll(':scope > span');
|
|
15752
15840
|
for (const span of Array.from(spans)) {
|
|
15753
|
-
|
|
15841
|
+
// Width for a single-line ellipsis; height for a multi-line clamp.
|
|
15842
|
+
if (span.scrollWidth > span.clientWidth + OVERFLOW_TOLERANCE_PX ||
|
|
15843
|
+
span.scrollHeight > span.clientHeight + OVERFLOW_TOLERANCE_PX) {
|
|
15754
15844
|
return span;
|
|
15755
15845
|
}
|
|
15756
15846
|
}
|
|
@@ -15810,11 +15900,9 @@ function filterOptionsByQuery(options, query) {
|
|
|
15810
15900
|
return [...options];
|
|
15811
15901
|
return options.filter((option) => option.label.toLowerCase().includes(needle));
|
|
15812
15902
|
}
|
|
15813
|
-
|
|
15814
|
-
return getSelectableOptionClassName(selected, 'inline-flex h-8 items-center gap-1.5 rounded-full px-3');
|
|
15815
|
-
}
|
|
15903
|
+
const getChipClassName = getPillClassName;
|
|
15816
15904
|
function getTileClassName(selected) {
|
|
15817
|
-
return getSelectableOptionClassName(selected, 'flex min-h-
|
|
15905
|
+
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');
|
|
15818
15906
|
}
|
|
15819
15907
|
/** The list's search box only appears once there are enough options to need it. */
|
|
15820
15908
|
const SEARCH_MIN_OPTIONS = 9;
|
|
@@ -15826,10 +15914,18 @@ const FILL_WRAPPER_CLASS_NAME = 'flex min-h-0 flex-1 flex-col';
|
|
|
15826
15914
|
/** Card lists flow into as many columns as fit; popover lists stay one column. */
|
|
15827
15915
|
const LIST_COLUMN_MIN_WIDTH = '10rem';
|
|
15828
15916
|
const getOptionsScrollClassName = (fill) => fill ? OPTIONS_FILL_CLASS_NAME : OPTIONS_SCROLL_CLASS_NAME;
|
|
15829
|
-
const LIST_ROW_CLASS_NAME =
|
|
15917
|
+
const LIST_ROW_CLASS_NAME = getOptionRowClassName();
|
|
15918
|
+
/** Picking a value: a single-choice list replaces (or clears) it, a multi-choice list toggles it. */
|
|
15919
|
+
const pickValue = (values, value, single) => {
|
|
15920
|
+
if (!single)
|
|
15921
|
+
return toggleValue(values, value);
|
|
15922
|
+
return values.includes(value) ? [] : [value];
|
|
15923
|
+
};
|
|
15924
|
+
/** The single-choice counterpart of the checkbox: same size, primary dot when picked. */
|
|
15925
|
+
const LIST_RADIO_CLASS_NAME = 'size-4.5 shrink-0 cursor-pointer accent-primary';
|
|
15830
15926
|
/** Outlined (not filled) box until checked; the border is dark enough to read on white. */
|
|
15831
15927
|
const LIST_CHECKBOX_CLASS_NAME = 'size-4.5 border-muted-foreground/50 bg-card dark:border-muted-foreground/60 dark:bg-transparent';
|
|
15832
|
-
const SEARCH_BOX_CLASS_NAME =
|
|
15928
|
+
const SEARCH_BOX_CLASS_NAME = FILTER_SEARCH_BOX_CLASS_NAME;
|
|
15833
15929
|
|
|
15834
15930
|
function usePickListFilter({ options, value, layout, }) {
|
|
15835
15931
|
const [query, setQuery] = React.useState('');
|
|
@@ -15846,17 +15942,18 @@ function OptionSwatch({ color, round, }) {
|
|
|
15846
15942
|
return (jsxRuntime.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 } }));
|
|
15847
15943
|
}
|
|
15848
15944
|
/** Multi-select filter: a searchable checkbox list, or pill / tile toggles. Long sets scroll within a max height. */
|
|
15849
|
-
function PickListFilter({ options, value, onChange, ariaLabel, layout = 'list', searchPlaceholder, alwaysSearchable = false, columns = 5, fill = false, listClassName, }) {
|
|
15945
|
+
function PickListFilter({ options, value, onChange, ariaLabel, layout = 'list', searchPlaceholder, alwaysSearchable = false, columns = 5, fill = false, listClassName, single = false, }) {
|
|
15850
15946
|
const { query, setQuery, visibleOptions, selectedCount } = usePickListFilter({
|
|
15851
15947
|
options,
|
|
15852
15948
|
value,
|
|
15853
15949
|
layout,
|
|
15854
15950
|
});
|
|
15951
|
+
const radioName = React.useId();
|
|
15855
15952
|
const scrollClassName = getOptionsScrollClassName(fill);
|
|
15856
15953
|
// Rows with a right-hand hint read best in one column.
|
|
15857
15954
|
const multiColumn = fill && !options.some((option) => option.hint);
|
|
15858
15955
|
const wrapperClassName = fill ? FILL_WRAPPER_CLASS_NAME : undefined;
|
|
15859
|
-
const toggle = (option) => onChange(
|
|
15956
|
+
const toggle = (option) => onChange(pickValue(value, option.value, single));
|
|
15860
15957
|
if (options.length === 0) {
|
|
15861
15958
|
return (jsxRuntime.jsx("p", { className: "px-1 py-2 text-xs text-muted-foreground", children: "No options available" }));
|
|
15862
15959
|
}
|
|
@@ -15864,7 +15961,9 @@ function PickListFilter({ options, value, onChange, ariaLabel, layout = 'list',
|
|
|
15864
15961
|
return (jsxRuntime.jsxs("div", { className: cn('flex flex-col gap-2', fill && FILL_WRAPPER_CLASS_NAME), "aria-label": ariaLabel, role: "group", children: [searchPlaceholder !== undefined &&
|
|
15865
15962
|
(alwaysSearchable || options.length >= SEARCH_MIN_OPTIONS) && (jsxRuntime.jsxs("label", { className: SEARCH_BOX_CLASS_NAME, children: [jsxRuntime.jsx(Search, { "aria-hidden": "true", className: "size-4 shrink-0 text-muted-foreground" }), jsxRuntime.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" })] })), jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-1 text-xs text-muted-foreground", children: [jsxRuntime.jsx("span", { children: formatSelectedCount(selectedCount, options.length) }), selectedCount > 0 && (jsxRuntime.jsx("button", { type: "button", onClick: () => onChange([]), className: FILTER_LINK_CLASS_NAME, children: "Clear" }))] }), jsxRuntime.jsx(ScrollFade, { className: cn(multiColumn && 'grid content-start gap-x-3', scrollClassName, listClassName), style: multiColumn
|
|
15866
15963
|
? getGridColumnsStyle(undefined, LIST_COLUMN_MIN_WIDTH)
|
|
15867
|
-
: undefined, wrapperClassName: wrapperClassName, children: visibleOptions.map((option) => (jsxRuntime.jsxs("label", { className: LIST_ROW_CLASS_NAME, children: [
|
|
15964
|
+
: undefined, wrapperClassName: wrapperClassName, children: visibleOptions.map((option) => (jsxRuntime.jsxs("label", { className: LIST_ROW_CLASS_NAME, children: [single ? (jsxRuntime.jsx("input", { type: "radio", name: radioName, checked: value.includes(option.value),
|
|
15965
|
+
// A click on the picked row clears it (radios can't be unticked natively).
|
|
15966
|
+
onClick: () => toggle(option), onChange: () => undefined, className: LIST_RADIO_CLASS_NAME })) : (jsxRuntime.jsx(Checkbox, { className: LIST_CHECKBOX_CLASS_NAME, checked: value.includes(option.value), onCheckedChange: () => toggle(option) })), option.content ? (jsxRuntime.jsx("span", { className: "min-w-0 flex-1", children: option.content })) : (jsxRuntime.jsx(TruncatedLabel, { text: option.label, className: "flex-1" })), (option.count ?? option.hint) !== undefined && (jsxRuntime.jsx("span", { className: "shrink-0 text-muted-foreground tabular-nums", children: option.count ?? option.hint })), jsxRuntime.jsx(OptionSwatch, { color: option.swatch })] }, option.value))) })] }));
|
|
15868
15967
|
}
|
|
15869
15968
|
if (layout === 'tiles') {
|
|
15870
15969
|
return (jsxRuntime.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) => (jsxRuntime.jsxs("button", { type: "button", "aria-pressed": value.includes(option.value), onClick: () => toggle(option), className: getTileClassName(value.includes(option.value)), children: [jsxRuntime.jsx(TruncatedLabel, { text: option.label }), option.count !== undefined && (jsxRuntime.jsx("span", { className: "text-xs font-normal text-muted-foreground", children: option.count }))] }, option.value))) }));
|
|
@@ -15873,7 +15972,7 @@ function PickListFilter({ options, value, onChange, ariaLabel, layout = 'list',
|
|
|
15873
15972
|
}
|
|
15874
15973
|
|
|
15875
15974
|
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';
|
|
15876
|
-
const TRIGGER_ACTIVE = '!border-primary
|
|
15975
|
+
const TRIGGER_ACTIVE = '!border-primary bg-primary/5 text-primary';
|
|
15877
15976
|
const CONTENT_BASE = 'min-w-[8rem]';
|
|
15878
15977
|
const isFilterActive = (value, resetValue) => !!value && value !== resetValue;
|
|
15879
15978
|
function collectText(node) {
|
|
@@ -15904,7 +16003,7 @@ const toPickListOptions = (options) => options.map((option) => typeof option.lab
|
|
|
15904
16003
|
const FilterMultiSelect = ({ label, value, onChange, options, triggerClassName, contentClassName, listClassName, modal = false, pickListLayout = 'list', searchPlaceholder, }) => {
|
|
15905
16004
|
const active = value.length > 0;
|
|
15906
16005
|
const isList = pickListLayout === 'list';
|
|
15907
|
-
return (jsxRuntime.jsxs(Popover, { modal: modal, children: [jsxRuntime.jsx(PopoverTrigger, { className: cn(TRIGGER_BASE, 'inline-flex items-center justify-between', active && TRIGGER_ACTIVE, triggerClassName), children: jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [jsxRuntime.jsx(Funnel, { className: cn('h-4 w-4 shrink-0', active ? 'text-primary' : 'text-muted-foreground'), "aria-hidden": "true" }), label, active && (jsxRuntime.jsx("span", { className:
|
|
16006
|
+
return (jsxRuntime.jsxs(Popover, { modal: modal, children: [jsxRuntime.jsx(PopoverTrigger, { className: cn(TRIGGER_BASE, 'inline-flex items-center justify-between', active && TRIGGER_ACTIVE, triggerClassName), children: jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [jsxRuntime.jsx(Funnel, { className: cn('h-4 w-4 shrink-0', active ? 'text-primary' : 'text-muted-foreground'), "aria-hidden": "true" }), label, active && (jsxRuntime.jsx("span", { className: cn('ml-1', FILTER_COUNT_BADGE_CLASS_NAME), children: value.length }))] }) }), jsxRuntime.jsx(PopoverContent, { align: "start", sideOffset: 4, className: cn('w-64 p-0', contentClassName), children: jsxRuntime.jsx(FilterPanel, { variant: "popover",
|
|
15908
16007
|
// A searchable list has its own "x of y selected · Clear" row.
|
|
15909
16008
|
title: isList ? undefined : label, selectedCount: isList ? undefined : value.length, onClear: !isList && active ? () => onChange([]) : undefined, children: jsxRuntime.jsx(PickListFilter, { ariaLabel: label, layout: pickListLayout, options: toPickListOptions(options), value: value, onChange: onChange, searchPlaceholder: isList ? (searchPlaceholder ?? 'Search') : undefined, alwaysSearchable: true, listClassName: listClassName }) }) })] }));
|
|
15910
16009
|
};
|
|
@@ -38139,7 +38238,7 @@ function SelectScrollDownButton({ className, ...props }) {
|
|
|
38139
38238
|
|
|
38140
38239
|
const FilterSelect = ({ label, value, onValueChange, options, resetValue = 'all', activeCount = 1, searchable, triggerClassName, contentClassName, }) => {
|
|
38141
38240
|
const active = isFilterActive(value, resetValue);
|
|
38142
|
-
return (jsxRuntime.jsxs(Select, { value: value, onValueChange: onValueChange, keepOpenOnSelect: true, children: [jsxRuntime.jsxs(SelectTrigger, { className: cn(TRIGGER_BASE, active && TRIGGER_ACTIVE, triggerClassName), children: [jsxRuntime.jsx(Funnel, { className: cn('h-4 w-4 shrink-0', active ? 'text-primary' : 'text-muted-foreground'), "aria-hidden": "true" }), jsxRuntime.jsxs("span", { className: "flex items-center gap-1", children: [jsxRuntime.jsx(SelectValue, { placeholder: label }), active && (jsxRuntime.jsx("span", { className:
|
|
38241
|
+
return (jsxRuntime.jsxs(Select, { value: value, onValueChange: onValueChange, keepOpenOnSelect: true, children: [jsxRuntime.jsxs(SelectTrigger, { className: cn(TRIGGER_BASE, active && TRIGGER_ACTIVE, triggerClassName), children: [jsxRuntime.jsx(Funnel, { className: cn('h-4 w-4 shrink-0', active ? 'text-primary' : 'text-muted-foreground'), "aria-hidden": "true" }), jsxRuntime.jsxs("span", { className: "flex items-center gap-1", children: [jsxRuntime.jsx(SelectValue, { placeholder: label }), active && (jsxRuntime.jsx("span", { className: cn('ml-1', FILTER_COUNT_BADGE_CLASS_NAME), children: activeCount }))] })] }), jsxRuntime.jsxs(SelectContent, { className: cn(CONTENT_BASE, contentClassName), searchable: searchable, children: [jsxRuntime.jsx(SelectItem, { value: resetValue, withCheckbox: true, children: label }), options.map((opt) => (jsxRuntime.jsx(SelectItem, { value: opt.value, searchValue: opt.searchValue, withCheckbox: true, children: opt.label }, opt.value)))] })] }));
|
|
38143
38242
|
};
|
|
38144
38243
|
|
|
38145
38244
|
/**
|
|
@@ -38488,7 +38587,7 @@ const getRemoveChipLabel = (label) => `Remove ${label} filter`;
|
|
|
38488
38587
|
const FILTERED_BY_LABEL = 'Filtered by';
|
|
38489
38588
|
|
|
38490
38589
|
/** Compact badge shape with the filter chip colours. */
|
|
38491
|
-
const CHIP_CLASS = 'inline-flex h-
|
|
38590
|
+
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';
|
|
38492
38591
|
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';
|
|
38493
38592
|
const CLEAR_ALL_CLASS = cn(FILTER_LINK_CLASS_NAME, 'underline');
|
|
38494
38593
|
function getChipLabelText(label, variant) {
|
|
@@ -38496,10 +38595,13 @@ function getChipLabelText(label, variant) {
|
|
|
38496
38595
|
}
|
|
38497
38596
|
|
|
38498
38597
|
/** Applied filters as removable chips, with an optional Clear all. */
|
|
38499
|
-
function ActiveFilterChips({ chips, onRemove, onClearAll, variant = 'inline', className, }) {
|
|
38598
|
+
function ActiveFilterChips({ chips, onRemove, onClearAll, variant = 'inline', actions, className, }) {
|
|
38500
38599
|
if (chips.length === 0)
|
|
38501
38600
|
return null;
|
|
38502
|
-
|
|
38601
|
+
const clearAll = onClearAll && (jsxRuntime.jsx("button", { type: "button", onClick: onClearAll, className: CLEAR_ALL_CLASS, children: "Clear all" }));
|
|
38602
|
+
return (jsxRuntime.jsxs("div", { className: cn('flex flex-wrap items-center gap-1.5', className), children: [variant === 'inline' && (jsxRuntime.jsx("span", { className: "mr-0.5 text-xs text-muted-foreground", children: FILTERED_BY_LABEL })), chips.map((chip) => (jsxRuntime.jsxs("span", { className: CHIP_CLASS, children: [jsxRuntime.jsx("span", { className: "shrink-0 font-semibold", children: getChipLabelText(chip.label, variant) }), jsxRuntime.jsx(TruncatedLabel, { text: chip.value }), onRemove && (jsxRuntime.jsx("button", { type: "button", "aria-label": getRemoveChipLabel(chip.label), onClick: () => onRemove(chip.id), className: REMOVE_BUTTON_CLASS, children: jsxRuntime.jsx(X$2, { "aria-hidden": "true", className: "size-3" }) }))] }, chip.id))), actions ? (
|
|
38603
|
+
// With actions, Clear all joins them at the row's right end.
|
|
38604
|
+
jsxRuntime.jsxs("div", { className: "ml-auto flex items-center gap-3 pl-3", children: [clearAll, actions] })) : (clearAll)] }));
|
|
38503
38605
|
}
|
|
38504
38606
|
|
|
38505
38607
|
const DEFAULT_CONTAINS_PLACEHOLDER = 'Contains…';
|
|
@@ -38615,9 +38717,7 @@ function togglePreset(value, preset) {
|
|
|
38615
38717
|
return value?.preset === preset ? undefined : { preset };
|
|
38616
38718
|
}
|
|
38617
38719
|
/** Preset row; the picked one gets the primary tint, as in the design. */
|
|
38618
|
-
|
|
38619
|
-
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');
|
|
38620
|
-
}
|
|
38720
|
+
const getPresetClassName$1 = (selected) => getOptionRowClassName(selected, 'whitespace-nowrap');
|
|
38621
38721
|
|
|
38622
38722
|
const toIsoOrEmpty = (date) => date ? toIsoDate(date) : '';
|
|
38623
38723
|
function useDateRangeFilter(value, onChange, today, fiscalYearStartMonth) {
|
|
@@ -38635,7 +38735,11 @@ function useDateRangeFilter(value, onChange, today, fiscalYearStartMonth) {
|
|
|
38635
38735
|
/** Date filter body: presets on the left, a From / To range on the right. */
|
|
38636
38736
|
function DateRangeFilter({ value, onChange, ariaLabel, fiscalYearStartMonth = 1, today = new Date(), }) {
|
|
38637
38737
|
const { from, to, selectPreset, handleFromChange, handleToChange, clear } = useDateRangeFilter(value, onChange, today, fiscalYearStartMonth);
|
|
38638
|
-
return (jsxRuntime.jsxs("div", { className: "grid grid-cols-[auto_minmax(0,1fr)] divide-x divide-border text-xs", children: [jsxRuntime.jsx("div", { role: "group", "aria-label": getPresetGroupLabel(ariaLabel), className: "flex flex-col gap-1 pr-3", children: DATE_PRESET_OPTIONS.map((preset) => (jsxRuntime.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))) }), jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col gap-3 pl-3", children: [jsxRuntime.jsxs("label", { className: "flex min-w-0 flex-col gap-1 text-muted-foreground", children: ["From", jsxRuntime.jsx(DateInput
|
|
38738
|
+
return (jsxRuntime.jsxs("div", { className: "grid grid-cols-[auto_minmax(0,1fr)] divide-x divide-border text-xs", children: [jsxRuntime.jsx("div", { role: "group", "aria-label": getPresetGroupLabel(ariaLabel), className: "flex flex-col gap-1 pr-3", children: DATE_PRESET_OPTIONS.map((preset) => (jsxRuntime.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))) }), jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col gap-3 pl-3", children: [jsxRuntime.jsxs("label", { className: "flex min-w-0 flex-col gap-1 text-muted-foreground", children: ["From", jsxRuntime.jsx(DateInput
|
|
38739
|
+
// The inputs sit on the card's right; an end-aligned calendar stays under them.
|
|
38740
|
+
, {
|
|
38741
|
+
// The inputs sit on the card's right; an end-aligned calendar stays under them.
|
|
38742
|
+
align: "end", value: fromIsoDate(from), max: to || undefined, ariaLabel: getDateInputLabel(ariaLabel, 'from'), onChange: handleFromChange })] }), jsxRuntime.jsxs("label", { className: "flex min-w-0 flex-col gap-1 text-muted-foreground", children: ["To", jsxRuntime.jsx(DateInput, { value: fromIsoDate(to), min: from || undefined, ariaLabel: getDateInputLabel(ariaLabel, 'to'), onChange: handleToChange, align: "end" })] }), value && (jsxRuntime.jsx("button", { type: "button", onClick: clear, className: cn('self-start', FILTER_LINK_CLASS_NAME), children: "Clear" }))] })] }));
|
|
38639
38743
|
}
|
|
38640
38744
|
|
|
38641
38745
|
const getClearButtonLabel = (ariaLabel) => `Clear ${ariaLabel}`;
|
|
@@ -38646,7 +38750,7 @@ function FilterCellPopover({ label, placeholder, ariaLabel, state, disabledLabel
|
|
|
38646
38750
|
if (state === 'disabled') {
|
|
38647
38751
|
return (jsxRuntime.jsx(TooltipProvider, { delayDuration: 200, children: jsxRuntime.jsxs(Tooltip, { children: [jsxRuntime.jsx(TooltipTrigger, { asChild: true, children: jsxRuntime.jsx("span", { tabIndex: 0, "aria-label": disabledLabel, className: "block outline-none", children: jsxRuntime.jsx("div", { role: "presentation", className: getFilterFieldClassName('disabled', className) }) }) }), jsxRuntime.jsx(TooltipContent, { side: "top", children: disabledLabel })] }) }));
|
|
38648
38752
|
}
|
|
38649
|
-
return (jsxRuntime.jsxs(Popover, { open: open, onOpenChange: onOpenChange, children: [jsxRuntime.jsx(PopoverAnchor, { asChild: true, children: jsxRuntime.jsxs("div", { className: getFilterFieldClassName(state, cn('pr-1 focus-within:ring-2 focus-within:ring-primary/30', className)), children: [jsxRuntime.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 && jsxRuntime.jsx("span", { className: "shrink-0 [&_svg]:size-3.5", children: icon }), jsxRuntime.jsx(TruncatedLabel, { text: label || placeholder, className: cn('min-w-0 flex-1', !label && 'font-normal text-placeholder') }), showChevron && (jsxRuntime.jsx(ChevronDown, { "aria-hidden": "true", className: "size-3.5 shrink-0 text-muted-foreground" }))] }), onClear && label && (jsxRuntime.jsx("button", { type: "button", "aria-label": getClearButtonLabel(ariaLabel), onClick: onClear, className: "inline-flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-
|
|
38753
|
+
return (jsxRuntime.jsxs(Popover, { open: open, onOpenChange: onOpenChange, children: [jsxRuntime.jsx(PopoverAnchor, { asChild: true, children: jsxRuntime.jsxs("div", { className: getFilterFieldClassName(state, cn('pr-1 focus-within:ring-2 focus-within:ring-primary/30', className)), children: [jsxRuntime.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 && jsxRuntime.jsx("span", { className: "shrink-0 [&_svg]:size-3.5", children: icon }), jsxRuntime.jsx(TruncatedLabel, { text: label || placeholder, className: cn('min-w-0 flex-1', !label && 'font-normal text-placeholder') }), showChevron && (jsxRuntime.jsx(ChevronDown, { "aria-hidden": "true", className: "size-3.5 shrink-0 text-muted-foreground" }))] }), onClear && label && (jsxRuntime.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: jsxRuntime.jsx(X$2, { "aria-hidden": "true", className: "size-3" }) }))] }) }), jsxRuntime.jsx(PopoverContent, { align: "start",
|
|
38650
38754
|
// The filter row moves when the "Filtered by" row appears; track it every frame so the popover never lags behind.
|
|
38651
38755
|
updatePositionStrategy: "always", sideOffset: 4, className: cn('w-72 p-0', contentClassName), children: children })] }));
|
|
38652
38756
|
}
|
|
@@ -38722,10 +38826,40 @@ function ScaleRangeFilter({ options, value, onChange, ariaLabel, columns, fill =
|
|
|
38722
38826
|
const { selectOption } = useScaleRangeFilter({ value, onChange });
|
|
38723
38827
|
return (jsxRuntime.jsx("div", { role: "group", "aria-label": ariaLabel, className: fill ? 'grid gap-2' : 'grid gap-1.5', style: getGridColumnsStyle(columns), children: options.map((option) => {
|
|
38724
38828
|
const position = getScalePosition(options, value, option.value);
|
|
38725
|
-
return (jsxRuntime.jsx("button", { type: "button", "aria-pressed": position !== 'outside', "aria-label": option.label, onClick: () => selectOption(option.value), className: getScaleButtonClassName(position, fill), children: jsxRuntime.jsx(
|
|
38829
|
+
return (jsxRuntime.jsx("button", { type: "button", "aria-pressed": position !== 'outside', "aria-label": option.label, onClick: () => selectOption(option.value), className: getScaleButtonClassName(position, fill), children: jsxRuntime.jsx(TruncatedLabel, { text: option.label }) }, option.value));
|
|
38726
38830
|
}) }));
|
|
38727
38831
|
}
|
|
38728
38832
|
|
|
38833
|
+
/** Varied widths so placeholder rows and pills read as text, not a block. */
|
|
38834
|
+
const LIST_ROW_WIDTHS = ['55%', '40%', '62%', '48%', '35%'];
|
|
38835
|
+
const PILL_WIDTHS = [72, 88, 64, 96, 76, 84];
|
|
38836
|
+
const TILE_KEYS = ['a', 'b', 'c', 'd'];
|
|
38837
|
+
const CARD_CLASS_NAME = 'flex h-full min-w-0 flex-col gap-3 rounded-xl border border-border bg-card p-4';
|
|
38838
|
+
|
|
38839
|
+
function Pills({ count }) {
|
|
38840
|
+
return (jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5", children: PILL_WIDTHS.slice(0, count).map((width) => (jsxRuntime.jsx(SquareSkeleton, { height: 32, width: width, rounded: "full" }, width))) }));
|
|
38841
|
+
}
|
|
38842
|
+
function Body({ variant, }) {
|
|
38843
|
+
switch (variant) {
|
|
38844
|
+
case 'list':
|
|
38845
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(SquareSkeleton, { height: 36, rounded: "md" }), jsxRuntime.jsx(SquareSkeleton, { height: 12, width: 96, rounded: "sm" }), jsxRuntime.jsx("div", { className: "flex flex-col gap-3 px-2 pt-1", children: LIST_ROW_WIDTHS.map((width) => (jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [jsxRuntime.jsx(SquareSkeleton, { height: 18, width: 18, rounded: "sm" }), jsxRuntime.jsx(SquareSkeleton, { height: 14, width: width, rounded: "sm" })] }, width))) })] }));
|
|
38846
|
+
case 'chips':
|
|
38847
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(SquareSkeleton, { height: 12, width: 64, rounded: "sm" }), jsxRuntime.jsx(Pills, { count: 3 }), jsxRuntime.jsx(SquareSkeleton, { height: 12, width: 80, rounded: "sm" }), jsxRuntime.jsx(Pills, { count: 4 })] }));
|
|
38848
|
+
case 'tiles':
|
|
38849
|
+
return (jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-2", children: TILE_KEYS.map((key) => (jsxRuntime.jsx(SquareSkeleton, { height: 48, rounded: "md" }, key))) }));
|
|
38850
|
+
case 'range':
|
|
38851
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntime.jsx(SquareSkeleton, { height: 36, rounded: "md" }), jsxRuntime.jsx(SquareSkeleton, { height: 2, width: 8, rounded: "full" }), jsxRuntime.jsx(SquareSkeleton, { height: 36, rounded: "md" })] }), jsxRuntime.jsx(SquareSkeleton, { height: 12, width: 88, rounded: "sm" }), jsxRuntime.jsx(Pills, { count: 6 })] }));
|
|
38852
|
+
case 'ids':
|
|
38853
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(SquareSkeleton, { height: 12, width: 64, rounded: "sm" }), jsxRuntime.jsx(SquareSkeleton, { height: 80, rounded: "md" }), jsxRuntime.jsx(SquareSkeleton, { height: 12, width: "75%", rounded: "sm" }), jsxRuntime.jsx(SquareSkeleton, { height: 12, width: 56, rounded: "sm" }), jsxRuntime.jsx(SquareSkeleton, { height: 36, rounded: "md" })] }));
|
|
38854
|
+
case 'select':
|
|
38855
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(SquareSkeleton, { height: 12, width: 64, rounded: "sm" }), jsxRuntime.jsx(SquareSkeleton, { height: 36, rounded: "md" })] }));
|
|
38856
|
+
}
|
|
38857
|
+
}
|
|
38858
|
+
/** Placeholder for one filter card while the filters load, shaped like the control it will hold. */
|
|
38859
|
+
function FilterCardSkeleton({ variant = 'list', className, }) {
|
|
38860
|
+
return (jsxRuntime.jsxs("div", { "aria-hidden": "true", className: cn(CARD_CLASS_NAME, className), children: [jsxRuntime.jsx(SquareSkeleton, { height: 16, width: 96, rounded: "sm" }), jsxRuntime.jsx(Body, { variant: variant })] }));
|
|
38861
|
+
}
|
|
38862
|
+
|
|
38729
38863
|
const getClearIdsLabel = (ariaLabel) => `Clear ${ariaLabel}`;
|
|
38730
38864
|
|
|
38731
38865
|
const DEFAULT_ID_HELPER_TEXT = 'Paste from Excel or an email. Commas, spaces and new lines all split IDs.';
|
|
@@ -38767,7 +38901,7 @@ function useIdListInput(value, onChange) {
|
|
|
38767
38901
|
/** Paste-a-list body: a textarea split into IDs on commas, spaces and new lines, with the parsed IDs as chips. */
|
|
38768
38902
|
function IdListInput({ value, onChange, ariaLabel, placeholder, helperText = DEFAULT_ID_HELPER_TEXT, showSummary = true, }) {
|
|
38769
38903
|
const { draft, parsedIds, handleChange, handleBlur, clear } = useIdListInput(value, onChange);
|
|
38770
|
-
return (jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [jsxRuntime.jsx(Textarea, { value: draft, placeholder: placeholder, "aria-label": ariaLabel, onChange: handleChange, onBlur: handleBlur, className: "min-h-20 bg-card" }), helperText && (jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: helperText })), showSummary && parsedIds.length > 0 && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("ul", { className: "flex flex-wrap gap-1.5", children: parsedIds.map((id) => (jsxRuntime.jsx("li", { className: "inline-flex h-6 items-center rounded-full border border-primary/
|
|
38904
|
+
return (jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [jsxRuntime.jsx(Textarea, { value: draft, placeholder: placeholder, "aria-label": ariaLabel, onChange: handleChange, onBlur: handleBlur, className: "min-h-20 bg-card" }), helperText && (jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: helperText })), showSummary && parsedIds.length > 0 && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("ul", { className: "flex flex-wrap gap-1.5", children: parsedIds.map((id) => (jsxRuntime.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))) }), jsxRuntime.jsxs("div", { className: "flex items-center justify-between text-xs", children: [jsxRuntime.jsx("span", { className: "text-muted-foreground", children: formatIdCount(parsedIds.length) }), jsxRuntime.jsx("button", { type: "button", "aria-label": getClearIdsLabel(ariaLabel), onClick: clear, className: FILTER_LINK_CLASS_NAME, children: "Clear" })] })] }))] }));
|
|
38771
38905
|
}
|
|
38772
38906
|
|
|
38773
38907
|
const NUMBER_HELP_HEADING = 'Type a value or a rule';
|
|
@@ -38784,9 +38918,19 @@ function getNumberInputClassName(state, className) {
|
|
|
38784
38918
|
return getFilterFieldClassName(state, cn('text-right tabular-nums', className));
|
|
38785
38919
|
}
|
|
38786
38920
|
/** Cheat-sheet row: the whole row is the click target, highlighted on hover. */
|
|
38787
|
-
const RULE_BUTTON_CLASS_NAME =
|
|
38921
|
+
const RULE_BUTTON_CLASS_NAME = getOptionRowClassName(false, 'py-1.5');
|
|
38788
38922
|
/** Key-cap chip for the rule, fixed width so every meaning lines up. */
|
|
38789
|
-
|
|
38923
|
+
// Every chip is as wide as the longest rule, so the meanings start at the same x.
|
|
38924
|
+
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';
|
|
38925
|
+
/** Note / error box in the help popover; text on a fixed 16px line. */
|
|
38926
|
+
const MESSAGE_CLASS_NAME = 'flex gap-2 rounded-md p-2 leading-4';
|
|
38927
|
+
/** One text line tall, so the icon centres on the first line however the text wraps. */
|
|
38928
|
+
const MESSAGE_ICON_SLOT_CLASS_NAME = 'flex h-4 shrink-0 items-center';
|
|
38929
|
+
/** Sets `--rule-width` to the longest rule, which sizes every chip in the list. */
|
|
38930
|
+
function getRuleListStyle(rules) {
|
|
38931
|
+
const longest = Math.max(...rules.map(({ rule }) => rule.length));
|
|
38932
|
+
return { '--rule-width': `${longest}ch` };
|
|
38933
|
+
}
|
|
38790
38934
|
|
|
38791
38935
|
const COMMIT_DELAY_MS = 400;
|
|
38792
38936
|
function useNumberExpressionFilter(value, onChange) {
|
|
@@ -38833,20 +38977,22 @@ function useNumberExpressionFilter(value, onChange) {
|
|
|
38833
38977
|
handleChange,
|
|
38834
38978
|
handleKeyDown,
|
|
38835
38979
|
handleFocus: () => setHelpOpen(true),
|
|
38980
|
+
handleClick: () => setHelpOpen(true),
|
|
38836
38981
|
handleBlur,
|
|
38837
38982
|
applyRule,
|
|
38838
38983
|
};
|
|
38839
38984
|
}
|
|
38840
38985
|
|
|
38841
38986
|
/** Filter-row number cell: type a value or a rule (`>1`, `1–3`, `1.52`). Invalid text never reaches the table. */
|
|
38842
|
-
function NumberExpressionFilter({ value, onChange, ariaLabel, placeholder, note, className, }) {
|
|
38843
|
-
const { draft, state, helpOpen, errorId, handleChange, handleKeyDown, handleFocus, handleBlur, applyRule, } = useNumberExpressionFilter(value, onChange);
|
|
38987
|
+
function NumberExpressionFilter({ value, onChange, ariaLabel, placeholder, note, ruleExamples, className, }) {
|
|
38988
|
+
const { draft, state, helpOpen, errorId, handleChange, handleKeyDown, handleFocus, handleClick, handleBlur, applyRule, } = useNumberExpressionFilter(value, onChange);
|
|
38844
38989
|
const invalid = state === 'invalid';
|
|
38845
|
-
|
|
38990
|
+
const rules = buildNumberRuleHelp(ruleExamples);
|
|
38991
|
+
return (jsxRuntime.jsxs(Popover, { open: helpOpen, children: [jsxRuntime.jsx(PopoverAnchor, { asChild: true, children: jsxRuntime.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) }) }), jsxRuntime.jsxs(PopoverContent, { align: "start",
|
|
38846
38992
|
// The filter row moves when the "Filtered by" row appears; track it every frame so the popover never lags behind.
|
|
38847
|
-
updatePositionStrategy: "always", onOpenAutoFocus: (event) => event.preventDefault(), className: "flex w-72 flex-col gap-2 p-2 text-xs", children: [jsxRuntime.jsxs("div", { className: "px-2 pt-1", children: [jsxRuntime.jsx("p", { className: "font-medium text-foreground", children: NUMBER_HELP_HEADING }), jsxRuntime.jsx("p", { className: "text-muted-foreground", children: NUMBER_HELP_SUBTITLE })] }), jsxRuntime.jsx("ul", { className: "flex flex-col", children:
|
|
38993
|
+
updatePositionStrategy: "always", onOpenAutoFocus: (event) => event.preventDefault(), className: "flex w-72 flex-col gap-2 p-2 text-xs", children: [jsxRuntime.jsxs("div", { className: "px-2 pt-1", children: [jsxRuntime.jsx("p", { className: "font-medium text-foreground", children: NUMBER_HELP_HEADING }), jsxRuntime.jsx("p", { className: "text-muted-foreground", children: NUMBER_HELP_SUBTITLE })] }), jsxRuntime.jsx("ul", { className: "flex flex-col", style: getRuleListStyle(rules), children: rules.map(({ rule, meaning }) => (jsxRuntime.jsx("li", { children: jsxRuntime.jsxs("button", { type: "button", "aria-label": getUseRuleLabel(rule, meaning),
|
|
38848
38994
|
// Keep focus in the field so it doesn't blur and close this help first.
|
|
38849
|
-
onMouseDown: (event) => event.preventDefault(), onClick: () => applyRule(rule), className: RULE_BUTTON_CLASS_NAME, children: [jsxRuntime.jsx("span", { className: RULE_CHIP_CLASS_NAME, children: rule }), jsxRuntime.jsx("span", { className: "whitespace-nowrap text-muted-foreground", children: meaning })] }) }, rule))) }), note && (jsxRuntime.jsxs("div", { className:
|
|
38995
|
+
onMouseDown: (event) => event.preventDefault(), onClick: () => applyRule(rule), className: RULE_BUTTON_CLASS_NAME, children: [jsxRuntime.jsx("span", { className: RULE_CHIP_CLASS_NAME, children: rule }), jsxRuntime.jsx("span", { className: "whitespace-nowrap text-muted-foreground", children: meaning })] }) }, rule))) }), note && (jsxRuntime.jsxs("div", { className: cn(MESSAGE_CLASS_NAME, 'bg-muted/50 text-muted-foreground'), children: [jsxRuntime.jsx("span", { className: MESSAGE_ICON_SLOT_CLASS_NAME, children: jsxRuntime.jsx(Info, { "aria-hidden": "true", className: "size-3.5" }) }), jsxRuntime.jsx("div", { children: note })] })), invalid && (jsxRuntime.jsxs("div", { id: getNumberErrorId(errorId), role: "alert", className: cn(MESSAGE_CLASS_NAME, 'bg-destructive/10 text-destructive'), children: [jsxRuntime.jsx("span", { className: MESSAGE_ICON_SLOT_CLASS_NAME, children: jsxRuntime.jsx(CircleAlert, { "aria-hidden": "true", className: "size-3.5" }) }), jsxRuntime.jsxs("p", { children: ["Can't read \u201C", draft, "\u201D. Try ", jsxRuntime.jsx("strong", { children: "1\u20133" }), ",", ' ', jsxRuntime.jsx("strong", { children: ">1" }), " or ", jsxRuntime.jsx("strong", { children: "<=3" }), "."] })] }))] })] }));
|
|
38850
38996
|
}
|
|
38851
38997
|
|
|
38852
38998
|
const REVERSED_RANGE_MESSAGE = 'From must not be more than To.';
|
|
@@ -38887,9 +39033,7 @@ function isSameRange(a, b) {
|
|
|
38887
39033
|
function getBoundInputClassName(filled) {
|
|
38888
39034
|
return cn('h-9 min-w-0 flex-1 text-sm', filled && 'border-primary bg-primary/5');
|
|
38889
39035
|
}
|
|
38890
|
-
|
|
38891
|
-
return getSelectableOptionClassName(selected, 'inline-flex h-7 items-center rounded-full px-2.5');
|
|
38892
|
-
}
|
|
39036
|
+
const getPresetClassName = getPillClassName;
|
|
38893
39037
|
|
|
38894
39038
|
function useNumberRangeInputs(value, onChange) {
|
|
38895
39039
|
const minText = toBoundText(value?.min);
|
|
@@ -38950,9 +39094,7 @@ function createRadioGroupKeyDownHandler(current, onChange) {
|
|
|
38950
39094
|
};
|
|
38951
39095
|
}
|
|
38952
39096
|
|
|
38953
|
-
|
|
38954
|
-
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');
|
|
38955
|
-
}
|
|
39097
|
+
const getRadioRowClassName = (checked) => getOptionRowClassName(checked);
|
|
38956
39098
|
function getRadioCircleClassName(checked) {
|
|
38957
39099
|
return cn('flex size-4 shrink-0 items-center justify-center rounded-full border', checked ? 'border-primary' : 'border-input-border');
|
|
38958
39100
|
}
|
|
@@ -38965,6 +39107,300 @@ function TriStateFilter({ value, onChange, ariaLabel, }) {
|
|
|
38965
39107
|
}) }));
|
|
38966
39108
|
}
|
|
38967
39109
|
|
|
39110
|
+
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';
|
|
39111
|
+
/** Children laid out below the first one's line. */
|
|
39112
|
+
function countWrapped(items) {
|
|
39113
|
+
if (items.length === 0)
|
|
39114
|
+
return 0;
|
|
39115
|
+
const firstTop = items[0].offsetTop;
|
|
39116
|
+
return items.filter((item) => item.offsetTop > firstTop).length;
|
|
39117
|
+
}
|
|
39118
|
+
const getShowMoreLabel = (hiddenCount) => `+${hiddenCount} more`;
|
|
39119
|
+
|
|
39120
|
+
/**
|
|
39121
|
+
* Fits chips on one line with the "+N more" link right after the last one. Renders every chip, counts
|
|
39122
|
+
* how many wrap, then drops chips until the link itself fits; a resize starts the measurement over.
|
|
39123
|
+
*/
|
|
39124
|
+
function useChipOverflow(chips, enabled) {
|
|
39125
|
+
const [list, setList] = React.useState(null);
|
|
39126
|
+
const [expanded, setExpanded] = React.useState(false);
|
|
39127
|
+
const [visibleCount, setVisibleCount] = React.useState(chips.length);
|
|
39128
|
+
const collapsed = enabled && !expanded;
|
|
39129
|
+
const [measuredLength, setMeasuredLength] = React.useState(chips.length);
|
|
39130
|
+
if (measuredLength !== chips.length) {
|
|
39131
|
+
setMeasuredLength(chips.length);
|
|
39132
|
+
setVisibleCount(chips.length);
|
|
39133
|
+
}
|
|
39134
|
+
React.useLayoutEffect(() => {
|
|
39135
|
+
if (!collapsed || !list)
|
|
39136
|
+
return;
|
|
39137
|
+
const items = Array.from(list.children);
|
|
39138
|
+
if (visibleCount >= chips.length) {
|
|
39139
|
+
const wrapped = countWrapped(items);
|
|
39140
|
+
if (wrapped > 0)
|
|
39141
|
+
setVisibleCount(chips.length - wrapped);
|
|
39142
|
+
return;
|
|
39143
|
+
}
|
|
39144
|
+
// The last child is the "+N more" link; if it wrapped, give it one more chip's room.
|
|
39145
|
+
if (countWrapped(items) > 0 && visibleCount > 1)
|
|
39146
|
+
setVisibleCount(visibleCount - 1);
|
|
39147
|
+
}, [collapsed, list, visibleCount, chips.length]);
|
|
39148
|
+
React.useEffect(() => {
|
|
39149
|
+
if (!collapsed || !list)
|
|
39150
|
+
return;
|
|
39151
|
+
let width = list.clientWidth;
|
|
39152
|
+
const observer = new ResizeObserver(() => {
|
|
39153
|
+
if (list.clientWidth === width)
|
|
39154
|
+
return;
|
|
39155
|
+
width = list.clientWidth;
|
|
39156
|
+
setVisibleCount(chips.length);
|
|
39157
|
+
});
|
|
39158
|
+
observer.observe(list);
|
|
39159
|
+
return () => observer.disconnect();
|
|
39160
|
+
}, [collapsed, list, chips.length]);
|
|
39161
|
+
const shown = collapsed ? Math.min(visibleCount, chips.length) : chips.length;
|
|
39162
|
+
return {
|
|
39163
|
+
listRef: React.useCallback((node) => setList(node), []),
|
|
39164
|
+
expanded,
|
|
39165
|
+
toggle: () => {
|
|
39166
|
+
setExpanded((current) => !current);
|
|
39167
|
+
setVisibleCount(chips.length);
|
|
39168
|
+
},
|
|
39169
|
+
visibleChips: chips.slice(0, shown),
|
|
39170
|
+
hiddenCount: chips.length - shown,
|
|
39171
|
+
};
|
|
39172
|
+
}
|
|
39173
|
+
|
|
39174
|
+
/** Read-only filter summaries of a saved search, as pills; optionally one line ending in "+N more". */
|
|
39175
|
+
function SavedSearchChipList({ chips, emptyText = 'No filters', collapsible = false, className, }) {
|
|
39176
|
+
const { listRef, expanded, toggle, visibleChips, hiddenCount } = useChipOverflow(chips, collapsible);
|
|
39177
|
+
if (chips.length === 0) {
|
|
39178
|
+
return (jsxRuntime.jsx("p", { className: cn('text-xs text-muted-foreground', className), children: emptyText }));
|
|
39179
|
+
}
|
|
39180
|
+
const showToggle = collapsible && (expanded || hiddenCount > 0);
|
|
39181
|
+
return (jsxRuntime.jsxs("ul", { ref: listRef, className: cn('flex min-w-0 flex-wrap items-center gap-1.5', className), children: [visibleChips.map((chip) => (jsxRuntime.jsx("li", { className: SAVED_SEARCH_CHIP_CLASS_NAME, children: jsxRuntime.jsx(TruncatedLabel, { text: chip }) }, chip))), showToggle && (jsxRuntime.jsx("li", { className: "flex h-6 shrink-0 items-center", children: jsxRuntime.jsx("button", { type: "button", "aria-expanded": expanded, onClick: toggle,
|
|
39182
|
+
// Above a parent's stretched click area (e.g. a saved-search row).
|
|
39183
|
+
className: cn(FILTER_LINK_CLASS_NAME, 'relative z-10 whitespace-nowrap px-1 underline underline-offset-2'), children: expanded ? 'Show less' : getShowMoreLabel(hiddenCount) }) }))] }));
|
|
39184
|
+
}
|
|
39185
|
+
|
|
39186
|
+
const SEARCH_INPUT_LABEL = 'Find a saved search';
|
|
39187
|
+
const getRenameLabel = (name) => `Rename ${name}`;
|
|
39188
|
+
const getDeleteLabel = (name) => `Delete ${name}`;
|
|
39189
|
+
const NO_MATCH_TITLE = 'No matches';
|
|
39190
|
+
const getNoMatchText = (query) => `No saved searches match “${query.trim()}”.`;
|
|
39191
|
+
|
|
39192
|
+
/** Matches the name or any filter summary, ignoring case. */
|
|
39193
|
+
function filterSavedSearches(items, query) {
|
|
39194
|
+
const needle = query.trim().toLowerCase();
|
|
39195
|
+
if (!needle)
|
|
39196
|
+
return [...items];
|
|
39197
|
+
return items.filter((item) => [item.name, ...item.chips].some((text) => text.toLowerCase().includes(needle)));
|
|
39198
|
+
}
|
|
39199
|
+
const ROW_CLASS_NAME = 'relative flex items-center gap-4 rounded-md px-2 py-2.5 transition-colors hover:bg-muted/60';
|
|
39200
|
+
/** The name is the row's button; its `::after` stretches over the whole row so the row is the click target. */
|
|
39201
|
+
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";
|
|
39202
|
+
/** Lifts the name above the button's stretched area so its overflow tooltip gets the hover; clicks still reach the button. */
|
|
39203
|
+
const ROW_NAME_CLASS_NAME = 'relative z-10 block min-w-0';
|
|
39204
|
+
/** Rename / Delete as one outlined, button-shaped group with a divider between them. */
|
|
39205
|
+
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';
|
|
39206
|
+
/** A cell of the actions group; Delete turns destructive on hover. */
|
|
39207
|
+
function getRowActionClassName(destructive) {
|
|
39208
|
+
return cn('size-7 rounded-none text-foreground/70 [&_svg]:size-3.5', destructive
|
|
39209
|
+
? 'hover:bg-destructive/10 hover:text-destructive'
|
|
39210
|
+
: 'hover:bg-muted hover:text-foreground');
|
|
39211
|
+
}
|
|
39212
|
+
/** Controls inside the row that sit above the stretched button. */
|
|
39213
|
+
const ROW_CONTROL_CLASS_NAME = 'relative z-10';
|
|
39214
|
+
/** About three rows (name line + one pill line each) before the list scrolls. */
|
|
39215
|
+
const LIST_SCROLL_CLASS_NAME = 'max-h-54 overflow-y-auto';
|
|
39216
|
+
|
|
39217
|
+
function useSavedSearchesMenu(items, onOpenChange) {
|
|
39218
|
+
const [open, setOpenState] = React.useState(false);
|
|
39219
|
+
const [query, setQuery] = React.useState('');
|
|
39220
|
+
const setOpen = (next) => {
|
|
39221
|
+
setOpenState(next);
|
|
39222
|
+
if (!next)
|
|
39223
|
+
setQuery('');
|
|
39224
|
+
onOpenChange?.(next);
|
|
39225
|
+
};
|
|
39226
|
+
const visibleItems = React.useMemo(() => filterSavedSearches(items, query), [items, query]);
|
|
39227
|
+
const closeThen = (action, item) => () => {
|
|
39228
|
+
setOpen(false);
|
|
39229
|
+
action(item);
|
|
39230
|
+
};
|
|
39231
|
+
return { open, setOpen, query, setQuery, visibleItems, closeThen };
|
|
39232
|
+
}
|
|
39233
|
+
|
|
39234
|
+
/** Small icon button on a row, named by its tooltip. */
|
|
39235
|
+
function RowActionButton({ label, onClick, destructive = false, children, }) {
|
|
39236
|
+
return (jsxRuntime.jsxs(Tooltip, { children: [jsxRuntime.jsx(TooltipTrigger, { asChild: true, children: jsxRuntime.jsx(IconButton, { appearance: "ghost", size: "xs", "aria-label": label, onClick: onClick, className: getRowActionClassName(destructive), children: children }) }), jsxRuntime.jsx(TooltipContent, { side: "top", children: label })] }));
|
|
39237
|
+
}
|
|
39238
|
+
/** One saved search: name, filter pills, when it was saved, and Rename / Delete buttons. */
|
|
39239
|
+
function SavedSearchRow({ item, onSelect, onRename, onDelete, }) {
|
|
39240
|
+
const hasCount = item.countLoading || item.count !== undefined;
|
|
39241
|
+
return (jsxRuntime.jsxs("li", { className: ROW_CLASS_NAME, children: [jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1.5", children: [jsxRuntime.jsxs("div", { className: "flex min-w-0 items-baseline gap-2", children: [jsxRuntime.jsx("button", { type: "button", onClick: onSelect, className: ROW_BUTTON_CLASS_NAME, children: jsxRuntime.jsx("span", { className: ROW_NAME_CLASS_NAME, children: jsxRuntime.jsx(TruncatedLabel, { text: item.name }) }) }), hasCount &&
|
|
39242
|
+
(item.countLoading ? (jsxRuntime.jsx(SquareSkeleton, { height: 12, width: 40, rounded: "sm" })) : (jsxRuntime.jsx("span", { className: "shrink-0 text-xs font-medium tabular-nums text-foreground", children: item.countLabel ?? item.count }))), item.meta && (jsxRuntime.jsx("span", { className: "shrink-0 text-xs text-muted-foreground before:mr-2 before:content-['\u00B7']", children: item.meta }))] }), jsxRuntime.jsx(SavedSearchChipList, { chips: item.chips, collapsible: true })] }), (onRename || onDelete) && (jsxRuntime.jsxs("div", { className: cn(ROW_CONTROL_CLASS_NAME, ROW_ACTIONS_CLASS_NAME), children: [onRename && (jsxRuntime.jsx(RowActionButton, { label: getRenameLabel(item.name), onClick: onRename, children: jsxRuntime.jsx(Pencil, {}) })), onDelete && (jsxRuntime.jsx(RowActionButton, { label: getDeleteLabel(item.name), onClick: onDelete, destructive: true, children: jsxRuntime.jsx(Trash2, {}) }))] }))] }));
|
|
39243
|
+
}
|
|
39244
|
+
/** Centered empty / no-match state inside the dropdown. */
|
|
39245
|
+
function SavedSearchesEmpty({ icon, title, description, }) {
|
|
39246
|
+
return (jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-1 px-4 py-6 text-center", children: [jsxRuntime.jsx("span", { className: "mb-2 flex size-10 items-center justify-center rounded-full bg-muted text-primary [&>svg]:size-5", children: icon }), jsxRuntime.jsx("p", { className: "text-sm font-semibold text-foreground", children: title }), jsxRuntime.jsx("p", { className: "max-w-xs text-xs text-muted-foreground", children: description })] }));
|
|
39247
|
+
}
|
|
39248
|
+
|
|
39249
|
+
/** "Saved searches" dropdown: find, pick, rename or delete a saved filter set. */
|
|
39250
|
+
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, }) {
|
|
39251
|
+
const { open, setOpen, query, setQuery, visibleItems, closeThen } = useSavedSearchesMenu(items, onOpenChange);
|
|
39252
|
+
const hasNone = !loading && items.length === 0;
|
|
39253
|
+
return (jsxRuntime.jsxs(Popover, { open: open, onOpenChange: setOpen, children: [jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: jsxRuntime.jsx(Button, { appearance: "outline", color: open ? 'primary' : 'secondary', size: "md", leftIcon: jsxRuntime.jsx(Bookmark, {}), rightIcon: open ? jsxRuntime.jsx(ChevronUp, {}) : jsxRuntime.jsx(ChevronDown, {}), className: triggerClassName, children: label }) }), jsxRuntime.jsxs(PopoverContent, { align: align, sideOffset: 4, className: "flex w-120 max-w-[calc(100vw-2rem)] flex-col gap-2 p-2", children: [!hasNone && (jsxRuntime.jsxs("label", { className: FILTER_SEARCH_BOX_CLASS_NAME, children: [jsxRuntime.jsx(Search, { "aria-hidden": "true", className: "size-4 shrink-0 text-muted-foreground" }), jsxRuntime.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 ? (jsxRuntime.jsxs("div", { className: "flex flex-col gap-2 p-2", "aria-busy": "true", children: [jsxRuntime.jsx(SquareSkeleton, { height: 44, rounded: "md" }), jsxRuntime.jsx(SquareSkeleton, { height: 44, rounded: "md" })] })) : hasNone ? (jsxRuntime.jsx(SavedSearchesEmpty, { icon: jsxRuntime.jsx(Bookmark, {}), title: emptyTitle, description: emptyDescription })) : visibleItems.length === 0 ? (jsxRuntime.jsx(SavedSearchesEmpty, { icon: jsxRuntime.jsx(SearchX, {}), title: NO_MATCH_TITLE, description: getNoMatchText(query) })) : (jsxRuntime.jsx(ScrollFade, { className: LIST_SCROLL_CLASS_NAME, children: jsxRuntime.jsx(TooltipProvider, { delayDuration: 300, children: jsxRuntime.jsx("ul", { className: "flex flex-col", children: visibleItems.map((item) => (jsxRuntime.jsx(SavedSearchRow, { item: item, onSelect: closeThen(onSelect, item), onRename: onRename && closeThen(onRename, item), onDelete: onDelete && closeThen(onDelete, item) }, item.id))) }) }) })), footnote && !hasNone && (jsxRuntime.jsx("p", { className: "border-t border-border px-2 pt-2 text-xs text-muted-foreground", children: footnote }))] })] }));
|
|
39254
|
+
}
|
|
39255
|
+
|
|
39256
|
+
/**
|
|
39257
|
+
* App-wide modal wrapper with a fixed header / body / footer layout.
|
|
39258
|
+
* Built on top of shadcn DialogContent, so it inherits viewport-centered
|
|
39259
|
+
* positioning, focus trapping, portal rendering, and overlay handling.
|
|
39260
|
+
*/
|
|
39261
|
+
function Modal({ open, onClose, title, description, icon, children, footer, size = 'default', hideCloseButton = false, className, bodyClassName, }) {
|
|
39262
|
+
// See ConfirmDialog: overlapping dismissable layers leak the <body> lock.
|
|
39263
|
+
useOverlayBodyLockRelease(open);
|
|
39264
|
+
return (jsxRuntime.jsx(Dialog, { open: open, onOpenChange: (o) => !o && onClose(), children: jsxRuntime.jsxs(DialogContent, { hideCloseButton: true, size: size === 'wide' ? 'wide' : 'default', className: cn('flex flex-col gap-0 overflow-hidden p-0', className), children: [jsxRuntime.jsxs("header", { className: "flex shrink-0 items-start justify-between gap-4 px-6 pt-5 pb-4", children: [jsxRuntime.jsxs("div", { className: cn('flex min-w-0 gap-3.5', description ? 'items-start' : 'items-center'), children: [icon ? jsxRuntime.jsx(DialogIcon, { children: icon }) : null, jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col", children: [jsxRuntime.jsx(DialogPrimitive__namespace.Title, { className: "m-0 text-lg font-semibold leading-6 text-foreground", children: title }), description ? (jsxRuntime.jsx(DialogPrimitive__namespace.Description, { className: "m-0 text-sm leading-5 text-muted-foreground", children: description })) : null] })] }), !hideCloseButton && (jsxRuntime.jsx(DialogPrimitive__namespace.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: jsxRuntime.jsx(X$2, { className: "h-4 w-4" }) }))] }), jsxRuntime.jsx("div", { className: cn('flex-1 overflow-y-auto', bodyClassName), children: children }), footer && (jsxRuntime.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 }))] }) }));
|
|
39265
|
+
}
|
|
39266
|
+
|
|
39267
|
+
const NAME_LABEL = 'Name';
|
|
39268
|
+
const FILTERS_LABEL = 'Filters saved';
|
|
39269
|
+
const NAME_REQUIRED_ERROR = 'Enter a name for this search.';
|
|
39270
|
+
const DUPLICATE_TITLE = 'Name already in use';
|
|
39271
|
+
const DUPLICATE_DESCRIPTION = 'Save another search with this name?';
|
|
39272
|
+
const DUPLICATE_DETAIL_LABEL = 'Existing saved search';
|
|
39273
|
+
const SAVE_ANYWAY_LABEL = 'Save anyway';
|
|
39274
|
+
const CHANGE_NAME_LABEL = 'Change name';
|
|
39275
|
+
const GO_BACK_LABEL = 'Go back';
|
|
39276
|
+
const CANCEL_LABEL = 'Cancel';
|
|
39277
|
+
|
|
39278
|
+
const SAVED_SEARCH_NAME_MAX_LENGTH = 100;
|
|
39279
|
+
const isValidSearchName = (name) => {
|
|
39280
|
+
const trimmed = name.trim();
|
|
39281
|
+
return trimmed.length > 0 && trimmed.length <= SAVED_SEARCH_NAME_MAX_LENGTH;
|
|
39282
|
+
};
|
|
39283
|
+
const isDuplicateSearchName = (name, existingNames) => {
|
|
39284
|
+
const needle = name.trim().toLowerCase();
|
|
39285
|
+
return existingNames.some((taken) => taken.trim().toLowerCase() === needle);
|
|
39286
|
+
};
|
|
39287
|
+
const FILTERS_PANEL_CLASS_NAME = 'rounded-lg border border-border bg-muted/40 p-3';
|
|
39288
|
+
/** The warning for a step: the caller's for the limit and already-saved steps, built-in copy for a reused name. */
|
|
39289
|
+
function getStepWarning(step, name, warnings) {
|
|
39290
|
+
if (step === 'limit')
|
|
39291
|
+
return warnings.limitWarning;
|
|
39292
|
+
if (step === 'existing')
|
|
39293
|
+
return warnings.existingWarning;
|
|
39294
|
+
if (step === 'duplicate') {
|
|
39295
|
+
return {
|
|
39296
|
+
title: DUPLICATE_TITLE,
|
|
39297
|
+
description: DUPLICATE_DESCRIPTION,
|
|
39298
|
+
detail: { label: DUPLICATE_DETAIL_LABEL, value: name.trim() },
|
|
39299
|
+
};
|
|
39300
|
+
}
|
|
39301
|
+
return undefined;
|
|
39302
|
+
}
|
|
39303
|
+
/** Cancel closes before the form; later warnings go back to it. */
|
|
39304
|
+
function getWarningCancelLabel(step) {
|
|
39305
|
+
if (step === 'existing')
|
|
39306
|
+
return CANCEL_LABEL;
|
|
39307
|
+
if (step === 'limit')
|
|
39308
|
+
return GO_BACK_LABEL;
|
|
39309
|
+
return CHANGE_NAME_LABEL;
|
|
39310
|
+
}
|
|
39311
|
+
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';
|
|
39312
|
+
|
|
39313
|
+
/**
|
|
39314
|
+
* The name field restarts from `defaultName` every time the dialog opens. Save stays enabled and reports a
|
|
39315
|
+
* missing name; an optional warning can come before the form (e.g. already saved), and a reused name, then the
|
|
39316
|
+
* saved-search limit, each get a follow-up warning that replaces the
|
|
39317
|
+
* form until the user confirms (the last one stays up, showing progress, until the caller closes on success).
|
|
39318
|
+
*/
|
|
39319
|
+
function useSaveSearchDialog({ open, defaultName, onSave, saving, existingNames, hasLimitWarning, hasExistingWarning, onClose, }) {
|
|
39320
|
+
const formId = React.useId();
|
|
39321
|
+
const inputId = React.useId();
|
|
39322
|
+
const [name, setNameState] = React.useState(defaultName);
|
|
39323
|
+
const [error, setError] = React.useState();
|
|
39324
|
+
const firstStep = hasExistingWarning ? 'existing' : 'form';
|
|
39325
|
+
const [step, setStep] = React.useState(firstStep);
|
|
39326
|
+
const [wasOpen, setWasOpen] = React.useState(open);
|
|
39327
|
+
if (open !== wasOpen) {
|
|
39328
|
+
setWasOpen(open);
|
|
39329
|
+
if (open) {
|
|
39330
|
+
setNameState(defaultName);
|
|
39331
|
+
setError(undefined);
|
|
39332
|
+
setStep(firstStep);
|
|
39333
|
+
}
|
|
39334
|
+
}
|
|
39335
|
+
const save = () => onSave(name.trim());
|
|
39336
|
+
const afterDuplicate = () => hasLimitWarning ? setStep('limit') : save();
|
|
39337
|
+
return {
|
|
39338
|
+
formId,
|
|
39339
|
+
inputId,
|
|
39340
|
+
name,
|
|
39341
|
+
setName: (next) => {
|
|
39342
|
+
setNameState(next);
|
|
39343
|
+
if (error)
|
|
39344
|
+
setError(undefined);
|
|
39345
|
+
},
|
|
39346
|
+
error,
|
|
39347
|
+
submit: () => {
|
|
39348
|
+
if (saving)
|
|
39349
|
+
return;
|
|
39350
|
+
if (!isValidSearchName(name)) {
|
|
39351
|
+
setError(NAME_REQUIRED_ERROR);
|
|
39352
|
+
return;
|
|
39353
|
+
}
|
|
39354
|
+
if (isDuplicateSearchName(name, existingNames)) {
|
|
39355
|
+
setStep('duplicate');
|
|
39356
|
+
return;
|
|
39357
|
+
}
|
|
39358
|
+
afterDuplicate();
|
|
39359
|
+
},
|
|
39360
|
+
step,
|
|
39361
|
+
confirmWarning: () => {
|
|
39362
|
+
if (step === 'existing')
|
|
39363
|
+
setStep('form');
|
|
39364
|
+
else if (step === 'duplicate')
|
|
39365
|
+
afterDuplicate();
|
|
39366
|
+
else
|
|
39367
|
+
save();
|
|
39368
|
+
},
|
|
39369
|
+
cancelWarning: () => step === 'existing' ? onClose() : setStep('form'),
|
|
39370
|
+
};
|
|
39371
|
+
}
|
|
39372
|
+
|
|
39373
|
+
/** The search a warning is about, in the dialog body (long names stay on one line, full text on hover). */
|
|
39374
|
+
function WarningDetail({ label, value, }) {
|
|
39375
|
+
return (jsxRuntime.jsxs("div", { className: WARNING_DETAIL_CLASS_NAME, children: [jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: label }), jsxRuntime.jsx(TruncatedLabel, { text: value, className: "text-sm font-semibold text-foreground" })] }));
|
|
39376
|
+
}
|
|
39377
|
+
|
|
39378
|
+
/** Names the current filters and saves them; also used to rename a saved search. */
|
|
39379
|
+
function SaveSearchDialog({ open, onClose, onSave, defaultName = '', chips, title = 'Save search', icon = jsxRuntime.jsx(Bookmark, { className: "size-5" }), submitLabel = 'Save search', note, existingNames, limitWarning, existingWarning, saving = false, }) {
|
|
39380
|
+
const { formId, inputId, name, setName, error, submit, step, confirmWarning, cancelWarning, } = useSaveSearchDialog({
|
|
39381
|
+
open,
|
|
39382
|
+
defaultName,
|
|
39383
|
+
onSave,
|
|
39384
|
+
saving,
|
|
39385
|
+
existingNames: existingNames ?? [],
|
|
39386
|
+
hasLimitWarning: Boolean(limitWarning),
|
|
39387
|
+
hasExistingWarning: Boolean(existingWarning),
|
|
39388
|
+
onClose,
|
|
39389
|
+
});
|
|
39390
|
+
const warning = getStepWarning(step, name, {
|
|
39391
|
+
limitWarning,
|
|
39392
|
+
existingWarning,
|
|
39393
|
+
});
|
|
39394
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(Modal
|
|
39395
|
+
// One dialog at a time: the duplicate-name warning replaces this one and hands back to it.
|
|
39396
|
+
, {
|
|
39397
|
+
// One dialog at a time: the duplicate-name warning replaces this one and hands back to it.
|
|
39398
|
+
open: open && step === 'form', onClose: onClose, title: title, icon: icon, footer: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(Button, { appearance: "outline", color: "secondary", size: "md", onClick: onClose, children: "Cancel" }), jsxRuntime.jsx(Button, { appearance: "solid", color: "primary", size: "md", type: "submit", form: formId, loading: saving, children: submitLabel })] }), children: jsxRuntime.jsxs("form", { id: formId, noValidate: true, className: "flex flex-col gap-4 px-6 pb-5", onSubmit: (event) => {
|
|
39399
|
+
event.preventDefault();
|
|
39400
|
+
submit();
|
|
39401
|
+
}, children: [jsxRuntime.jsx(Field, { label: NAME_LABEL, required: true, error: error, input: jsxRuntime.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 && (jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [jsxRuntime.jsx("span", { className: "text-[13px] text-label", children: FILTERS_LABEL }), jsxRuntime.jsx(SavedSearchChipList, { chips: chips, className: FILTERS_PANEL_CLASS_NAME })] })), note && (jsxRuntime.jsxs("p", { className: "flex items-start gap-1.5 text-xs text-muted-foreground", children: [jsxRuntime.jsx(Info, { "aria-hidden": "true", className: "mt-px size-3.5 shrink-0" }), jsxRuntime.jsx("span", { children: note })] }))] }) }), jsxRuntime.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 && jsxRuntime.jsx(WarningDetail, { ...warning.detail }) })] }));
|
|
39402
|
+
}
|
|
39403
|
+
|
|
38968
39404
|
/**
|
|
38969
39405
|
* Compact "time ago" label, e.g. "5m ago". Falls back to a locale date past a
|
|
38970
39406
|
* week so older entries stay scannable.
|
|
@@ -39577,17 +40013,6 @@ const TONE_ICON_BG = {
|
|
|
39577
40013
|
};
|
|
39578
40014
|
const MetricTile = ({ label, value, sub, icon, tone, className, }) => (jsxRuntime.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: [jsxRuntime.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 }), jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col", children: [jsxRuntime.jsx("span", { className: "truncate text-xs text-muted-foreground", children: label }), jsxRuntime.jsx("span", { className: "truncate text-lg font-semibold text-foreground", children: value }), sub && (jsxRuntime.jsx("span", { className: "truncate text-xs text-muted-foreground", children: sub }))] })] }));
|
|
39579
40015
|
|
|
39580
|
-
/**
|
|
39581
|
-
* App-wide modal wrapper with a fixed header / body / footer layout.
|
|
39582
|
-
* Built on top of shadcn DialogContent, so it inherits viewport-centered
|
|
39583
|
-
* positioning, focus trapping, portal rendering, and overlay handling.
|
|
39584
|
-
*/
|
|
39585
|
-
function Modal({ open, onClose, title, description, icon, children, footer, size = 'default', hideCloseButton = false, className, bodyClassName, }) {
|
|
39586
|
-
// See ConfirmDialog: overlapping dismissable layers leak the <body> lock.
|
|
39587
|
-
useOverlayBodyLockRelease(open);
|
|
39588
|
-
return (jsxRuntime.jsx(Dialog, { open: open, onOpenChange: (o) => !o && onClose(), children: jsxRuntime.jsxs(DialogContent, { hideCloseButton: true, size: size === 'wide' ? 'wide' : 'default', className: cn('flex flex-col gap-0 overflow-hidden p-0', className), children: [jsxRuntime.jsxs("header", { className: "flex shrink-0 items-start justify-between gap-4 px-6 pt-5 pb-4", children: [jsxRuntime.jsxs("div", { className: cn('flex min-w-0 gap-3.5', description ? 'items-start' : 'items-center'), children: [icon ? jsxRuntime.jsx(DialogIcon, { children: icon }) : null, jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col", children: [jsxRuntime.jsx(DialogPrimitive__namespace.Title, { className: "m-0 text-lg font-semibold leading-6 text-foreground", children: title }), description ? (jsxRuntime.jsx(DialogPrimitive__namespace.Description, { className: "m-0 text-sm leading-5 text-muted-foreground", children: description })) : null] })] }), !hideCloseButton && (jsxRuntime.jsx(DialogPrimitive__namespace.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: jsxRuntime.jsx(X$2, { className: "h-4 w-4" }) }))] }), jsxRuntime.jsx("div", { className: cn('flex-1 overflow-y-auto', bodyClassName), children: children }), footer && (jsxRuntime.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 }))] }) }));
|
|
39589
|
-
}
|
|
39590
|
-
|
|
39591
40016
|
/**
|
|
39592
40017
|
* Side info panel that sits adjacent to the form content (not a modal/drawer).
|
|
39593
40018
|
* The parent page is responsible for layout: render this inside a flex row
|
|
@@ -76537,7 +76962,7 @@ function describeFilterValue(field, value) {
|
|
|
76537
76962
|
], value.value);
|
|
76538
76963
|
}
|
|
76539
76964
|
}
|
|
76540
|
-
/** Short value shown on the filter-row trigger, e.g. `Red +1`, `VG – F`, `3 IDs`. */
|
|
76965
|
+
/** Short value shown on the filter-row trigger, e.g. `Red +1`, `VG – F`, `A-102`, `3 IDs`. */
|
|
76541
76966
|
function getCellLabel(field, value) {
|
|
76542
76967
|
if (!value || !isFilterValueActive(value))
|
|
76543
76968
|
return '';
|
|
@@ -76545,8 +76970,6 @@ function getCellLabel(field, value) {
|
|
|
76545
76970
|
return summarizeSelection(value.values, field.options ?? []);
|
|
76546
76971
|
if (value.type === 'scale')
|
|
76547
76972
|
return formatScaleRange(field.options ?? [], value.range, field.shortLabels);
|
|
76548
|
-
if (value.type === 'ids')
|
|
76549
|
-
return `${value.ids.length} IDs`;
|
|
76550
76973
|
return describeFilterValue(field, value);
|
|
76551
76974
|
}
|
|
76552
76975
|
/** Filter-row popovers hold the filter's card at a compact, fixed width. */
|
|
@@ -76566,31 +76989,31 @@ function resolveListLayout(field) {
|
|
|
76566
76989
|
? 'list'
|
|
76567
76990
|
: (field.layout ?? 'chips');
|
|
76568
76991
|
}
|
|
76569
|
-
/**
|
|
76992
|
+
/** The empty single-select dropdown on a card: `inputPlaceholder`, else `Any <label>` (set `inputPlaceholder` for acronyms). */
|
|
76993
|
+
const getSingleSelectPlaceholder = (field) => field.inputPlaceholder ?? `Any ${field.label.toLowerCase()}`;
|
|
76994
|
+
/** Popover variant: the same control and layout as the card (pills up to 10 options, then the list); tile grids drop to two columns. */
|
|
76570
76995
|
function toPopoverField(field) {
|
|
76571
76996
|
if (field.type === 'scale' ||
|
|
76572
76997
|
(field.type === 'list' && resolveListLayout(field) === 'tiles')) {
|
|
76573
76998
|
return { ...field, columns: POPOVER_TILE_COLUMNS };
|
|
76574
76999
|
}
|
|
76575
|
-
|
|
76576
|
-
return field.type === 'list' ? { ...field, layout: 'list' } : field;
|
|
77000
|
+
return field;
|
|
76577
77001
|
}
|
|
76578
77002
|
/** ID lists and searchable lists carry their own "x selected · Clear" row, so the card skips its Clear (and, in a popover, its title). */
|
|
76579
77003
|
const ownsClearRow = (field) => field.type === 'ids' ||
|
|
76580
77004
|
(field.type === 'list' && resolveListLayout(field) === 'list');
|
|
76581
|
-
/** Popover header text in place of the title: `2 of 17 selected`, or the applied value (`VG – F`, `Last 30 days`). */
|
|
77005
|
+
/** 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. */
|
|
76582
77006
|
function getPopoverStatus(field, value) {
|
|
76583
77007
|
if (ownsClearRow(field))
|
|
76584
77008
|
return undefined;
|
|
76585
77009
|
if (field.type === 'list') {
|
|
76586
77010
|
return formatSelectedCount(valueOfType(value, 'list')?.values.length ?? 0, field.options?.length ?? 0);
|
|
76587
77011
|
}
|
|
76588
|
-
|
|
77012
|
+
// Nothing applied: the trigger already reads "Any", so the popover skips the header.
|
|
77013
|
+
return describeFilterValue(field, value) || undefined;
|
|
76589
77014
|
}
|
|
76590
|
-
/** The empty single-select trigger: `inputPlaceholder`, else `Any <label>` (lowercased — set `inputPlaceholder` for acronyms). */
|
|
76591
|
-
const getSingleSelectPlaceholder = (field) => field.inputPlaceholder ?? `Any ${field.label.toLowerCase()}`;
|
|
76592
77015
|
|
|
76593
|
-
/** Single-choice list
|
|
77016
|
+
/** 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. */
|
|
76594
77017
|
function SingleSelectFilter({ field, selected, onSelect, }) {
|
|
76595
77018
|
const options = field.options ?? [];
|
|
76596
77019
|
return (jsxRuntime.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 }));
|
|
@@ -76604,7 +77027,7 @@ function FilterFieldControl({ field, value, onChange, fiscalYearStartMonth, fill
|
|
|
76604
77027
|
return (jsxRuntime.jsx(SingleSelectFilter, { field: field, selected: valueOfType(value, 'list')?.values[0], onSelect: (next) => onChange(toListValue([next])) }));
|
|
76605
77028
|
}
|
|
76606
77029
|
const layout = resolveListLayout(field);
|
|
76607
|
-
return (jsxRuntime.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 }));
|
|
77030
|
+
return (jsxRuntime.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 }));
|
|
76608
77031
|
}
|
|
76609
77032
|
case 'scale':
|
|
76610
77033
|
return (jsxRuntime.jsx(ScaleRangeFilter, { ariaLabel: ariaLabel, options: field.options ?? [], value: valueOfType(value, 'scale')?.range, onChange: (range) => onChange(toScaleValue(range)), columns: field.columns, fill: fill }));
|
|
@@ -76615,7 +77038,7 @@ function FilterFieldControl({ field, value, onChange, fiscalYearStartMonth, fill
|
|
|
76615
77038
|
// Cards show one shared hint instead of a helper under every box.
|
|
76616
77039
|
helperText: inPopover ? field.helperText : '' }));
|
|
76617
77040
|
case 'contains':
|
|
76618
|
-
return (jsxRuntime.jsx(ContainsFilter, { ariaLabel: ariaLabel, size: "field", value: valueOfType(value, 'contains')?.text ?? '', onChange: (text) => onChange(toContainsValue(text)) }));
|
|
77041
|
+
return (jsxRuntime.jsx(ContainsFilter, { ariaLabel: ariaLabel, size: "field", placeholder: field.inputPlaceholder, value: valueOfType(value, 'contains')?.text ?? '', onChange: (text) => onChange(toContainsValue(text)) }));
|
|
76619
77042
|
case 'date':
|
|
76620
77043
|
return (jsxRuntime.jsx(DateRangeFilter, { ariaLabel: ariaLabel, value: valueOfType(value, 'date')?.range, onChange: (range) => onChange(toDateValue(range)), fiscalYearStartMonth: fiscalYearStartMonth }));
|
|
76621
77044
|
case 'bool':
|
|
@@ -76629,7 +77052,7 @@ function FilterFieldCell({ field, value, onChange, fiscalYearStartMonth, classNa
|
|
|
76629
77052
|
const placeholder = field.placeholder ?? DEFAULT_CELL_PLACEHOLDERS[field.type];
|
|
76630
77053
|
const clear = () => onChange(undefined);
|
|
76631
77054
|
if (field.type === 'number' && state !== 'disabled') {
|
|
76632
|
-
return (jsxRuntime.jsx(NumberExpressionFilter, { ariaLabel: ariaLabel, value: valueOfType(value, 'number')?.range, onChange: (range) => onChange(toNumberValue(range)), placeholder: placeholder, note: field.note, className: className }));
|
|
77055
|
+
return (jsxRuntime.jsx(NumberExpressionFilter, { ariaLabel: ariaLabel, value: valueOfType(value, 'number')?.range, onChange: (range) => onChange(toNumberValue(range)), placeholder: placeholder, note: field.note, ruleExamples: field.ruleExamples, className: className }));
|
|
76633
77056
|
}
|
|
76634
77057
|
if (field.type === 'contains' && state !== 'disabled') {
|
|
76635
77058
|
return (jsxRuntime.jsx(ContainsFilter, { ariaLabel: ariaLabel, size: "cell", value: valueOfType(value, 'contains')?.text ?? '', onChange: (text) => onChange(toContainsValue(text)), placeholder: placeholder, className: className }));
|
|
@@ -76656,15 +77079,34 @@ function FilterField(props) {
|
|
|
76656
77079
|
/** Both leave without applying — the draft is discarded. */
|
|
76657
77080
|
const BACK_LABEL = 'Back without applying';
|
|
76658
77081
|
const CLOSE_LABEL = 'Close without applying';
|
|
77082
|
+
const LOADING_LABEL = 'Loading filters';
|
|
77083
|
+
const ERROR_TITLE = "Couldn't load filters";
|
|
77084
|
+
const DEFAULT_ERROR_MESSAGE = 'Something went wrong while loading the filters. Check your connection and try again.';
|
|
77085
|
+
const RETRY_LABEL = 'Try again';
|
|
77086
|
+
|
|
77087
|
+
/** Placeholder cards while the filters load; roughly the first rows of a card grid. */
|
|
77088
|
+
const SKELETON_CARD_COUNT = 8;
|
|
77089
|
+
const SKELETON_GRID_CLASS_NAME = 'grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4';
|
|
77090
|
+
|
|
77091
|
+
const DEFAULT_SKELETON_CARDS = Array.from({ length: SKELETON_CARD_COUNT }, (_, index) => `card-${index}`);
|
|
77092
|
+
/** Loading placeholder: the page's own skeleton, or generic list cards. */
|
|
77093
|
+
function FilterSurfaceSkeleton({ children, }) {
|
|
77094
|
+
return (jsxRuntime.jsx("div", { role: "status", "aria-label": LOADING_LABEL, children: children ?? (jsxRuntime.jsx("div", { className: SKELETON_GRID_CLASS_NAME, children: DEFAULT_SKELETON_CARDS.map((id) => (jsxRuntime.jsx(FilterCardSkeleton, {}, id))) })) }));
|
|
77095
|
+
}
|
|
77096
|
+
/** Shown in place of the cards when the filters couldn't load. */
|
|
77097
|
+
function FilterSurfaceError({ message, onRetry, }) {
|
|
77098
|
+
return (jsxRuntime.jsxs("div", { role: "alert", className: "flex flex-col items-center rounded-xl border border-border bg-card px-6 py-12 text-center", children: [jsxRuntime.jsx("span", { className: "flex size-10 items-center justify-center rounded-full bg-destructive/10 text-destructive", children: jsxRuntime.jsx(TriangleAlert, { "aria-hidden": "true", className: "size-5" }) }), jsxRuntime.jsx("p", { className: "mt-4 text-base font-semibold text-foreground", children: ERROR_TITLE }), jsxRuntime.jsx("p", { className: "mt-1.5 max-w-sm text-sm text-muted-foreground", children: message }), onRetry && (jsxRuntime.jsx(Button, { appearance: "outline", color: "secondary", size: "md", leftIcon: jsxRuntime.jsx(RotateCcw, {}), onClick: onRetry, className: "mt-5", children: RETRY_LABEL }))] }));
|
|
77099
|
+
}
|
|
76659
77100
|
|
|
77101
|
+
const NESTED_LAYER_SELECTOR = '[data-slot="popover-content"], [role="dialog"], [role="menu"], [role="listbox"]';
|
|
76660
77102
|
function useCloseOnEscape(onClose) {
|
|
76661
77103
|
React.useEffect(() => {
|
|
76662
77104
|
const handleKeyDown = (event) => {
|
|
76663
77105
|
if (event.key !== 'Escape' || event.defaultPrevented)
|
|
76664
77106
|
return;
|
|
76665
|
-
// Escape inside an open popover only closes that
|
|
77107
|
+
// Escape inside an open popover, dialog or menu only closes that layer (Radix doesn't mark the event handled).
|
|
76666
77108
|
if (event.target instanceof Element &&
|
|
76667
|
-
event.target.closest(
|
|
77109
|
+
event.target.closest(NESTED_LAYER_SELECTOR))
|
|
76668
77110
|
return;
|
|
76669
77111
|
onClose();
|
|
76670
77112
|
};
|
|
@@ -76678,17 +77120,17 @@ function useFilterSurfaceMore(defaultExpanded = false) {
|
|
|
76678
77120
|
}
|
|
76679
77121
|
|
|
76680
77122
|
/** Full-page filter screen (e.g. an advanced search): header, scrolling card grid, sticky apply footer. */
|
|
76681
|
-
function FilterSurface({ title, headerActions, footerChips, footerActions, onClose, children, }) {
|
|
77123
|
+
function FilterSurface({ title, headerActions, footerChips, footerActions, onClose, status = 'ready', errorMessage, onRetry, skeleton, children, }) {
|
|
76682
77124
|
useCloseOnEscape(onClose);
|
|
76683
|
-
return (jsxRuntime.jsxs("div", { role: "region", "aria-label": title, className: "flex h-full min-h-0 flex-col bg-background", children: [jsxRuntime.jsxs("
|
|
77125
|
+
return (jsxRuntime.jsxs("div", { role: "region", "aria-label": title, className: "flex h-full min-h-0 flex-col bg-background", children: [jsxRuntime.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: [jsxRuntime.jsx("div", { className: "flex flex-col gap-1", children: jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntime.jsx(IconButton, { appearance: "ghost", size: "sm", "aria-label": BACK_LABEL, title: BACK_LABEL, onClick: onClose, children: jsxRuntime.jsx(ArrowLeft, {}) }), jsxRuntime.jsx("h1", { className: "text-xl font-semibold text-foreground", children: title })] }) }), jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [headerActions, jsxRuntime.jsx(IconButton, { appearance: "outline", size: "md", "aria-label": CLOSE_LABEL, title: CLOSE_LABEL, onClick: onClose, children: jsxRuntime.jsx(X$2, {}) })] })] }), jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-3 pb-3", children: status === 'loading' ? (jsxRuntime.jsx(FilterSurfaceSkeleton, { children: skeleton })) : status === 'error' ? (jsxRuntime.jsx(FilterSurfaceError, { message: errorMessage ?? DEFAULT_ERROR_MESSAGE, onRetry: onRetry })) : (jsxRuntime.jsx("div", { className: "flex flex-col gap-3", children: children })) }), status === 'ready' && (footerChips || footerActions) && (jsxRuntime.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: [jsxRuntime.jsx("div", { className: "min-w-0 flex-1", children: footerChips }), jsxRuntime.jsx("div", { className: "flex shrink-0 items-center gap-2", children: footerActions })] }))] }));
|
|
76684
77126
|
}
|
|
76685
77127
|
function FilterSurfaceGroup({ title, className, children, }) {
|
|
76686
|
-
return (jsxRuntime.jsxs("section", { className: "flex flex-col gap-3", children: [title && (jsxRuntime.jsx("h2", { className: "text-xs font-semibold uppercase tracking-wide text-label", children: title })), jsxRuntime.jsx("div", { className: cn('grid grid-cols-1 gap-
|
|
77128
|
+
return (jsxRuntime.jsxs("section", { className: "flex flex-col gap-3", children: [title && (jsxRuntime.jsx("h2", { className: "text-xs font-semibold uppercase tracking-wide text-label", children: title })), jsxRuntime.jsx("div", { className: cn('grid grid-cols-1 gap-3 lg:grid-cols-6', className), children: children })] }));
|
|
76687
77129
|
}
|
|
76688
77130
|
/** Collapsed "More filters" divider that reveals extra cards. */
|
|
76689
77131
|
function FilterSurfaceMore({ label, defaultExpanded, children, }) {
|
|
76690
77132
|
const { expanded, toggle } = useFilterSurfaceMore(defaultExpanded);
|
|
76691
|
-
return (jsxRuntime.jsxs("section", { className: "flex flex-col gap-
|
|
77133
|
+
return (jsxRuntime.jsxs("section", { className: "flex flex-col gap-3", children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [jsxRuntime.jsx("span", { className: "h-px flex-1 bg-border" }), jsxRuntime.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, jsxRuntime.jsx(ChevronDown, { "aria-hidden": "true", className: cn('size-3.5 transition-transform', expanded && 'rotate-180') })] }), jsxRuntime.jsx("span", { className: "h-px flex-1 bg-border" })] }), expanded && children] }));
|
|
76692
77134
|
}
|
|
76693
77135
|
|
|
76694
77136
|
/** Falls back to counting the current page when the caller has no total. */
|
|
@@ -79336,9 +79778,11 @@ exports.DropdownMenuSubTrigger = DropdownMenuSubTrigger;
|
|
|
79336
79778
|
exports.DropdownMenuTrigger = DropdownMenuTrigger;
|
|
79337
79779
|
exports.EmptyValue = EmptyValue;
|
|
79338
79780
|
exports.EntityHeader = EntityHeader;
|
|
79781
|
+
exports.FILTER_COUNT_BADGE_CLASS_NAME = FILTER_COUNT_BADGE_CLASS_NAME;
|
|
79339
79782
|
exports.Field = Field;
|
|
79340
79783
|
exports.FieldSkeleton = FieldSkeleton;
|
|
79341
79784
|
exports.FileUploader = FileUploader;
|
|
79785
|
+
exports.FilterCardSkeleton = FilterCardSkeleton;
|
|
79342
79786
|
exports.FilterCellPopover = FilterCellPopover;
|
|
79343
79787
|
exports.FilterEmptyState = FilterEmptyState;
|
|
79344
79788
|
exports.FilterField = FilterField;
|
|
@@ -79418,8 +79862,12 @@ exports.RadioCardGroup = RadioCardGroup;
|
|
|
79418
79862
|
exports.ReadMoreText = ReadMoreText;
|
|
79419
79863
|
exports.RefreshButton = RefreshButton;
|
|
79420
79864
|
exports.RichTextarea = RichTextarea$1;
|
|
79865
|
+
exports.SAVED_SEARCH_NAME_MAX_LENGTH = SAVED_SEARCH_NAME_MAX_LENGTH;
|
|
79421
79866
|
exports.SEARCHABLE_SELECT_PAGE_SIZE = SEARCHABLE_SELECT_PAGE_SIZE;
|
|
79422
79867
|
exports.SafeImage = SafeImage;
|
|
79868
|
+
exports.SaveSearchDialog = SaveSearchDialog;
|
|
79869
|
+
exports.SavedSearchChipList = SavedSearchChipList;
|
|
79870
|
+
exports.SavedSearchesMenu = SavedSearchesMenu;
|
|
79423
79871
|
exports.ScaleRangeFilter = ScaleRangeFilter;
|
|
79424
79872
|
exports.ScrollFade = ScrollFade;
|
|
79425
79873
|
exports.SearchBox = SearchBox;
|
|
@@ -79492,6 +79940,7 @@ exports.buildBulkShareTitle = buildBulkShareTitle;
|
|
|
79492
79940
|
exports.buildInventoryPublicUrl = buildInventoryPublicUrl;
|
|
79493
79941
|
exports.buildInventoryRowProps = buildInventoryRowProps;
|
|
79494
79942
|
exports.buildInventoryShareTitle = buildInventoryShareTitle;
|
|
79943
|
+
exports.buildNumberRuleHelp = buildNumberRuleHelp;
|
|
79495
79944
|
exports.buildWhatsappUrl = buildWhatsappUrl;
|
|
79496
79945
|
exports.buttonVariants = buttonVariants;
|
|
79497
79946
|
exports.cn = cn;
|
|
@@ -79502,6 +79951,7 @@ exports.describeFilterValue = describeFilterValue;
|
|
|
79502
79951
|
exports.dropdownMenuItemDestructiveClass = dropdownMenuItemDestructiveClass;
|
|
79503
79952
|
exports.expandScaleRange = expandScaleRange;
|
|
79504
79953
|
exports.fieldTypeIcon = fieldTypeIcon;
|
|
79954
|
+
exports.filterSavedSearches = filterSavedSearches;
|
|
79505
79955
|
exports.findRegion = findRegion;
|
|
79506
79956
|
exports.flagEmoji = flagEmoji;
|
|
79507
79957
|
exports.formatAddressLocation = formatAddressLocation;
|
|
@@ -79521,11 +79971,13 @@ exports.iconButtonVariants = iconButtonVariants;
|
|
|
79521
79971
|
exports.inAppNotificationCardA11y = inAppNotificationCardA11y;
|
|
79522
79972
|
exports.inAppNotificationsPanelA11y = inAppNotificationsPanelA11y;
|
|
79523
79973
|
exports.isBlank = isBlank;
|
|
79974
|
+
exports.isDuplicateSearchName = isDuplicateSearchName;
|
|
79524
79975
|
exports.isFilterValueActive = isFilterValueActive;
|
|
79525
79976
|
exports.isIndiaCountry = isIndiaCountry;
|
|
79526
79977
|
exports.isKnownRegion = isKnownRegion;
|
|
79527
79978
|
exports.isPathActive = isPathActive;
|
|
79528
79979
|
exports.isValidAlpha2CountryCode = isValidAlpha2CountryCode;
|
|
79980
|
+
exports.isValidSearchName = isValidSearchName;
|
|
79529
79981
|
exports.isValueEmpty = isValueEmpty;
|
|
79530
79982
|
exports.notify = notify;
|
|
79531
79983
|
exports.parseNumberExpression = parseNumberExpression;
|