@nuralyui/iconpicker 0.0.1

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 (67) hide show
  1. package/bundle.js +2796 -0
  2. package/bundle.js.gz +0 -0
  3. package/controllers/event.controller.d.ts +38 -0
  4. package/controllers/event.controller.d.ts.map +1 -0
  5. package/controllers/event.controller.js +68 -0
  6. package/controllers/event.controller.js.map +1 -0
  7. package/controllers/index.d.ts +9 -0
  8. package/controllers/index.d.ts.map +1 -0
  9. package/controllers/index.js +9 -0
  10. package/controllers/index.js.map +1 -0
  11. package/controllers/search.controller.d.ts +34 -0
  12. package/controllers/search.controller.d.ts.map +1 -0
  13. package/controllers/search.controller.js +55 -0
  14. package/controllers/search.controller.js.map +1 -0
  15. package/controllers/selection.controller.d.ts +27 -0
  16. package/controllers/selection.controller.d.ts.map +1 -0
  17. package/controllers/selection.controller.js +39 -0
  18. package/controllers/selection.controller.js.map +1 -0
  19. package/icon-picker.component.d.ts +119 -0
  20. package/icon-picker.component.d.ts.map +1 -0
  21. package/icon-picker.component.js +337 -0
  22. package/icon-picker.component.js.map +1 -0
  23. package/icon-picker.constant.d.ts +15 -0
  24. package/icon-picker.constant.d.ts.map +1 -0
  25. package/icon-picker.constant.js +31 -0
  26. package/icon-picker.constant.js.map +1 -0
  27. package/icon-picker.style.d.ts +8 -0
  28. package/icon-picker.style.d.ts.map +1 -0
  29. package/icon-picker.style.js +216 -0
  30. package/icon-picker.style.js.map +1 -0
  31. package/icon-picker.types.d.ts +49 -0
  32. package/icon-picker.types.d.ts.map +1 -0
  33. package/icon-picker.types.js +7 -0
  34. package/icon-picker.types.js.map +1 -0
  35. package/index.d.ts +9 -0
  36. package/index.d.ts.map +1 -0
  37. package/index.js +9 -0
  38. package/index.js.map +1 -0
  39. package/interfaces/icon-picker.interface.d.ts +13 -0
  40. package/interfaces/icon-picker.interface.d.ts.map +1 -0
  41. package/interfaces/icon-picker.interface.js +7 -0
  42. package/interfaces/icon-picker.interface.js.map +1 -0
  43. package/interfaces/index.d.ts +7 -0
  44. package/interfaces/index.d.ts.map +1 -0
  45. package/interfaces/index.js +7 -0
  46. package/interfaces/index.js.map +1 -0
  47. package/package.json +37 -0
  48. package/react.d.ts +14 -0
  49. package/react.d.ts.map +1 -0
  50. package/react.js +21 -0
  51. package/react.js.map +1 -0
  52. package/utils/icon-filter.utils.d.ts +29 -0
  53. package/utils/icon-filter.utils.d.ts.map +1 -0
  54. package/utils/icon-filter.utils.js +96 -0
  55. package/utils/icon-filter.utils.js.map +1 -0
  56. package/utils/icon-loader.utils.d.ts +39 -0
  57. package/utils/icon-loader.utils.d.ts.map +1 -0
  58. package/utils/icon-loader.utils.js +115 -0
  59. package/utils/icon-loader.utils.js.map +1 -0
  60. package/utils/index.d.ts +8 -0
  61. package/utils/index.d.ts.map +1 -0
  62. package/utils/index.js +8 -0
  63. package/utils/index.js.map +1 -0
  64. package/utils/lucide-icons.d.ts +10 -0
  65. package/utils/lucide-icons.d.ts.map +1 -0
  66. package/utils/lucide-icons.js +1624 -0
  67. package/utils/lucide-icons.js.map +1 -0
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export declare const enum IconPickerSize {
7
+ Small = "small",
8
+ Medium = "medium",
9
+ Large = "large"
10
+ }
11
+ export declare const enum IconPickerPlacement {
12
+ Auto = "auto",
13
+ Top = "top",
14
+ Bottom = "bottom",
15
+ TopStart = "top-start",
16
+ TopEnd = "top-end",
17
+ BottomStart = "bottom-start",
18
+ BottomEnd = "bottom-end",
19
+ Left = "left",
20
+ Right = "right"
21
+ }
22
+ export declare const enum IconPickerTrigger {
23
+ Click = "click",
24
+ Hover = "hover",
25
+ Manual = "manual"
26
+ }
27
+ export declare const enum IconType {
28
+ Solid = "solid",
29
+ Regular = "regular",
30
+ Brands = "brands"
31
+ }
32
+ export interface IconPickerIcon {
33
+ name: string;
34
+ type: IconType;
35
+ keywords?: string[];
36
+ category?: string;
37
+ iconName?: string;
38
+ }
39
+ export interface IconPickerSearchOptions {
40
+ caseSensitive?: boolean;
41
+ matchMode?: 'contains' | 'startsWith' | 'exact';
42
+ categories?: string[];
43
+ }
44
+ export interface IconPickerChangeEvent {
45
+ value: string;
46
+ icon: IconPickerIcon | null;
47
+ }
48
+ export declare const EMPTY_STRING = "";
49
+ //# sourceMappingURL=icon-picker.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-picker.types.d.ts","sourceRoot":"","sources":["../../../../src/components/iconpicker/icon-picker.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,0BAAkB,cAAc;IAC9B,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,KAAK,UAAU;CAChB;AAED,0BAAkB,mBAAmB;IACnC,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,QAAQ,cAAc;IACtB,MAAM,YAAY;IAClB,WAAW,iBAAiB;IAC5B,SAAS,eAAe;IACxB,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,0BAAkB,iBAAiB;IACjC,KAAK,UAAU;IACf,KAAK,UAAU;IACf,MAAM,WAAW;CAClB;AAED,0BAAkB,QAAQ;IACxB,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;IAChD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;CAC7B;AAED,eAAO,MAAM,YAAY,KAAK,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export const EMPTY_STRING = '';
7
+ //# sourceMappingURL=icon-picker.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-picker.types.js","sourceRoot":"","sources":["../../../../src/components/iconpicker/icon-picker.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmDH,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nexport const enum IconPickerSize {\n Small = 'small',\n Medium = 'medium',\n Large = 'large'\n}\n\nexport const enum IconPickerPlacement {\n Auto = 'auto',\n Top = 'top',\n Bottom = 'bottom',\n TopStart = 'top-start',\n TopEnd = 'top-end',\n BottomStart = 'bottom-start',\n BottomEnd = 'bottom-end',\n Left = 'left',\n Right = 'right'\n}\n\nexport const enum IconPickerTrigger {\n Click = 'click',\n Hover = 'hover',\n Manual = 'manual'\n}\n\nexport const enum IconType {\n Solid = 'solid',\n Regular = 'regular',\n Brands = 'brands'\n}\n\nexport interface IconPickerIcon {\n name: string;\n type: IconType;\n keywords?: string[];\n category?: string;\n iconName?: string;\n}\n\nexport interface IconPickerSearchOptions {\n caseSensitive?: boolean;\n matchMode?: 'contains' | 'startsWith' | 'exact';\n categories?: string[];\n}\n\nexport interface IconPickerChangeEvent {\n value: string;\n icon: IconPickerIcon | null;\n}\n\nexport const EMPTY_STRING = '';\n"]}
package/index.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export { NrIconPickerElement } from './icon-picker.component.js';
7
+ export * from './icon-picker.types.js';
8
+ export * from './icon-picker.constant.js';
9
+ //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/iconpicker/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC"}
package/index.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export { NrIconPickerElement } from './icon-picker.component.js';
7
+ export * from './icon-picker.types.js';
8
+ export * from './icon-picker.constant.js';
9
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/iconpicker/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nexport { NrIconPickerElement } from './icon-picker.component.js';\nexport * from './icon-picker.types.js';\nexport * from './icon-picker.constant.js';\n"]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import type { IconPickerIcon } from '../icon-picker.types.js';
7
+ export interface IconPickerHost {
8
+ value: string;
9
+ selectedIcon: IconPickerIcon | null;
10
+ handleIconSelect(icon: IconPickerIcon): void;
11
+ requestUpdate(): void;
12
+ }
13
+ //# sourceMappingURL=icon-picker.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-picker.interface.d.ts","sourceRoot":"","sources":["../../../../../src/components/iconpicker/interfaces/icon-picker.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,cAAc,GAAG,IAAI,CAAC;IACpC,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7C,aAAa,IAAI,IAAI,CAAC;CACvB"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=icon-picker.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-picker.interface.js","sourceRoot":"","sources":["../../../../../src/components/iconpicker/interfaces/icon-picker.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport type { IconPickerIcon } from '../icon-picker.types.js';\n\nexport interface IconPickerHost {\n value: string;\n selectedIcon: IconPickerIcon | null;\n handleIconSelect(icon: IconPickerIcon): void;\n requestUpdate(): void;\n}\n"]}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export { IconPickerHost } from './icon-picker.interface.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/iconpicker/interfaces/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/components/iconpicker/interfaces/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nexport { IconPickerHost } from './icon-picker.interface.js';\n"]}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@nuralyui/iconpicker",
3
+ "version": "0.0.1",
4
+ "description": "Icon picker component for Nuraly UI - Select icons from Lucide icon library",
5
+ "main": "index.js",
6
+ "module": "index.js",
7
+ "types": "index.d.ts",
8
+ "type": "module",
9
+ "author": "Nuraly, Laabidi Aymen",
10
+ "license": "MIT",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/Nuralyio/NuralyUI.git",
14
+ "directory": "src/components/iconpicker"
15
+ },
16
+ "keywords": [
17
+ "icon-picker",
18
+ "icon-selector",
19
+ "lucide",
20
+ "lucide-icons",
21
+ "web-components",
22
+ "lit",
23
+ "nuraly-ui"
24
+ ],
25
+ "dependencies": {
26
+ "@nuralyui/common": "workspace:*",
27
+ "@nuralyui/icon": "workspace:*",
28
+ "@nuralyui/input": "workspace:*",
29
+ "@nuralyui/dropdown": "workspace:*",
30
+ "@nuralyui/button": "workspace:*",
31
+ "@lit-labs/virtualizer": "^2.0.0",
32
+ "lit": "^3.0.0"
33
+ },
34
+ "publishConfig": {
35
+ "access": "public"
36
+ }
37
+ }
package/react.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { NrIconPickerElement } from './icon-picker.component.js';
7
+ export declare const NrIconPicker: import("@lit-labs/react").ReactWebComponent<NrIconPickerElement, {
8
+ onChange: string;
9
+ onOpen: string;
10
+ onClose: string;
11
+ onSearch: string;
12
+ onClear: string;
13
+ }>;
14
+ //# sourceMappingURL=react.d.ts.map
package/react.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../../src/components/iconpicker/react.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,eAAO,MAAM,YAAY;;;;;;EAWvB,CAAC"}
package/react.js ADDED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import * as React from 'react';
7
+ import { createComponent } from '@lit-labs/react';
8
+ import { NrIconPickerElement } from './icon-picker.component.js';
9
+ export const NrIconPicker = createComponent({
10
+ tagName: 'nr-icon-picker',
11
+ elementClass: NrIconPickerElement,
12
+ react: React,
13
+ events: {
14
+ onChange: 'nr-icon-picker-change',
15
+ onOpen: 'nr-icon-picker-open',
16
+ onClose: 'nr-icon-picker-close',
17
+ onSearch: 'nr-icon-picker-search',
18
+ onClear: 'nr-icon-picker-clear',
19
+ },
20
+ });
21
+ //# sourceMappingURL=react.js.map
package/react.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../../../src/components/iconpicker/react.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC;IAC1C,OAAO,EAAE,gBAAgB;IACzB,YAAY,EAAE,mBAAmB;IACjC,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE;QACN,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,qBAAqB;QAC7B,OAAO,EAAE,sBAAsB;QAC/B,QAAQ,EAAE,uBAAuB;QACjC,OAAO,EAAE,sBAAsB;KAChC;CACF,CAAC,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport * as React from 'react';\nimport { createComponent } from '@lit-labs/react';\nimport { NrIconPickerElement } from './icon-picker.component.js';\n\nexport const NrIconPicker = createComponent({\n tagName: 'nr-icon-picker',\n elementClass: NrIconPickerElement,\n react: React,\n events: {\n onChange: 'nr-icon-picker-change',\n onOpen: 'nr-icon-picker-open',\n onClose: 'nr-icon-picker-close',\n onSearch: 'nr-icon-picker-search',\n onClear: 'nr-icon-picker-clear',\n },\n});\n"]}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import type { IconPickerIcon, IconPickerSearchOptions } from '../icon-picker.types.js';
7
+ export declare class IconFilterUtils {
8
+ /**
9
+ * Filter icons by search query
10
+ */
11
+ static filterByName(query: string, icons: IconPickerIcon[], options?: IconPickerSearchOptions): IconPickerIcon[];
12
+ /**
13
+ * Filter icons by category
14
+ */
15
+ static filterByCategory(category: string, icons: IconPickerIcon[]): IconPickerIcon[];
16
+ /**
17
+ * Rank search results by relevance
18
+ */
19
+ static rankResults(query: string, icons: IconPickerIcon[]): IconPickerIcon[];
20
+ /**
21
+ * Calculate relevance score for ranking
22
+ */
23
+ private static calculateRelevanceScore;
24
+ /**
25
+ * Combined filter and rank
26
+ */
27
+ static searchAndRank(query: string, icons: IconPickerIcon[], options?: IconPickerSearchOptions): IconPickerIcon[];
28
+ }
29
+ //# sourceMappingURL=icon-filter.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-filter.utils.d.ts","sourceRoot":"","sources":["../../../../../src/components/iconpicker/utils/icon-filter.utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEvF,qBAAa,eAAe;IAC1B;;OAEG;IACH,MAAM,CAAC,YAAY,CACjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,GAAE,uBAA4B,GACpC,cAAc,EAAE;IAuBnB;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE;IAQpF;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE;IAgB5E;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAmCtC;;OAEG;IACH,MAAM,CAAC,aAAa,CAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,GAAE,uBAA4B,GACpC,cAAc,EAAE;CAIpB"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export class IconFilterUtils {
7
+ /**
8
+ * Filter icons by search query
9
+ */
10
+ static filterByName(query, icons, options = {}) {
11
+ if (!query || query.trim() === '') {
12
+ return icons;
13
+ }
14
+ const searchTerm = options.caseSensitive ? query : query.toLowerCase();
15
+ const matchMode = options.matchMode || 'contains';
16
+ return icons.filter(icon => {
17
+ const iconName = options.caseSensitive ? icon.name : icon.name.toLowerCase();
18
+ switch (matchMode) {
19
+ case 'exact':
20
+ return iconName === searchTerm;
21
+ case 'startsWith':
22
+ return iconName.startsWith(searchTerm);
23
+ case 'contains':
24
+ default:
25
+ return iconName.includes(searchTerm);
26
+ }
27
+ });
28
+ }
29
+ /**
30
+ * Filter icons by category
31
+ */
32
+ static filterByCategory(category, icons) {
33
+ if (!category || category === 'all') {
34
+ return icons;
35
+ }
36
+ return icons.filter(icon => icon.category === category);
37
+ }
38
+ /**
39
+ * Rank search results by relevance
40
+ */
41
+ static rankResults(query, icons) {
42
+ if (!query || query.trim() === '') {
43
+ return icons;
44
+ }
45
+ const searchTerm = query.toLowerCase();
46
+ return icons
47
+ .map(icon => ({
48
+ icon,
49
+ score: this.calculateRelevanceScore(searchTerm, icon)
50
+ }))
51
+ .sort((a, b) => b.score - a.score)
52
+ .map(item => item.icon);
53
+ }
54
+ /**
55
+ * Calculate relevance score for ranking
56
+ */
57
+ static calculateRelevanceScore(query, icon) {
58
+ const iconName = icon.name.toLowerCase();
59
+ let score = 0;
60
+ // Exact match gets highest score
61
+ if (iconName === query) {
62
+ score += 100;
63
+ }
64
+ // Starts with query gets high score
65
+ else if (iconName.startsWith(query)) {
66
+ score += 50;
67
+ }
68
+ // Contains query gets medium score
69
+ else if (iconName.includes(query)) {
70
+ score += 25;
71
+ }
72
+ // Keyword matches
73
+ if (icon.keywords) {
74
+ icon.keywords.forEach(keyword => {
75
+ const keywordLower = keyword.toLowerCase();
76
+ if (keywordLower === query) {
77
+ score += 30;
78
+ }
79
+ else if (keywordLower.includes(query)) {
80
+ score += 10;
81
+ }
82
+ });
83
+ }
84
+ // Penalize longer names (shorter names are often more relevant)
85
+ score -= iconName.length * 0.1;
86
+ return score;
87
+ }
88
+ /**
89
+ * Combined filter and rank
90
+ */
91
+ static searchAndRank(query, icons, options = {}) {
92
+ const filtered = this.filterByName(query, icons, options);
93
+ return this.rankResults(query, filtered);
94
+ }
95
+ }
96
+ //# sourceMappingURL=icon-filter.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-filter.utils.js","sourceRoot":"","sources":["../../../../../src/components/iconpicker/utils/icon-filter.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport type { IconPickerIcon, IconPickerSearchOptions } from '../icon-picker.types.js';\n\nexport class IconFilterUtils {\n /**\n * Filter icons by search query\n */\n static filterByName(\n query: string,\n icons: IconPickerIcon[],\n options: IconPickerSearchOptions = {}\n ): IconPickerIcon[] {\n if (!query || query.trim() === '') {\n return icons;\n }\n\n const searchTerm = options.caseSensitive ? query : query.toLowerCase();\n const matchMode = options.matchMode || 'contains';\n\n return icons.filter(icon => {\n const iconName = options.caseSensitive ? icon.name : icon.name.toLowerCase();\n\n switch (matchMode) {\n case 'exact':\n return iconName === searchTerm;\n case 'startsWith':\n return iconName.startsWith(searchTerm);\n case 'contains':\n default:\n return iconName.includes(searchTerm);\n }\n });\n }\n\n /**\n * Filter icons by category\n */\n static filterByCategory(category: string, icons: IconPickerIcon[]): IconPickerIcon[] {\n if (!category || category === 'all') {\n return icons;\n }\n\n return icons.filter(icon => icon.category === category);\n }\n\n /**\n * Rank search results by relevance\n */\n static rankResults(query: string, icons: IconPickerIcon[]): IconPickerIcon[] {\n if (!query || query.trim() === '') {\n return icons;\n }\n\n const searchTerm = query.toLowerCase();\n\n return icons\n .map(icon => ({\n icon,\n score: this.calculateRelevanceScore(searchTerm, icon)\n }))\n .sort((a, b) => b.score - a.score)\n .map(item => item.icon);\n }\n\n /**\n * Calculate relevance score for ranking\n */\n private static calculateRelevanceScore(query: string, icon: IconPickerIcon): number {\n const iconName = icon.name.toLowerCase();\n let score = 0;\n\n // Exact match gets highest score\n if (iconName === query) {\n score += 100;\n }\n // Starts with query gets high score\n else if (iconName.startsWith(query)) {\n score += 50;\n }\n // Contains query gets medium score\n else if (iconName.includes(query)) {\n score += 25;\n }\n\n // Keyword matches\n if (icon.keywords) {\n icon.keywords.forEach(keyword => {\n const keywordLower = keyword.toLowerCase();\n if (keywordLower === query) {\n score += 30;\n } else if (keywordLower.includes(query)) {\n score += 10;\n }\n });\n }\n\n // Penalize longer names (shorter names are often more relevant)\n score -= iconName.length * 0.1;\n\n return score;\n }\n\n /**\n * Combined filter and rank\n */\n static searchAndRank(\n query: string,\n icons: IconPickerIcon[],\n options: IconPickerSearchOptions = {}\n ): IconPickerIcon[] {\n const filtered = this.filterByName(query, icons, options);\n return this.rankResults(query, filtered);\n }\n}\n"]}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import type { IconPickerIcon } from '../icon-picker.types.js';
7
+ import { IconType } from '../icon-picker.types.js';
8
+ export declare class IconLoaderUtils {
9
+ private static iconCache;
10
+ /**
11
+ * Load icons from Lucide library
12
+ */
13
+ static loadIcons(types?: IconType[]): IconPickerIcon[];
14
+ /**
15
+ * Load icons of specific type
16
+ */
17
+ private static loadIconsByType;
18
+ /**
19
+ * Extract icon data from Lucide icon names
20
+ */
21
+ private static extractLucideIcons;
22
+ /**
23
+ * Generate keywords from icon name for better searchability
24
+ */
25
+ private static generateKeywords;
26
+ /**
27
+ * Categorize icon based on name patterns
28
+ */
29
+ private static categorizeIcon;
30
+ /**
31
+ * Get unique icon names (removes duplicates)
32
+ */
33
+ static getUniqueIcons(icons: IconPickerIcon[]): IconPickerIcon[];
34
+ /**
35
+ * Clear icon cache
36
+ */
37
+ static clearCache(): void;
38
+ }
39
+ //# sourceMappingURL=icon-loader.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-loader.utils.d.ts","sourceRoot":"","sources":["../../../../../src/components/iconpicker/utils/icon-loader.utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGnD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,SAAS,CAA8C;IAEtE;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,GAAE,QAAQ,EAAqB,GAAG,cAAc,EAAE;IAgBxE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAK9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAUjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAY/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAqC7B;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE;IAWhE;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,IAAI;CAG1B"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { lucideIcons } from './lucide-icons.js';
7
+ export class IconLoaderUtils {
8
+ /**
9
+ * Load icons from Lucide library
10
+ */
11
+ static loadIcons(types = ["solid" /* IconType.Solid */]) {
12
+ const allIcons = [];
13
+ types.forEach(type => {
14
+ if (this.iconCache.has(type)) {
15
+ allIcons.push(...this.iconCache.get(type));
16
+ }
17
+ else {
18
+ const icons = this.loadIconsByType(type);
19
+ this.iconCache.set(type, icons);
20
+ allIcons.push(...icons);
21
+ }
22
+ });
23
+ return allIcons;
24
+ }
25
+ /**
26
+ * Load icons of specific type
27
+ */
28
+ static loadIconsByType(type) {
29
+ // Lucide icons are all one style, so we use Solid type
30
+ return this.extractLucideIcons(type);
31
+ }
32
+ /**
33
+ * Extract icon data from Lucide icon names
34
+ */
35
+ static extractLucideIcons(type) {
36
+ return lucideIcons.map((iconName) => ({
37
+ name: iconName,
38
+ type,
39
+ iconName,
40
+ keywords: this.generateKeywords(iconName),
41
+ category: this.categorizeIcon(iconName)
42
+ }));
43
+ }
44
+ /**
45
+ * Generate keywords from icon name for better searchability
46
+ */
47
+ static generateKeywords(iconName) {
48
+ // Split camelCase or kebab-case into words
49
+ const words = iconName
50
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
51
+ .replace(/-/g, ' ')
52
+ .toLowerCase()
53
+ .split(' ')
54
+ .filter(Boolean);
55
+ return [...new Set(words)];
56
+ }
57
+ /**
58
+ * Categorize icon based on name patterns
59
+ */
60
+ static categorizeIcon(iconName) {
61
+ const name = iconName.toLowerCase();
62
+ if (name.includes('arrow') || name.includes('chevron') || name.includes('corner') || name.includes('move')) {
63
+ return 'arrow';
64
+ }
65
+ if (name.includes('mail') || name.includes('message') || name.includes('phone') || name.includes('chat')) {
66
+ return 'communication';
67
+ }
68
+ if (name.includes('file') || name.includes('document') || name.includes('folder')) {
69
+ return 'file';
70
+ }
71
+ if (name.includes('menu') || name.includes('grid') || name.includes('layout') || name.includes('panel')) {
72
+ return 'interface';
73
+ }
74
+ if (name.includes('video') || name.includes('audio') || name.includes('play') || name.includes('music')) {
75
+ return 'media';
76
+ }
77
+ if (name.includes('facebook') || name.includes('twitter') || name.includes('linkedin') || name.includes('github')) {
78
+ return 'social';
79
+ }
80
+ if (name.includes('text') || name.includes('type') || name.includes('font')) {
81
+ return 'text';
82
+ }
83
+ if (name.includes('briefcase') || name.includes('building') || name.includes('calendar') || name.includes('chart')) {
84
+ return 'business';
85
+ }
86
+ if (name.includes('pen') || name.includes('brush') || name.includes('palette') || name.includes('edit')) {
87
+ return 'design';
88
+ }
89
+ if (name.includes('circle') || name.includes('square') || name.includes('triangle') || name.includes('hexagon')) {
90
+ return 'shapes';
91
+ }
92
+ return 'all';
93
+ }
94
+ /**
95
+ * Get unique icon names (removes duplicates)
96
+ */
97
+ static getUniqueIcons(icons) {
98
+ const seen = new Set();
99
+ return icons.filter(icon => {
100
+ if (seen.has(icon.name)) {
101
+ return false;
102
+ }
103
+ seen.add(icon.name);
104
+ return true;
105
+ });
106
+ }
107
+ /**
108
+ * Clear icon cache
109
+ */
110
+ static clearCache() {
111
+ this.iconCache.clear();
112
+ }
113
+ }
114
+ IconLoaderUtils.iconCache = new Map();
115
+ //# sourceMappingURL=icon-loader.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-loader.utils.js","sourceRoot":"","sources":["../../../../../src/components/iconpicker/utils/icon-loader.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport type { IconPickerIcon } from '../icon-picker.types.js';\nimport { IconType } from '../icon-picker.types.js';\nimport { lucideIcons } from './lucide-icons.js';\n\nexport class IconLoaderUtils {\n private static iconCache: Map<IconType, IconPickerIcon[]> = new Map();\n\n /**\n * Load icons from Lucide library\n */\n static loadIcons(types: IconType[] = [IconType.Solid]): IconPickerIcon[] {\n const allIcons: IconPickerIcon[] = [];\n\n types.forEach(type => {\n if (this.iconCache.has(type)) {\n allIcons.push(...this.iconCache.get(type)!);\n } else {\n const icons = this.loadIconsByType(type);\n this.iconCache.set(type, icons);\n allIcons.push(...icons);\n }\n });\n\n return allIcons;\n }\n\n /**\n * Load icons of specific type\n */\n private static loadIconsByType(type: IconType): IconPickerIcon[] {\n // Lucide icons are all one style, so we use Solid type\n return this.extractLucideIcons(type);\n }\n\n /**\n * Extract icon data from Lucide icon names\n */\n private static extractLucideIcons(type: IconType): IconPickerIcon[] {\n return lucideIcons.map((iconName: string) => ({\n name: iconName,\n type,\n iconName,\n keywords: this.generateKeywords(iconName),\n category: this.categorizeIcon(iconName)\n }));\n }\n\n /**\n * Generate keywords from icon name for better searchability\n */\n private static generateKeywords(iconName: string): string[] {\n // Split camelCase or kebab-case into words\n const words = iconName\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/-/g, ' ')\n .toLowerCase()\n .split(' ')\n .filter(Boolean);\n \n return [...new Set(words)];\n }\n\n /**\n * Categorize icon based on name patterns\n */\n private static categorizeIcon(iconName: string): string {\n const name = iconName.toLowerCase();\n \n if (name.includes('arrow') || name.includes('chevron') || name.includes('corner') || name.includes('move')) {\n return 'arrow';\n }\n if (name.includes('mail') || name.includes('message') || name.includes('phone') || name.includes('chat')) {\n return 'communication';\n }\n if (name.includes('file') || name.includes('document') || name.includes('folder')) {\n return 'file';\n }\n if (name.includes('menu') || name.includes('grid') || name.includes('layout') || name.includes('panel')) {\n return 'interface';\n }\n if (name.includes('video') || name.includes('audio') || name.includes('play') || name.includes('music')) {\n return 'media';\n }\n if (name.includes('facebook') || name.includes('twitter') || name.includes('linkedin') || name.includes('github')) {\n return 'social';\n }\n if (name.includes('text') || name.includes('type') || name.includes('font')) {\n return 'text';\n }\n if (name.includes('briefcase') || name.includes('building') || name.includes('calendar') || name.includes('chart')) {\n return 'business';\n }\n if (name.includes('pen') || name.includes('brush') || name.includes('palette') || name.includes('edit')) {\n return 'design';\n }\n if (name.includes('circle') || name.includes('square') || name.includes('triangle') || name.includes('hexagon')) {\n return 'shapes';\n }\n \n return 'all';\n }\n\n /**\n * Get unique icon names (removes duplicates)\n */\n static getUniqueIcons(icons: IconPickerIcon[]): IconPickerIcon[] {\n const seen = new Set<string>();\n return icons.filter(icon => {\n if (seen.has(icon.name)) {\n return false;\n }\n seen.add(icon.name);\n return true;\n });\n }\n\n /**\n * Clear icon cache\n */\n static clearCache(): void {\n this.iconCache.clear();\n }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export { IconLoaderUtils } from './icon-loader.utils.js';
7
+ export { IconFilterUtils } from './icon-filter.utils.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/iconpicker/utils/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
package/utils/index.js ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export { IconLoaderUtils } from './icon-loader.utils.js';
7
+ export { IconFilterUtils } from './icon-filter.utils.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/components/iconpicker/utils/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nexport { IconLoaderUtils } from './icon-loader.utils.js';\nexport { IconFilterUtils } from './icon-filter.utils.js';\n"]}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2023 Nuraly, Laabidi Aymen
4
+ * SPDX-License-Identifier: MIT
5
+ *
6
+ * Lucide icon names from https://lucide.dev/
7
+ * Updated: 2025-11-11
8
+ */
9
+ export declare const lucideIcons: string[];
10
+ //# sourceMappingURL=lucide-icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lucide-icons.d.ts","sourceRoot":"","sources":["../../../../../src/components/iconpicker/utils/lucide-icons.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,WAAW,EAAE,MAAM,EA8kD/B,CAAC"}