@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.
- package/bundle.js +2796 -0
- package/bundle.js.gz +0 -0
- package/controllers/event.controller.d.ts +38 -0
- package/controllers/event.controller.d.ts.map +1 -0
- package/controllers/event.controller.js +68 -0
- package/controllers/event.controller.js.map +1 -0
- package/controllers/index.d.ts +9 -0
- package/controllers/index.d.ts.map +1 -0
- package/controllers/index.js +9 -0
- package/controllers/index.js.map +1 -0
- package/controllers/search.controller.d.ts +34 -0
- package/controllers/search.controller.d.ts.map +1 -0
- package/controllers/search.controller.js +55 -0
- package/controllers/search.controller.js.map +1 -0
- package/controllers/selection.controller.d.ts +27 -0
- package/controllers/selection.controller.d.ts.map +1 -0
- package/controllers/selection.controller.js +39 -0
- package/controllers/selection.controller.js.map +1 -0
- package/icon-picker.component.d.ts +119 -0
- package/icon-picker.component.d.ts.map +1 -0
- package/icon-picker.component.js +337 -0
- package/icon-picker.component.js.map +1 -0
- package/icon-picker.constant.d.ts +15 -0
- package/icon-picker.constant.d.ts.map +1 -0
- package/icon-picker.constant.js +31 -0
- package/icon-picker.constant.js.map +1 -0
- package/icon-picker.style.d.ts +8 -0
- package/icon-picker.style.d.ts.map +1 -0
- package/icon-picker.style.js +216 -0
- package/icon-picker.style.js.map +1 -0
- package/icon-picker.types.d.ts +49 -0
- package/icon-picker.types.d.ts.map +1 -0
- package/icon-picker.types.js +7 -0
- package/icon-picker.types.js.map +1 -0
- package/index.d.ts +9 -0
- package/index.d.ts.map +1 -0
- package/index.js +9 -0
- package/index.js.map +1 -0
- package/interfaces/icon-picker.interface.d.ts +13 -0
- package/interfaces/icon-picker.interface.d.ts.map +1 -0
- package/interfaces/icon-picker.interface.js +7 -0
- package/interfaces/icon-picker.interface.js.map +1 -0
- package/interfaces/index.d.ts +7 -0
- package/interfaces/index.d.ts.map +1 -0
- package/interfaces/index.js +7 -0
- package/interfaces/index.js.map +1 -0
- package/package.json +37 -0
- package/react.d.ts +14 -0
- package/react.d.ts.map +1 -0
- package/react.js +21 -0
- package/react.js.map +1 -0
- package/utils/icon-filter.utils.d.ts +29 -0
- package/utils/icon-filter.utils.d.ts.map +1 -0
- package/utils/icon-filter.utils.js +96 -0
- package/utils/icon-filter.utils.js.map +1 -0
- package/utils/icon-loader.utils.d.ts +39 -0
- package/utils/icon-loader.utils.d.ts.map +1 -0
- package/utils/icon-loader.utils.js +115 -0
- package/utils/icon-loader.utils.js.map +1 -0
- package/utils/index.d.ts +8 -0
- package/utils/index.d.ts.map +1 -0
- package/utils/index.js +8 -0
- package/utils/index.js.map +1 -0
- package/utils/lucide-icons.d.ts +10 -0
- package/utils/lucide-icons.d.ts.map +1 -0
- package/utils/lucide-icons.js +1624 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"]}
|
package/utils/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|