mantine-composite-filters 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -0
  3. package/dist/cjs/node_modules/clsx/dist/clsx.cjs +10 -0
  4. package/dist/cjs/node_modules/clsx/dist/clsx.cjs.map +1 -0
  5. package/dist/esm/node_modules/clsx/dist/clsx.mjs +5 -0
  6. package/dist/esm/node_modules/clsx/dist/clsx.mjs.map +1 -0
  7. package/dist/styles.css +1 -0
  8. package/dist/styles.layer.css +1 -0
  9. package/dist/types/components/MultiFiltersInput/CurrentFieldIndicator.d.ts +10 -0
  10. package/dist/types/components/MultiFiltersInput/FilterActionsMenu.d.ts +21 -0
  11. package/dist/types/components/MultiFiltersInput/FilterMaxReached.d.ts +6 -0
  12. package/dist/types/components/MultiFiltersInput/FilterPill.d.ts +13 -0
  13. package/dist/types/components/MultiFiltersInput/FilterStatusBar.d.ts +8 -0
  14. package/dist/types/components/MultiFiltersInput/MultiFiltersInput.d.ts +25 -0
  15. package/dist/types/components/MultiFiltersInput/context/FilterContext.d.ts +15 -0
  16. package/dist/types/components/MultiFiltersInput/context/index.d.ts +2 -0
  17. package/dist/types/components/MultiFiltersInput/dropdowns/FieldDropdown.d.ts +8 -0
  18. package/dist/types/components/MultiFiltersInput/dropdowns/OperatorDropdown.d.ts +7 -0
  19. package/dist/types/components/MultiFiltersInput/dropdowns/ValueDropdown.d.ts +10 -0
  20. package/dist/types/components/MultiFiltersInput/dropdowns/index.d.ts +6 -0
  21. package/dist/types/components/MultiFiltersInput/index.d.ts +11 -0
  22. package/dist/types/components/MultiFiltersInput/value-inputs/DateRangeValueInput.d.ts +8 -0
  23. package/dist/types/components/MultiFiltersInput/value-inputs/DateValueInput.d.ts +8 -0
  24. package/dist/types/components/MultiFiltersInput/value-inputs/index.d.ts +4 -0
  25. package/dist/types/hooks/useFilterHistory.d.ts +14 -0
  26. package/dist/types/hooks/useFilterPresets.d.ts +16 -0
  27. package/dist/types/hooks/useFilters.d.ts +24 -0
  28. package/dist/types/index.d.mts +8 -0
  29. package/dist/types/index.d.ts +8 -0
  30. package/dist/types/types/filter.types.d.ts +165 -0
  31. package/dist/types/utils/formatters.d.ts +7 -0
  32. package/dist/types/utils/index.d.ts +2 -0
  33. package/dist/types/utils/operators.d.ts +7 -0
  34. package/package.json +44 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 Vitaly Rtishchev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # Mantine Extension Template
2
+
3
+ This is a template repository for creating Mantine extensions. It includes all necessary configuration files and scripts to get you started.
4
+
5
+ ## Get started
6
+
7
+ 1. Click "Use this template" button at the top of the page to create a new repository based on this template.
8
+ 2. Clone the repository to your local machine and install dependencies (`yarn`)
9
+ 3. Run `nvm use` to switch to the correct node version
10
+ 4. Come up with a name for your extension and replace all occurrences of `mantine-extension-template` with your extension name
11
+ 5. Change `repository` field in [package/package.json](https://github.com/mantinedev/extension-template/blob/master/package/package.json) to point to your repository
12
+ 6. Run `npm run docgen` to generate files required for documentation
13
+ 7. To verify that everything works correctly, run `npm run build` and `npm test` to build and test your initial setup
14
+ 8. All good! Start developing your extension.
15
+
16
+ ## Local development
17
+
18
+ To develop your extension locally, run the following commands:
19
+
20
+ - Run `npm run storybook` to start the storybook
21
+ - Run `npm run dev` to start the documentation
22
+ - To regenerate props documentation, run `npm run docgen`
23
+
24
+ ## Publishing package
25
+
26
+ 1. Login with your npm account by running `npm login`, if you have 2FA enabled, [generate automation token](https://docs.npmjs.com/creating-and-viewing-access-tokens) and add it to your `~/.npmrc` file
27
+ 2. Make sure that your package name is unique and does not exist on npm yet
28
+ 3. Run `npm run release:patch`, `npm run release:minor` or `npm run release:major` to publish new version of your package
29
+
30
+ ## Publish documentation
31
+
32
+ By default, the documentation is deployed to GitHub Pages. The script to deploy documentation runs automatically when the package is published. In order for
33
+ this script to work correctly, you need to make sure that `repository` field in [package/package.json](https://github.com/mantinedev/extension-template/blob/master/package/package.json) points to your repository.
34
+
35
+ To publish documentation manually, run `npm run docs:deploy`.
36
+
37
+ ## README file of your extension
38
+
39
+ `README.md` file at the root repository directory (file that you are currently reading) is copied to to `package/README.md` during the build process to avoid duplication. To add content to the README file of your extension, remove extension template documentation from this file and add your own content.
@@ -0,0 +1,10 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ function r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f);}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}
7
+
8
+ exports.clsx = clsx;
9
+ exports.default = clsx;
10
+ //# sourceMappingURL=clsx.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clsx.cjs","sources":["../../../../../../node_modules/clsx/dist/clsx.mjs"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;"],"names":[],"mappings":";;;;;AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,OAAO,CAAC,CAAA,CAAE,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,OAAO,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA,CAAC,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAI,CAAE,CAAA,CAAC,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;;;","x_google_ignoreList":[0]}
@@ -0,0 +1,5 @@
1
+ 'use client';
2
+ function r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f);}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}
3
+
4
+ export { clsx, clsx as default };
5
+ //# sourceMappingURL=clsx.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clsx.mjs","sources":["../../../../../../node_modules/clsx/dist/clsx.mjs"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;"],"names":[],"mappings":";AAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,GAAG,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,OAAO,CAAC,CAAA,CAAE,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAE,OAAO,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAG,QAAQ,CAAE,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAA,CAAA,CAAG,KAAK,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAM,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA,CAAC,CAAC,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAI,CAAC,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAE,CAAA,CAAA,CAAA,CAAG,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAO,CAAC,CAAQ,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,IAAI,CAAE,CAAA,CAAC,IAAI,CAAI,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAS,CAAC,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAS,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA,CAAA,CAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAG,CAAA,CAAA,CAAC,EAAE,CAAG,CAAA,CAAA,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;;","x_google_ignoreList":[0]}
@@ -0,0 +1 @@
1
+ .me_7e10d93c{align-items:center;background-color:var(--mantine-color-gray-0);border:1px solid var(--mantine-color-gray-3);border-radius:var(--mantine-radius-md);cursor:text;display:flex;gap:var(--mantine-spacing-xs);padding-left:var(--mantine-spacing-sm);padding-right:var(--mantine-spacing-sm);position:relative;transition:all var(--mantine-transition-duration)}.me_7e10d93c:hover{border-color:var(--mantine-color-gray-4)}.me_7e10d93c:focus-within{border-color:var(--mantine-color-primary-6);box-shadow:0 0 0 1px var(--mantine-color-primary-1)}.me_20867b6c{align-items:center;display:flex;flex:1;gap:var(--mantine-spacing-xs)}.me_a6ea0d59{display:flex;flex-wrap:nowrap;min-height:calc(var(--mantine-spacing-xl)*1);overflow-x:auto;padding-right:calc(var(--mantine-spacing-xl)*2);padding-top:calc(var(--mantine-spacing-xs)/2.5)}.me_a6ea0d59::-webkit-scrollbar{height:4px}.me_a6ea0d59::-webkit-scrollbar-thumb{background-color:rgba(var(--mantine-color-primary-5-rgb),.2);border-radius:var(--mantine-radius-sm)}.me_a6ea0d59::-webkit-scrollbar-track{background:transparent}.me_38ec29d6{flex-wrap:wrap;min-height:calc(var(--mantine-spacing-xl)*1.5)}.me_7aac7a05{background:transparent;border:0;color:var(--mantine-color-text);flex:1;font-family:var(--mantine-font-family);font-size:var(--mantine-font-size-sm);line-height:var(--mantine-line-height);min-width:calc(var(--mantine-spacing-xl)*7.5);outline:none;padding:0}.me_7aac7a05:focus{box-shadow:none;outline:none}.me_7aac7a05::placeholder{color:var(--mantine-color-dimmed);opacity:1}.me_7aac7a05:disabled{cursor:not-allowed;opacity:.6}.me_d9fcf28e{align-items:center;display:flex;flex-shrink:0;gap:var(--mantine-spacing-xs);padding-left:var(--mantine-spacing-xs)}.me_777db3f6{background-color:var(--mantine-color-white);border:1px solid var(--mantine-color-gray-3);border-radius:var(--mantine-radius-md);box-shadow:var(--mantine-shadow-sm);max-width:400px;min-width:200px;overflow:hidden}.me_7605a562{flex-shrink:0;gap:2px;white-space:nowrap}.me_7605a562,.me_fb6e536c{align-items:center;display:inline-flex}.me_fb6e536c{background-color:var(--mantine-color-gray-1);border:none;border-radius:var(--mantine-radius-sm);font-size:var(--mantine-font-size-sm);gap:calc(var(--mantine-spacing-xs)/2);height:24px;line-height:1;padding:calc(var(--mantine-spacing-xs)/2) var(--mantine-spacing-xs);transition:all var(--mantine-transition-duration)}.me_9bac9170{border-bottom-right-radius:0;border-top-right-radius:0}.me_6e20f28{border-radius:0}.me_7efeb999{border-bottom-left-radius:0;border-top-left-radius:0}.me_37c53a7b{align-items:center;color:var(--mantine-color-gray-6);display:flex;flex-shrink:0;justify-content:center}.me_d9ad7055{color:var(--mantine-color-gray-7);font-weight:400}.me_f6f8490e{font-size:var(--mantine-font-size-xs)}.me_f9b6c59c{font-size:var(--mantine-font-size-sm)}.me_b536afa3{color:var(--mantine-color-gray-7);font-weight:400}.me_cff5d600{font-size:var(--mantine-font-size-xs)}.me_113ad26a{font-size:var(--mantine-font-size-sm)}.me_725f1af8{color:var(--mantine-color-gray-6)}.me_8a790ddc{border-radius:var(--mantine-radius-md);padding:calc(var(--mantine-spacing-xs)/2)}.me_534e04b6{align-items:center;display:flex;flex-direction:column;gap:var(--mantine-spacing-sm);padding:var(--mantine-spacing-lg) var(--mantine-spacing-md)}.me_dc57724{color:var(--mantine-color-gray-5)}.me_dca7fd8{color:var(--mantine-color-gray-6);font-size:var(--mantine-font-size-sm);font-weight:400}.me_d2eb2177{background:transparent;border:none;border-radius:var(--mantine-radius-sm);padding:calc(var(--mantine-spacing-xs)/2) var(--mantine-spacing-sm);transition:all .15s}.me_d2eb2177:hover{background-color:var(--mantine-color-gray-1)}.me_d2eb2177[data-combobox-selected]{background-color:var(--mantine-color-primary-1);color:var(--mantine-color-primary-7)}.me_b196702{gap:var(--mantine-spacing-sm)}.me_b196702,.me_b6b44e18{align-items:center;display:flex}.me_b6b44e18{color:var(--mantine-color-gray-6);flex-shrink:0;justify-content:center}.me_c95c21c{color:var(--mantine-color-gray-9);font-size:var(--mantine-font-size-sm);font-weight:400}.me_d9b5c915{display:flex;flex-direction:column;gap:calc(var(--mantine-spacing-xs)/2)}.me_88a0d5c6{border-radius:var(--mantine-radius-md);padding:calc(var(--mantine-spacing-xs)/2)}.me_ba15b44d{background:transparent;border:none;border-radius:var(--mantine-radius-sm);padding:calc(var(--mantine-spacing-xs)/2) var(--mantine-spacing-sm);transition:all .15s}.me_ba15b44d:hover{background-color:var(--mantine-color-gray-1)}.me_ba15b44d[data-combobox-selected]{background-color:var(--mantine-color-primary-1);color:var(--mantine-color-primary-7)}.me_2e027dd8{color:var(--mantine-color-gray-9);font-size:var(--mantine-font-size-sm);font-weight:400}.me_c0e05beb{display:flex;flex-direction:column;gap:calc(var(--mantine-spacing-xs)/2)}.me_f06d3053{border-radius:var(--mantine-radius-md);padding:calc(var(--mantine-spacing-xs)/2)}.me_447b7e5f{align-items:center;display:flex;flex-direction:column;gap:var(--mantine-spacing-sm);padding:var(--mantine-spacing-lg) var(--mantine-spacing-md)}.me_c73ad7db{color:var(--mantine-color-gray-5)}.me_c73fe08f{color:var(--mantine-color-gray-6);font-size:var(--mantine-font-size-sm);font-weight:400}.me_f73d5420{background:transparent;border:none;border-radius:var(--mantine-radius-sm);padding:calc(var(--mantine-spacing-xs)/2) var(--mantine-spacing-sm);transition:all .15s}.me_f73d5420:hover{background-color:var(--mantine-color-gray-1)}.me_b2178adb,.me_f73d5420[data-combobox-selected]{background-color:var(--mantine-color-primary-1);color:var(--mantine-color-primary-7)}.me_54f19439{gap:var(--mantine-spacing-sm)}.me_54f19439,.me_7d89a8ae{align-items:center;display:flex}.me_7d89a8ae{background-color:var(--mantine-color-white);border:1px solid var(--mantine-color-gray-4);border-radius:var(--mantine-radius-xs);color:var(--mantine-color-white);flex-shrink:0;height:calc(var(--mantine-spacing-md) - 2px);justify-content:center;transition:all var(--mantine-transition-duration);width:calc(var(--mantine-spacing-md) - 2px)}.me_dec57169{background-color:var(--mantine-color-primary-6);border-color:var(--mantine-color-primary-6)}.me_98eeceb4{color:var(--mantine-color-gray-9);font-size:var(--mantine-font-size-sm);font-weight:400}.me_e7d18146{align-items:center;border-top:1px solid var(--mantine-color-gray-2);display:flex;gap:var(--mantine-spacing-sm);justify-content:space-between;margin-top:calc(var(--mantine-spacing-xs)/2);padding:var(--mantine-spacing-sm)}.me_b52b2793{color:var(--mantine-color-gray-6);font-weight:400}.me_23329375,.me_b52b2793{font-size:var(--mantine-font-size-xs)}.me_23329375{align-items:center;background-color:var(--mantine-color-primary-6);border:none;border-radius:var(--mantine-radius-sm);color:var(--mantine-color-white);cursor:pointer;display:flex;font-weight:500;gap:calc(var(--mantine-spacing-xs)/2);outline:none;padding:calc(var(--mantine-spacing-xs)/2) var(--mantine-spacing-sm);transition:all var(--mantine-transition-duration)}.me_23329375:hover{background-color:var(--mantine-color-primary-7)}.me_fe07fbbe{display:flex;flex-direction:column;gap:calc(var(--mantine-spacing-xs)/2)}.me_53ad7594{color:var(--mantine-color-yellow-5);font-size:var(--mantine-font-size-xs);margin-left:var(--mantine-spacing-xs);margin-top:var(--mantine-spacing-sm)}.me_55847095{flex-shrink:0;gap:2px;white-space:nowrap}.me_1b8832ef,.me_55847095{align-items:center;display:inline-flex}.me_1b8832ef{background-color:var(--mantine-color-gray-1);border:none;border-radius:var(--mantine-radius-sm);cursor:pointer;font-size:var(--mantine-font-size-sm);gap:calc(var(--mantine-spacing-xs)/2);height:24px;line-height:1;padding:calc(var(--mantine-spacing-xs)/2) var(--mantine-spacing-xs);transition:all var(--mantine-transition-duration)}.me_1b8832ef:hover{background-color:var(--mantine-color-gray-2)}.me_b70ebcd{border-bottom-right-radius:0;border-top-right-radius:0}.me_8a849702{cursor:default}.me_8a849702:hover{background-color:var(--mantine-color-gray-1)}.me_79b1bbab{border-radius:0}.me_eec313f6{border-bottom-left-radius:0;border-top-left-radius:0}.me_5efde86e{flex-shrink:0;margin-left:2px}.me_aa94e6fe{align-items:center;color:var(--mantine-color-gray-6);display:flex;flex-shrink:0;justify-content:center}.me_5acd7b18{color:var(--mantine-color-gray-7);font-weight:400}.me_de1e2ceb{font-size:var(--mantine-font-size-xs)}.me_6c86721f{font-size:var(--mantine-font-size-sm)}.me_24fb0a00{color:var(--mantine-color-gray-7);font-weight:400}.me_c2458903{font-size:var(--mantine-font-size-xs)}.me_c6773307{font-size:var(--mantine-font-size-sm)}.me_5b5a8d95{color:var(--mantine-color-gray-9);font-weight:400;max-width:calc(var(--mantine-spacing-xl)*12.5);overflow:hidden;text-overflow:ellipsis}.me_230bc3ce{font-size:var(--mantine-font-size-xs)}.me_13e8f2dc{font-size:var(--mantine-font-size-sm)}.me_9b80753c,.me_dc3a6d7b{align-items:center;display:flex;flex-shrink:0;height:calc(var(--mantine-spacing-md)*1.5)}.me_fed841bd{align-items:center;display:flex;gap:var(--mantine-spacing-xs);margin-left:var(--mantine-spacing-xs);margin-top:var(--mantine-spacing-sm)}.me_755acd29{background:linear-gradient(to bottom right,var(--mantine-color-primary-filled),var(--mantine-color-primary-filled));border:0;border-radius:var(--mantine-radius-md);box-shadow:none;outline:none;padding:calc(var(--mantine-spacing-xs) + 2px);transition:all var(--mantine-transition-duration)}.me_755acd29,.me_755acd29:hover{color:var(--mantine-color-primary-filled)}.me_755acd29:focus{box-shadow:none;outline:none}.me_36f1fa71{color:var(--mantine-color-primary-filled);font-size:var(--mantine-font-size-xs)}
@@ -0,0 +1 @@
1
+ @layer mantine {.me_7e10d93c{align-items:center;background-color:var(--mantine-color-gray-0);border:1px solid var(--mantine-color-gray-3);border-radius:var(--mantine-radius-md);cursor:text;display:flex;gap:var(--mantine-spacing-xs);padding-left:var(--mantine-spacing-sm);padding-right:var(--mantine-spacing-sm);position:relative;transition:all var(--mantine-transition-duration)}.me_7e10d93c:hover{border-color:var(--mantine-color-gray-4)}.me_7e10d93c:focus-within{border-color:var(--mantine-color-primary-6);box-shadow:0 0 0 1px var(--mantine-color-primary-1)}.me_20867b6c{align-items:center;display:flex;flex:1;gap:var(--mantine-spacing-xs)}.me_a6ea0d59{display:flex;flex-wrap:nowrap;min-height:calc(var(--mantine-spacing-xl)*1);overflow-x:auto;padding-right:calc(var(--mantine-spacing-xl)*2);padding-top:calc(var(--mantine-spacing-xs)/2.5)}.me_a6ea0d59::-webkit-scrollbar{height:4px}.me_a6ea0d59::-webkit-scrollbar-thumb{background-color:rgba(var(--mantine-color-primary-5-rgb),.2);border-radius:var(--mantine-radius-sm)}.me_a6ea0d59::-webkit-scrollbar-track{background:transparent}.me_38ec29d6{flex-wrap:wrap;min-height:calc(var(--mantine-spacing-xl)*1.5)}.me_7aac7a05{background:transparent;border:0;color:var(--mantine-color-text);flex:1;font-family:var(--mantine-font-family);font-size:var(--mantine-font-size-sm);line-height:var(--mantine-line-height);min-width:calc(var(--mantine-spacing-xl)*7.5);outline:none;padding:0}.me_7aac7a05:focus{box-shadow:none;outline:none}.me_7aac7a05::placeholder{color:var(--mantine-color-dimmed);opacity:1}.me_7aac7a05:disabled{cursor:not-allowed;opacity:.6}.me_d9fcf28e{align-items:center;display:flex;flex-shrink:0;gap:var(--mantine-spacing-xs);padding-left:var(--mantine-spacing-xs)}.me_777db3f6{background-color:var(--mantine-color-white);border:1px solid var(--mantine-color-gray-3);border-radius:var(--mantine-radius-md);box-shadow:var(--mantine-shadow-sm);max-width:400px;min-width:200px;overflow:hidden}.me_7605a562{flex-shrink:0;gap:2px;white-space:nowrap}.me_7605a562,.me_fb6e536c{align-items:center;display:inline-flex}.me_fb6e536c{background-color:var(--mantine-color-gray-1);border:none;border-radius:var(--mantine-radius-sm);font-size:var(--mantine-font-size-sm);gap:calc(var(--mantine-spacing-xs)/2);height:24px;line-height:1;padding:calc(var(--mantine-spacing-xs)/2) var(--mantine-spacing-xs);transition:all var(--mantine-transition-duration)}.me_9bac9170{border-bottom-right-radius:0;border-top-right-radius:0}.me_6e20f28{border-radius:0}.me_7efeb999{border-bottom-left-radius:0;border-top-left-radius:0}.me_37c53a7b{align-items:center;color:var(--mantine-color-gray-6);display:flex;flex-shrink:0;justify-content:center}.me_d9ad7055{color:var(--mantine-color-gray-7);font-weight:400}.me_f6f8490e{font-size:var(--mantine-font-size-xs)}.me_f9b6c59c{font-size:var(--mantine-font-size-sm)}.me_b536afa3{color:var(--mantine-color-gray-7);font-weight:400}.me_cff5d600{font-size:var(--mantine-font-size-xs)}.me_113ad26a{font-size:var(--mantine-font-size-sm)}.me_725f1af8{color:var(--mantine-color-gray-6)}.me_8a790ddc{border-radius:var(--mantine-radius-md);padding:calc(var(--mantine-spacing-xs)/2)}.me_534e04b6{align-items:center;display:flex;flex-direction:column;gap:var(--mantine-spacing-sm);padding:var(--mantine-spacing-lg) var(--mantine-spacing-md)}.me_dc57724{color:var(--mantine-color-gray-5)}.me_dca7fd8{color:var(--mantine-color-gray-6);font-size:var(--mantine-font-size-sm);font-weight:400}.me_d2eb2177{background:transparent;border:none;border-radius:var(--mantine-radius-sm);padding:calc(var(--mantine-spacing-xs)/2) var(--mantine-spacing-sm);transition:all .15s}.me_d2eb2177:hover{background-color:var(--mantine-color-gray-1)}.me_d2eb2177[data-combobox-selected]{background-color:var(--mantine-color-primary-1);color:var(--mantine-color-primary-7)}.me_b196702{gap:var(--mantine-spacing-sm)}.me_b196702,.me_b6b44e18{align-items:center;display:flex}.me_b6b44e18{color:var(--mantine-color-gray-6);flex-shrink:0;justify-content:center}.me_c95c21c{color:var(--mantine-color-gray-9);font-size:var(--mantine-font-size-sm);font-weight:400}.me_d9b5c915{display:flex;flex-direction:column;gap:calc(var(--mantine-spacing-xs)/2)}.me_88a0d5c6{border-radius:var(--mantine-radius-md);padding:calc(var(--mantine-spacing-xs)/2)}.me_ba15b44d{background:transparent;border:none;border-radius:var(--mantine-radius-sm);padding:calc(var(--mantine-spacing-xs)/2) var(--mantine-spacing-sm);transition:all .15s}.me_ba15b44d:hover{background-color:var(--mantine-color-gray-1)}.me_ba15b44d[data-combobox-selected]{background-color:var(--mantine-color-primary-1);color:var(--mantine-color-primary-7)}.me_2e027dd8{color:var(--mantine-color-gray-9);font-size:var(--mantine-font-size-sm);font-weight:400}.me_c0e05beb{display:flex;flex-direction:column;gap:calc(var(--mantine-spacing-xs)/2)}.me_f06d3053{border-radius:var(--mantine-radius-md);padding:calc(var(--mantine-spacing-xs)/2)}.me_447b7e5f{align-items:center;display:flex;flex-direction:column;gap:var(--mantine-spacing-sm);padding:var(--mantine-spacing-lg) var(--mantine-spacing-md)}.me_c73ad7db{color:var(--mantine-color-gray-5)}.me_c73fe08f{color:var(--mantine-color-gray-6);font-size:var(--mantine-font-size-sm);font-weight:400}.me_f73d5420{background:transparent;border:none;border-radius:var(--mantine-radius-sm);padding:calc(var(--mantine-spacing-xs)/2) var(--mantine-spacing-sm);transition:all .15s}.me_f73d5420:hover{background-color:var(--mantine-color-gray-1)}.me_b2178adb,.me_f73d5420[data-combobox-selected]{background-color:var(--mantine-color-primary-1);color:var(--mantine-color-primary-7)}.me_54f19439{gap:var(--mantine-spacing-sm)}.me_54f19439,.me_7d89a8ae{align-items:center;display:flex}.me_7d89a8ae{background-color:var(--mantine-color-white);border:1px solid var(--mantine-color-gray-4);border-radius:var(--mantine-radius-xs);color:var(--mantine-color-white);flex-shrink:0;height:calc(var(--mantine-spacing-md) - 2px);justify-content:center;transition:all var(--mantine-transition-duration);width:calc(var(--mantine-spacing-md) - 2px)}.me_dec57169{background-color:var(--mantine-color-primary-6);border-color:var(--mantine-color-primary-6)}.me_98eeceb4{color:var(--mantine-color-gray-9);font-size:var(--mantine-font-size-sm);font-weight:400}.me_e7d18146{align-items:center;border-top:1px solid var(--mantine-color-gray-2);display:flex;gap:var(--mantine-spacing-sm);justify-content:space-between;margin-top:calc(var(--mantine-spacing-xs)/2);padding:var(--mantine-spacing-sm)}.me_b52b2793{color:var(--mantine-color-gray-6);font-weight:400}.me_23329375,.me_b52b2793{font-size:var(--mantine-font-size-xs)}.me_23329375{align-items:center;background-color:var(--mantine-color-primary-6);border:none;border-radius:var(--mantine-radius-sm);color:var(--mantine-color-white);cursor:pointer;display:flex;font-weight:500;gap:calc(var(--mantine-spacing-xs)/2);outline:none;padding:calc(var(--mantine-spacing-xs)/2) var(--mantine-spacing-sm);transition:all var(--mantine-transition-duration)}.me_23329375:hover{background-color:var(--mantine-color-primary-7)}.me_fe07fbbe{display:flex;flex-direction:column;gap:calc(var(--mantine-spacing-xs)/2)}.me_53ad7594{color:var(--mantine-color-yellow-5);font-size:var(--mantine-font-size-xs);margin-left:var(--mantine-spacing-xs);margin-top:var(--mantine-spacing-sm)}.me_55847095{flex-shrink:0;gap:2px;white-space:nowrap}.me_1b8832ef,.me_55847095{align-items:center;display:inline-flex}.me_1b8832ef{background-color:var(--mantine-color-gray-1);border:none;border-radius:var(--mantine-radius-sm);cursor:pointer;font-size:var(--mantine-font-size-sm);gap:calc(var(--mantine-spacing-xs)/2);height:24px;line-height:1;padding:calc(var(--mantine-spacing-xs)/2) var(--mantine-spacing-xs);transition:all var(--mantine-transition-duration)}.me_1b8832ef:hover{background-color:var(--mantine-color-gray-2)}.me_b70ebcd{border-bottom-right-radius:0;border-top-right-radius:0}.me_8a849702{cursor:default}.me_8a849702:hover{background-color:var(--mantine-color-gray-1)}.me_79b1bbab{border-radius:0}.me_eec313f6{border-bottom-left-radius:0;border-top-left-radius:0}.me_5efde86e{flex-shrink:0;margin-left:2px}.me_aa94e6fe{align-items:center;color:var(--mantine-color-gray-6);display:flex;flex-shrink:0;justify-content:center}.me_5acd7b18{color:var(--mantine-color-gray-7);font-weight:400}.me_de1e2ceb{font-size:var(--mantine-font-size-xs)}.me_6c86721f{font-size:var(--mantine-font-size-sm)}.me_24fb0a00{color:var(--mantine-color-gray-7);font-weight:400}.me_c2458903{font-size:var(--mantine-font-size-xs)}.me_c6773307{font-size:var(--mantine-font-size-sm)}.me_5b5a8d95{color:var(--mantine-color-gray-9);font-weight:400;max-width:calc(var(--mantine-spacing-xl)*12.5);overflow:hidden;text-overflow:ellipsis}.me_230bc3ce{font-size:var(--mantine-font-size-xs)}.me_13e8f2dc{font-size:var(--mantine-font-size-sm)}.me_9b80753c,.me_dc3a6d7b{align-items:center;display:flex;flex-shrink:0;height:calc(var(--mantine-spacing-md)*1.5)}.me_fed841bd{align-items:center;display:flex;gap:var(--mantine-spacing-xs);margin-left:var(--mantine-spacing-xs);margin-top:var(--mantine-spacing-sm)}.me_755acd29{background:linear-gradient(to bottom right,var(--mantine-color-primary-filled),var(--mantine-color-primary-filled));border:0;border-radius:var(--mantine-radius-md);box-shadow:none;outline:none;padding:calc(var(--mantine-spacing-xs) + 2px);transition:all var(--mantine-transition-duration)}.me_755acd29,.me_755acd29:hover{color:var(--mantine-color-primary-filled)}.me_755acd29:focus{box-shadow:none;outline:none}.me_36f1fa71{color:var(--mantine-color-primary-filled);font-size:var(--mantine-font-size-xs)}}
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import type { FilterDefinition, FilterOperator } from "../../types/filter.types";
3
+ export interface CurrentFieldIndicatorProps {
4
+ field: FilterDefinition;
5
+ operator: FilterOperator | null;
6
+ showValueIndicator?: boolean;
7
+ isCompact?: boolean;
8
+ }
9
+ export declare const CurrentFieldIndicator: React.FC<CurrentFieldIndicatorProps>;
10
+ export default CurrentFieldIndicator;
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ import type { ActiveFilter, FilterAction, FilterHistory, SavedFilterPreset } from "../../types/filter.types";
3
+ export interface FilterActionsMenuProps {
4
+ activeFilters: ActiveFilter[];
5
+ onChange: (filters: ActiveFilter[]) => void;
6
+ isCompactMode: boolean;
7
+ setIsCompactMode: (value: boolean | ((prev: boolean) => boolean)) => void;
8
+ showFilterCount: boolean;
9
+ setShowFilterCount: (value: boolean | ((prev: boolean) => boolean)) => void;
10
+ savedPresets?: SavedFilterPreset[];
11
+ onSavePreset?: () => void;
12
+ onLoadPreset?: (preset: SavedFilterPreset) => void;
13
+ onTogglePresetFavorite?: (presetId: string) => void;
14
+ onDeletePreset?: (presetId: string) => void;
15
+ filterHistory?: FilterHistory[];
16
+ customActions?: FilterAction[];
17
+ disablePresets?: boolean;
18
+ disableHistory?: boolean;
19
+ }
20
+ export declare const FilterActionsMenu: React.FC<FilterActionsMenuProps>;
21
+ export default FilterActionsMenu;
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ export interface FilterMaxReachedProps {
3
+ maxFilters: number;
4
+ }
5
+ export declare const FilterMaxReached: React.FC<FilterMaxReachedProps>;
6
+ export default FilterMaxReached;
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ import type { ActiveFilter } from "../../types/filter.types";
3
+ export interface FilterPillProps {
4
+ filter: ActiveFilter;
5
+ onRemove: (id: string) => void;
6
+ onFieldClick?: (filter: ActiveFilter) => void;
7
+ onOperatorClick?: (filter: ActiveFilter) => void;
8
+ onValueClick?: (filter: ActiveFilter) => void;
9
+ isHighlighted?: boolean;
10
+ isCompact?: boolean;
11
+ }
12
+ export declare const FilterPill: React.FC<FilterPillProps>;
13
+ export default FilterPill;
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ export interface FilterStatusBarProps {
3
+ activeCount: number;
4
+ maxFilters?: number;
5
+ onRefresh: () => void;
6
+ }
7
+ export declare const FilterStatusBar: React.FC<FilterStatusBarProps>;
8
+ export default FilterStatusBar;
@@ -0,0 +1,25 @@
1
+ import React from "react";
2
+ import type { ActiveFilter, FilterAction, MultiFiltersInputProps } from "../../types/filter.types";
3
+ export type FilterOverflowMode = "scroll" | "wrap";
4
+ export interface MultiFiltersInputExtendedProps extends MultiFiltersInputProps {
5
+ /** Custom renderer for filter pills */
6
+ renderPill?: (filter: ActiveFilter, onRemove: () => void) => React.ReactNode;
7
+ /** Disable presets feature */
8
+ disablePresets?: boolean;
9
+ /** Disable history feature */
10
+ disableHistory?: boolean;
11
+ /** Storage key prefix for local storage */
12
+ storageKeyPrefix?: string;
13
+ /** Custom actions for the menu */
14
+ customActions?: FilterAction[];
15
+ /** Overflow mode: "scroll" for horizontal scrolling, "wrap" for line wrapping */
16
+ overflowMode?: FilterOverflowMode;
17
+ /** Custom placeholder for operator selection step */
18
+ operatorPlaceholder?: string;
19
+ /** Custom placeholder for value input step */
20
+ valuePlaceholder?: string;
21
+ /** Custom placeholder for options search step */
22
+ searchPlaceholder?: string;
23
+ }
24
+ export declare const MultiFiltersInput: React.FC<MultiFiltersInputExtendedProps>;
25
+ export default MultiFiltersInput;
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ import type { ActiveFilter, FilterDefinition, FilterInputContextType } from "../../../types/filter.types";
3
+ declare const FilterInputContext: React.Context<FilterInputContextType>;
4
+ export interface FilterProviderProps {
5
+ children: React.ReactNode;
6
+ filters: FilterDefinition[];
7
+ activeFilters: ActiveFilter[];
8
+ onChange: (filters: ActiveFilter[]) => void;
9
+ maxFilters?: number;
10
+ placeholder?: string;
11
+ storageKeyPrefix?: string;
12
+ }
13
+ export declare const FilterProvider: React.FC<FilterProviderProps>;
14
+ export declare const useFilterContext: () => FilterInputContextType;
15
+ export default FilterInputContext;
@@ -0,0 +1,2 @@
1
+ export { FilterProvider, useFilterContext } from "./FilterContext";
2
+ export type { FilterProviderProps } from "./FilterContext";
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import type { FilterDefinition } from "../../../types/filter.types";
3
+ export interface FieldDropdownProps {
4
+ fields: FilterDefinition[];
5
+ totalAvailable: number;
6
+ }
7
+ export declare const FieldDropdown: React.FC<FieldDropdownProps>;
8
+ export default FieldDropdown;
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ import type { FilterDefinition } from "../../../types/filter.types";
3
+ export interface OperatorDropdownProps {
4
+ field: FilterDefinition;
5
+ }
6
+ export declare const OperatorDropdown: React.FC<OperatorDropdownProps>;
7
+ export default OperatorDropdown;
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import type { FilterDefinition, FilterOption } from "../../../types/filter.types";
3
+ export interface ValueDropdownProps {
4
+ field: FilterDefinition;
5
+ options: FilterOption[];
6
+ selectedValues: string[];
7
+ onSubmit: () => void;
8
+ }
9
+ export declare const ValueDropdown: React.FC<ValueDropdownProps>;
10
+ export default ValueDropdown;
@@ -0,0 +1,6 @@
1
+ export { FieldDropdown } from "./FieldDropdown";
2
+ export { OperatorDropdown } from "./OperatorDropdown";
3
+ export { ValueDropdown } from "./ValueDropdown";
4
+ export type { FieldDropdownProps } from "./FieldDropdown";
5
+ export type { OperatorDropdownProps } from "./OperatorDropdown";
6
+ export type { ValueDropdownProps } from "./ValueDropdown";
@@ -0,0 +1,11 @@
1
+ export { MultiFiltersInput as default } from "./MultiFiltersInput";
2
+ export { MultiFiltersInput } from "./MultiFiltersInput";
3
+ export type { MultiFiltersInputExtendedProps } from "./MultiFiltersInput";
4
+ export { FilterPill } from "./FilterPill";
5
+ export { CurrentFieldIndicator } from "./CurrentFieldIndicator";
6
+ export { FilterActionsMenu } from "./FilterActionsMenu";
7
+ export { FilterStatusBar } from "./FilterStatusBar";
8
+ export { FilterMaxReached } from "./FilterMaxReached";
9
+ export * from "./dropdowns";
10
+ export * from "./value-inputs";
11
+ export * from "./context";
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ export interface DateRangeValueInputProps {
3
+ value: [Date | null, Date | null];
4
+ onChange: (range: [Date | null, Date | null]) => void;
5
+ onComplete: (formatted: string, rangeValue: [Date | null, Date | null]) => void;
6
+ }
7
+ export declare const DateRangeValueInput: React.FC<DateRangeValueInputProps>;
8
+ export default DateRangeValueInput;
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ export interface DateValueInputProps {
3
+ value: Date | null;
4
+ onChange: (date: Date | null) => void;
5
+ onComplete: (formatted: string, isoValue: string) => void;
6
+ }
7
+ export declare const DateValueInput: React.FC<DateValueInputProps>;
8
+ export default DateValueInput;
@@ -0,0 +1,4 @@
1
+ export { DateValueInput } from "./DateValueInput";
2
+ export { DateRangeValueInput } from "./DateRangeValueInput";
3
+ export type { DateValueInputProps } from "./DateValueInput";
4
+ export type { DateRangeValueInputProps } from "./DateRangeValueInput";
@@ -0,0 +1,14 @@
1
+ import type { ActiveFilter, FilterHistory } from "../types/filter.types";
2
+ interface UseFilterHistoryOptions {
3
+ storageKey?: string;
4
+ maxHistory?: number;
5
+ enabled?: boolean;
6
+ }
7
+ export declare const useFilterHistory: (activeFilters: ActiveFilter[], options?: UseFilterHistoryOptions) => {
8
+ history: FilterHistory[];
9
+ recentHistory: FilterHistory[];
10
+ clearHistory: () => void;
11
+ removeHistoryItem: (timestamp: number) => void;
12
+ hasHistory: boolean;
13
+ };
14
+ export {};
@@ -0,0 +1,16 @@
1
+ import type { ActiveFilter, SavedFilterPreset } from "../types/filter.types";
2
+ interface UseFilterPresetsOptions {
3
+ storageKey?: string;
4
+ onLoad?: (filters: ActiveFilter[]) => void;
5
+ }
6
+ export declare const useFilterPresets: (options?: UseFilterPresetsOptions) => {
7
+ presets: SavedFilterPreset[];
8
+ sortedPresets: SavedFilterPreset[];
9
+ savePreset: (filters: ActiveFilter[], name?: string) => SavedFilterPreset;
10
+ loadPreset: (preset: SavedFilterPreset) => void;
11
+ toggleFavorite: (presetId: string) => void;
12
+ deletePreset: (presetId: string) => void;
13
+ updatePreset: (presetId: string, updates: Partial<Omit<SavedFilterPreset, "id">>) => void;
14
+ hasPresets: boolean;
15
+ };
16
+ export {};
@@ -0,0 +1,24 @@
1
+ import type { ActiveFilter, FilterDefinition } from "../types/filter.types";
2
+ interface UseFiltersOptions {
3
+ initialFilters?: ActiveFilter[];
4
+ onFiltersChange?: (filters: ActiveFilter[]) => void;
5
+ }
6
+ export declare const useFilters: (filterDefinitions: FilterDefinition[], options?: UseFiltersOptions) => {
7
+ activeFilters: ActiveFilter[];
8
+ setActiveFilters: (newFilters: ActiveFilter[]) => void;
9
+ filterDefinitions: FilterDefinition[];
10
+ addFilter: (filter: Omit<ActiveFilter, "id">) => void;
11
+ removeFilter: (id: string) => void;
12
+ clearFilters: () => void;
13
+ updateFilter: (id: string, updates: Partial<ActiveFilter>) => void;
14
+ getFilterByKey: (key: string) => ActiveFilter;
15
+ hasFilter: (key: string) => boolean;
16
+ toQueryParams: Record<string, string | string[]>;
17
+ toApiFormat: {
18
+ field: string;
19
+ operator: import("../types/filter.types").FilterOperator;
20
+ value: string | [Date, Date] | string[];
21
+ }[];
22
+ filtersCount: number;
23
+ };
24
+ export {};
@@ -0,0 +1,8 @@
1
+ export { default as MultiFiltersInput } from "./components/MultiFiltersInput";
2
+ export { MultiFiltersInput as MultiFiltersInputComponent, FilterPill, CurrentFieldIndicator, FilterActionsMenu, FilterStatusBar, FilterMaxReached, FieldDropdown, OperatorDropdown, ValueDropdown, DateValueInput, DateRangeValueInput, FilterProvider, useFilterContext, } from "./components/MultiFiltersInput";
3
+ export type { FilterOverflowMode, MultiFiltersInputExtendedProps } from "./components/MultiFiltersInput/MultiFiltersInput";
4
+ export { useFilters } from "./hooks/useFilters";
5
+ export { useFilterPresets } from "./hooks/useFilterPresets";
6
+ export { useFilterHistory } from "./hooks/useFilterHistory";
7
+ export * from "./utils";
8
+ export type { ActiveFilter, FilterDefinition, FilterOperator, FilterOption, FilterType, MultiFiltersInputProps, MultiFiltersInputStylesNames, MultiFiltersInputStyles, MultiFiltersInputClassNames, InputStep, SavedFilterPreset, FilterHistory, FilterInputState, FilterInputActions, FilterInputContextType, FilterDropdownConfig, FieldDropdownProps, OperatorDropdownProps, ValueDropdownProps, FilterAction, FilterVariant, } from "./types/filter.types";
@@ -0,0 +1,8 @@
1
+ export { default as MultiFiltersInput } from "./components/MultiFiltersInput";
2
+ export { MultiFiltersInput as MultiFiltersInputComponent, FilterPill, CurrentFieldIndicator, FilterActionsMenu, FilterStatusBar, FilterMaxReached, FieldDropdown, OperatorDropdown, ValueDropdown, DateValueInput, DateRangeValueInput, FilterProvider, useFilterContext, } from "./components/MultiFiltersInput";
3
+ export type { FilterOverflowMode, MultiFiltersInputExtendedProps } from "./components/MultiFiltersInput/MultiFiltersInput";
4
+ export { useFilters } from "./hooks/useFilters";
5
+ export { useFilterPresets } from "./hooks/useFilterPresets";
6
+ export { useFilterHistory } from "./hooks/useFilterHistory";
7
+ export * from "./utils";
8
+ export type { ActiveFilter, FilterDefinition, FilterOperator, FilterOption, FilterType, MultiFiltersInputProps, MultiFiltersInputStylesNames, MultiFiltersInputStyles, MultiFiltersInputClassNames, InputStep, SavedFilterPreset, FilterHistory, FilterInputState, FilterInputActions, FilterInputContextType, FilterDropdownConfig, FieldDropdownProps, OperatorDropdownProps, ValueDropdownProps, FilterAction, FilterVariant, } from "./types/filter.types";
@@ -0,0 +1,165 @@
1
+ import React from "react";
2
+ import type { BoxProps } from "@mantine/core";
3
+ export type FilterType = 'text' | 'date' | 'date_range' | 'email' | 'number' | 'select' | 'multi_select';
4
+ export type FilterOperator = '=' | '!=' | '>' | '<' | '>=' | '<=' | 'contains' | 'starts_with' | 'ends_with' | 'between';
5
+ export interface FilterOption {
6
+ value: string;
7
+ label: string;
8
+ }
9
+ export interface FilterDefinition {
10
+ key: string;
11
+ label: string;
12
+ type: FilterType;
13
+ options?: FilterOption[];
14
+ placeholder?: string;
15
+ operators?: FilterOperator[];
16
+ defaultOperator?: FilterOperator;
17
+ icon?: React.ReactNode;
18
+ }
19
+ export interface ActiveFilter {
20
+ id: string;
21
+ key: string;
22
+ label: string;
23
+ type: FilterType;
24
+ operator: FilterOperator;
25
+ value: string | string[] | [Date | null, Date | null];
26
+ displayValue: string;
27
+ icon?: React.ReactNode;
28
+ }
29
+ export type MultiFiltersInputStylesNames = 'root' | 'container' | 'leftIcon' | 'pillsContainer' | 'input' | 'rightSection' | 'dropdown' | 'badge' | 'clearButton';
30
+ export interface MultiFiltersInputStyles {
31
+ root?: React.CSSProperties;
32
+ container?: React.CSSProperties;
33
+ leftIcon?: React.CSSProperties;
34
+ pillsContainer?: React.CSSProperties;
35
+ input?: React.CSSProperties;
36
+ rightSection?: React.CSSProperties;
37
+ dropdown?: React.CSSProperties;
38
+ badge?: React.CSSProperties;
39
+ clearButton?: React.CSSProperties;
40
+ }
41
+ export interface MultiFiltersInputClassNames {
42
+ root?: string;
43
+ container?: string;
44
+ leftIcon?: string;
45
+ pillsContainer?: string;
46
+ input?: string;
47
+ rightSection?: string;
48
+ dropdown?: string;
49
+ badge?: string;
50
+ clearButton?: string;
51
+ }
52
+ export interface MultiFiltersInputProps extends Omit<BoxProps, 'children'> {
53
+ filters: FilterDefinition[];
54
+ value: ActiveFilter[];
55
+ onChange: (filters: ActiveFilter[]) => void;
56
+ placeholder?: string;
57
+ maxFilters?: number;
58
+ className?: string;
59
+ /** Custom renderer for filter pills */
60
+ renderPill?: (filter: ActiveFilter, onRemove: () => void) => React.ReactNode;
61
+ /** Custom dropdown components */
62
+ customDropdowns?: Partial<FilterDropdownConfig>;
63
+ /** Disable presets feature */
64
+ disablePresets?: boolean;
65
+ /** Disable history feature */
66
+ disableHistory?: boolean;
67
+ /** Storage key prefix for local storage */
68
+ storageKeyPrefix?: string;
69
+ /** Custom actions for the menu */
70
+ customActions?: FilterAction[];
71
+ /** Variants for different UI styles */
72
+ variant?: FilterVariant;
73
+ /** Styles applied to different parts of the component */
74
+ styles?: MultiFiltersInputStyles | ((theme: any) => MultiFiltersInputStyles);
75
+ /** ClassNames applied to different parts of the component */
76
+ classNames?: MultiFiltersInputClassNames;
77
+ }
78
+ export type InputStep = "field" | "operator" | "value";
79
+ export interface SavedFilterPreset {
80
+ id: string;
81
+ name: string;
82
+ filters: ActiveFilter[];
83
+ createdAt: number;
84
+ isFavorite?: boolean;
85
+ }
86
+ export interface FilterHistory {
87
+ filters: ActiveFilter[];
88
+ timestamp: number;
89
+ }
90
+ export interface FilterInputState {
91
+ inputStep: InputStep;
92
+ selectedField: FilterDefinition | null;
93
+ selectedOperator: FilterOperator | null;
94
+ inputValue: string;
95
+ dateValue: Date | null;
96
+ dateRangeValue: [Date | null, Date | null];
97
+ multiSelectValues: string[];
98
+ isFocused: boolean;
99
+ highlightedFilterId: string | null;
100
+ }
101
+ export interface FilterInputActions {
102
+ setInputStep: (step: InputStep) => void;
103
+ setSelectedField: (field: FilterDefinition | null) => void;
104
+ setSelectedOperator: (operator: FilterOperator | null) => void;
105
+ setInputValue: (value: string) => void;
106
+ setDateValue: (date: Date | null) => void;
107
+ setDateRangeValue: (range: [Date | null, Date | null]) => void;
108
+ setMultiSelectValues: React.Dispatch<React.SetStateAction<string[]>>;
109
+ setIsFocused: (focused: boolean) => void;
110
+ setHighlightedFilterId: (id: string | null) => void;
111
+ resetInput: () => void;
112
+ handleFieldSelect: (field: FilterDefinition) => void;
113
+ handleOperatorSelect: (operator: FilterOperator) => void;
114
+ handleValueSubmit: () => void;
115
+ handleOptionSelect: (value: string) => void;
116
+ handleRemoveFilter: (id: string) => void;
117
+ handleClearAll: () => void;
118
+ addFilter: (displayValue: string, rawValue: string | string[] | [Date | null, Date | null]) => void;
119
+ }
120
+ export interface FilterInputContextType extends FilterInputState, FilterInputActions {
121
+ filters: FilterDefinition[];
122
+ activeFilters: ActiveFilter[];
123
+ onChange: (filters: ActiveFilter[]) => void;
124
+ availableFilters: FilterDefinition[];
125
+ filteredFields: FilterDefinition[];
126
+ filteredOptions: FilterOption[];
127
+ isInputDisabled: boolean;
128
+ maxFilters?: number;
129
+ placeholder: string;
130
+ isCompactMode: boolean;
131
+ setIsCompactMode: (value: boolean | ((prev: boolean) => boolean)) => void;
132
+ showFilterCount: boolean;
133
+ setShowFilterCount: (value: boolean | ((prev: boolean) => boolean)) => void;
134
+ }
135
+ export interface FilterDropdownConfig {
136
+ field: React.ComponentType<FieldDropdownProps>;
137
+ operator: React.ComponentType<OperatorDropdownProps>;
138
+ value: React.ComponentType<ValueDropdownProps>;
139
+ }
140
+ export interface FieldDropdownProps {
141
+ fields: FilterDefinition[];
142
+ onSelect: (field: FilterDefinition) => void;
143
+ inputValue: string;
144
+ }
145
+ export interface OperatorDropdownProps {
146
+ field: FilterDefinition;
147
+ onSelect: (operator: FilterOperator) => void;
148
+ }
149
+ export interface ValueDropdownProps {
150
+ field: FilterDefinition;
151
+ operator: FilterOperator;
152
+ options: FilterOption[];
153
+ selectedValues: string[];
154
+ onSelect: (value: string) => void;
155
+ onSubmit: () => void;
156
+ inputValue: string;
157
+ }
158
+ export interface FilterAction {
159
+ id: string;
160
+ label: string;
161
+ icon?: React.ReactNode;
162
+ onClick: () => void;
163
+ disabled?: boolean;
164
+ }
165
+ export type FilterVariant = "default" | "compact" | "minimal" | "bordered";
@@ -0,0 +1,7 @@
1
+ import type { FilterDefinition } from "../types/filter.types";
2
+ import React from "react";
3
+ export declare const generateId: () => string;
4
+ export declare const formatDate: (date: Date | null) => string;
5
+ export declare const formatDateRange: (start: Date | null, end: Date | null) => string;
6
+ export declare const toDate: (val: Date | string | null) => Date | null;
7
+ export declare const getFieldIcon: (type: FilterDefinition["type"], size?: number) => React.ReactNode;
@@ -0,0 +1,2 @@
1
+ export * from "./operators";
2
+ export * from "./formatters";
@@ -0,0 +1,7 @@
1
+ import type { FilterDefinition, FilterOperator } from "../types/filter.types";
2
+ export declare const OPERATOR_LABELS: Record<FilterOperator, string>;
3
+ export declare const OPERATOR_SYMBOLS: Record<FilterOperator, string>;
4
+ export declare const getOperatorLabel: (operator: FilterOperator) => string;
5
+ export declare const getOperatorSymbol: (operator: FilterOperator) => string;
6
+ export declare const getDefaultOperator: (type: FilterDefinition["type"]) => FilterOperator;
7
+ export declare const getOperatorsForField: (field: FilterDefinition) => FilterOperator[];
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "mantine-composite-filters",
3
+ "version": "0.1.0",
4
+ "description": "A powerful composite filters component for Mantine",
5
+ "homepage": "https://github.com/dvlprroshan/mantine-composite-filters#readme",
6
+ "packageManager": "yarn@4.0.1",
7
+ "license": "MIT",
8
+ "author": "Vitaly Rtishchev <rtivital@gmail.com>",
9
+ "keywords": [
10
+ "mantine",
11
+ "filters",
12
+ "composite-filters",
13
+ "react",
14
+ "ui"
15
+ ],
16
+ "main": "./dist/cjs/index.cjs",
17
+ "module": "./dist/esm/index.mjs",
18
+ "types": "./dist/types/index.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "import": {
22
+ "types": "./dist/types/index.d.mts",
23
+ "default": "./dist/esm/index.mjs"
24
+ },
25
+ "require": {
26
+ "types": "./dist/types/index.d.ts",
27
+ "default": "./dist/cjs/index.cjs"
28
+ }
29
+ },
30
+ "./styles.css": "./dist/styles.css",
31
+ "./styles.layer.css": "./dist/styles.layer.css"
32
+ },
33
+ "repository": "https://github.com/dvlprroshan/mantine-composite-filters.git",
34
+ "peerDependencies": {
35
+ "@mantine/core": ">=7.0.0",
36
+ "@mantine/dates": ">=7.0.0",
37
+ "@mantine/hooks": ">=7.0.0",
38
+ "@mantine/notifications": ">=7.0.0",
39
+ "@tabler/icons-react": ">=2.0.0",
40
+ "react": "^18.x || ^19.x",
41
+ "react-dom": "^18.x || ^19.x"
42
+ },
43
+ "bugs": "https://github.com/dvlprroshan/mantine-composite-filters/issues"
44
+ }