@dubium/icons 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/README.md +0 -0
- package/dist/collection/UserIcon.d.ts +12 -0
- package/dist/collection/UserIcon.js +19 -0
- package/dist/collection/index.d.ts +7 -0
- package/dist/collection/types.d.ts +11 -0
- package/dist/spa/icon/Icon.create.d.ts +40 -0
- package/dist/spa/icon/Icon.create.js +9 -0
- package/dist/spa/icon/Icon.d.ts +57 -0
- package/dist/spa/icon/Icon.js +64 -0
- package/dist/spa/icon/Icon.registry.d.ts +36 -0
- package/dist/spa/icon/Icon.registry.js +4 -0
- package/dist/spa/icon/Icon.types.d.ts +79 -0
- package/dist/spa/icon/index.d.ts +9 -0
- package/dist/spa/index.d.ts +8 -0
- package/dist/spa/index.js +5 -0
- package/dist/spa/provider/IconProvider.context.d.ts +32 -0
- package/dist/spa/provider/IconProvider.context.js +5 -0
- package/dist/spa/provider/IconProvider.d.ts +34 -0
- package/dist/spa/provider/IconProvider.js +13 -0
- package/dist/spa/provider/IconProvider.types.d.ts +28 -0
- package/dist/spa/provider/index.d.ts +8 -0
- package/dist/ssr/icon/Icon.create.d.ts +56 -0
- package/dist/ssr/icon/Icon.create.js +9 -0
- package/dist/ssr/icon/Icon.d.ts +33 -0
- package/dist/ssr/icon/Icon.js +31 -0
- package/dist/ssr/icon/Icon.types.d.ts +90 -0
- package/dist/ssr/icon/index.d.ts +9 -0
- package/dist/ssr/index.d.ts +8 -0
- package/dist/ssr/index.js +5 -0
- package/dist/ssr/provider/IconProvider.context.d.ts +7 -0
- package/dist/ssr/provider/IconProvider.context.js +5 -0
- package/dist/ssr/provider/IconProvider.d.ts +33 -0
- package/dist/ssr/provider/IconProvider.js +16 -0
- package/dist/ssr/provider/IconProvider.types.d.ts +13 -0
- package/dist/ssr/provider/index.d.ts +8 -0
- package/dist/ssr/provider/useIconRegistry.d.ts +18 -0
- package/dist/ssr/provider/useIconRegistry.js +6 -0
- package/package.json +54 -0
package/README.md
ADDED
|
File without changes
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IIconComponentProps } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Иконка.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* свойство `color` из {@link IIconComponentProps}.
|
|
7
|
+
*
|
|
8
|
+
* @param props - Свойства компонента иконки.
|
|
9
|
+
* @returns SVG-элемент иконки.
|
|
10
|
+
*/
|
|
11
|
+
declare const UserIcon: ({ color, ...props }: IIconComponentProps) => import("react").JSX.Element;
|
|
12
|
+
export default UserIcon;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
+
//#region src/icons/collection/UserIcon.tsx
|
|
3
|
+
var t = ({ color: t = "currentColor", ...n }) => /* @__PURE__ */ e("svg", {
|
|
4
|
+
fill: "none",
|
|
5
|
+
height: "100%",
|
|
6
|
+
viewBox: "0 0 24 24",
|
|
7
|
+
width: "100%",
|
|
8
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
9
|
+
...n,
|
|
10
|
+
children: /* @__PURE__ */ e("path", {
|
|
11
|
+
d: "M6 21V19C6 17.9391 6.42143 16.9217 7.17157 16.1716C7.92172 15.4214 8.93913 15 10 15H14C15.0609 15 16.0783 15.4214 16.8284 16.1716C17.5786 16.9217 18 17.9391 18 19V21M8 7C8 8.06087 8.42143 9.07828 9.17157 9.82843C9.92172 10.5786 10.9391 11 12 11C13.0609 11 14.0783 10.5786 14.8284 9.82843C15.5786 9.07828 16 8.06087 16 7C16 5.93913 15.5786 4.92172 14.8284 4.17157C14.0783 3.42143 13.0609 3 12 3C10.9391 3 9.92172 3.42143 9.17157 4.17157C8.42143 4.92172 8 5.93913 8 7Z",
|
|
12
|
+
stroke: t,
|
|
13
|
+
strokeLinecap: "round",
|
|
14
|
+
strokeLinejoin: "round",
|
|
15
|
+
strokeWidth: "2"
|
|
16
|
+
})
|
|
17
|
+
});
|
|
18
|
+
//#endregion
|
|
19
|
+
export { t as default };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SVGProps } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Базовые пропсы для SVG-иконки.
|
|
4
|
+
*
|
|
5
|
+
* Расширяет стандартные SVG-атрибуты и добавляет поддержку цвета.
|
|
6
|
+
*
|
|
7
|
+
* @property color - Цвет заливки иконки (обычно прокидывается в `fill`)
|
|
8
|
+
*/
|
|
9
|
+
export interface IIconComponentProps extends SVGProps<SVGSVGElement> {
|
|
10
|
+
color?: string;
|
|
11
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { TEmptyIconRegistry, TIconRegistry } from "./Icon.types.js";
|
|
2
|
+
import { type IconProps } from "./Icon.js";
|
|
3
|
+
/**
|
|
4
|
+
* Создаёт типизированную обёртку над компонентом `Icon`
|
|
5
|
+
* с поддержкой автодополнения (autocomplete) для кастомных иконок.
|
|
6
|
+
*
|
|
7
|
+
* @typeParam TCustomIcons - Реестр кастомных иконок (обычно `typeof appIcons`)
|
|
8
|
+
*
|
|
9
|
+
* @returns Компонент иконки с типобезопасным пропом `name`,
|
|
10
|
+
* включающим как встроенные (`defaultIcons`), так и кастомные иконки.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const appIcons = {
|
|
15
|
+
* User: () => import("./UserIcon"),
|
|
16
|
+
* Settings: () => import("./SettingsIcon"),
|
|
17
|
+
* } as const;
|
|
18
|
+
*
|
|
19
|
+
* type TAppIcons = typeof appIcons;
|
|
20
|
+
*
|
|
21
|
+
* const AppIcon = createIcon<TAppIcons>();
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* ```tsx
|
|
25
|
+
* <IconProvider icons={appIcons}>
|
|
26
|
+
* <AppIcon name="User" /> // ✅ autocomplete
|
|
27
|
+
* <AppIcon name="Close" /> // ✅ из UIKit
|
|
28
|
+
* <AppIcon name="Wrong" /> // ❌ ошибка TypeScript
|
|
29
|
+
* </IconProvider>
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @remarks
|
|
33
|
+
* - Требует использования `IconProvider` для передачи реестра иконок в runtime
|
|
34
|
+
* - Без `IconProvider` кастомные иконки не будут найдены
|
|
35
|
+
* - Используется для улучшения DX (type safety + autocomplete)
|
|
36
|
+
*/
|
|
37
|
+
export declare const createIcon: <TCustomIcons extends TIconRegistry = TEmptyIconRegistry>() => {
|
|
38
|
+
(props: IconProps<TCustomIcons>): import("react").JSX.Element;
|
|
39
|
+
displayName: string;
|
|
40
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Icon as e } from "./Icon.js";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
//#region src/icons/spa/icon/Icon.create.tsx
|
|
4
|
+
var n = () => {
|
|
5
|
+
let n = (n) => /* @__PURE__ */ t(e, { ...n });
|
|
6
|
+
return n.displayName = "TypedIcon", n;
|
|
7
|
+
};
|
|
8
|
+
//#endregion
|
|
9
|
+
export { n as createIcon };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type MemoExoticComponent } from "react";
|
|
2
|
+
import type { TEmptyIconRegistry, TIconName, TIconRegistry } from "./Icon.types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Свойства компонента иконки
|
|
5
|
+
*/
|
|
6
|
+
export interface IconProps<TCustomIcons extends TIconRegistry = TEmptyIconRegistry> {
|
|
7
|
+
/**
|
|
8
|
+
* Атрибут aria-label
|
|
9
|
+
*/
|
|
10
|
+
ariaLabel?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Цвет иконки
|
|
13
|
+
*/
|
|
14
|
+
color?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Угол поворота
|
|
17
|
+
*/
|
|
18
|
+
deg?: number;
|
|
19
|
+
/**
|
|
20
|
+
* Высота (если нужен прямоугольник)
|
|
21
|
+
*/
|
|
22
|
+
height?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Имя иконки
|
|
25
|
+
*/
|
|
26
|
+
name: TIconName<TCustomIcons>;
|
|
27
|
+
/**
|
|
28
|
+
* Обработчик клика
|
|
29
|
+
*/
|
|
30
|
+
onClick?: VoidFunction;
|
|
31
|
+
/**
|
|
32
|
+
* Приоритетный размер (квадратный)
|
|
33
|
+
*/
|
|
34
|
+
size?: number;
|
|
35
|
+
/**
|
|
36
|
+
* Ширина (если нужен прямоугольник)
|
|
37
|
+
*/
|
|
38
|
+
width?: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Компонент иконки, который динамически загружает SVG иконки по имени.
|
|
42
|
+
*
|
|
43
|
+
* @param props - Свойства компонента иконки
|
|
44
|
+
* @param props.name - Имя иконки для отображения
|
|
45
|
+
* @param props.size - Размер иконки в пикселях (по умолчанию 24)
|
|
46
|
+
* @param props.color - Цвет иконки (по умолчанию "currentColor")
|
|
47
|
+
* @param props.deg - Угол поворота иконки в градусах (по умолчанию 0)
|
|
48
|
+
* @param props.onClick - Обработчик клика по иконке
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* <Icon name="Arrow" size={32} color="blue" deg={90} />
|
|
52
|
+
*
|
|
53
|
+
* @returns React-элемент иконки
|
|
54
|
+
*/
|
|
55
|
+
declare const IconComponentBase: <TCustomIcons extends TIconRegistry = TEmptyIconRegistry>({ name, size, width: propWidth, height: propHeight, color, deg, onClick: handleOnClick, ariaLabel, }: IconProps<TCustomIcons>) => import("react").JSX.Element;
|
|
56
|
+
declare const MemoizedIcon: MemoExoticComponent<typeof IconComponentBase> & typeof IconComponentBase;
|
|
57
|
+
export { MemoizedIcon as Icon };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { useIconContext as e } from "../provider/IconProvider.context.js";
|
|
2
|
+
import { defaultIcons as t } from "./Icon.registry.js";
|
|
3
|
+
import { memo as n, useEffect as r, useMemo as i, useState as a } from "react";
|
|
4
|
+
import { jsx as o } from "react/jsx-runtime";
|
|
5
|
+
//#region src/icons/spa/icon/Icon.tsx
|
|
6
|
+
var s = /* @__PURE__ */ new Map(), c = n(({ name: n, size: c = 24, width: l, height: u, color: d = "currentColor", deg: f = 0, onClick: p, ariaLabel: m }) => {
|
|
7
|
+
let { icons: h } = e(), g = i(() => ({
|
|
8
|
+
...t,
|
|
9
|
+
...h
|
|
10
|
+
}), [h]), [_, v] = a(() => s.get(n) || null), [y, b] = a(!1), x = l ?? c, S = u ?? c, C = i(() => ({
|
|
11
|
+
display: "inline-flex",
|
|
12
|
+
alignItems: "center",
|
|
13
|
+
justifyContent: "center",
|
|
14
|
+
width: x,
|
|
15
|
+
height: S,
|
|
16
|
+
transform: `rotate(${f}deg)`
|
|
17
|
+
}), [
|
|
18
|
+
x,
|
|
19
|
+
S,
|
|
20
|
+
f
|
|
21
|
+
]);
|
|
22
|
+
return r(() => {
|
|
23
|
+
let e = !1;
|
|
24
|
+
return (async () => {
|
|
25
|
+
let t = String(n), r = s.get(t);
|
|
26
|
+
if (r) {
|
|
27
|
+
v(() => r);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
let i = g[n];
|
|
31
|
+
if (!i) {
|
|
32
|
+
console.warn(`Иконка "${t}" не найдена`), v(() => null);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
b(!0), v(() => null), i().then((n) => {
|
|
36
|
+
if (e) return;
|
|
37
|
+
let r = n.default;
|
|
38
|
+
s.set(t, r), v(() => r);
|
|
39
|
+
}).catch((n) => {
|
|
40
|
+
e || (console.error(`Ошибка загрузки иконки "${t}":`, n), v(() => null));
|
|
41
|
+
}).finally(() => {
|
|
42
|
+
e || b(!1);
|
|
43
|
+
});
|
|
44
|
+
})(), () => {
|
|
45
|
+
e = !0;
|
|
46
|
+
};
|
|
47
|
+
}, [n, g]), y || !_ ? /* @__PURE__ */ o("div", {
|
|
48
|
+
"aria-hidden": "true",
|
|
49
|
+
role: "img",
|
|
50
|
+
style: {
|
|
51
|
+
...C,
|
|
52
|
+
visibility: "hidden"
|
|
53
|
+
}
|
|
54
|
+
}) : /* @__PURE__ */ o("div", {
|
|
55
|
+
"aria-label": m || n,
|
|
56
|
+
onClick: p,
|
|
57
|
+
role: "img",
|
|
58
|
+
style: C,
|
|
59
|
+
children: _ ? /* @__PURE__ */ o(_, { color: d }) : null
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
c.displayName = "Icon";
|
|
63
|
+
//#endregion
|
|
64
|
+
export { c as Icon };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Реестр встроенных иконок.
|
|
3
|
+
*
|
|
4
|
+
* Каждая иконка описывается как функция-лоадер с динамическим `import()`,
|
|
5
|
+
* что позволяет:
|
|
6
|
+
* - выполнять code-splitting (tree shaking)
|
|
7
|
+
* - загружать иконки по требованию (lazy loading)
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const defaultIcons = {
|
|
12
|
+
* Close: () => import("../../icons/CloseIcon"),
|
|
13
|
+
* };
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @remarks
|
|
17
|
+
* - Используется внутри компонента `Icon` как базовый источник иконок
|
|
18
|
+
* - Может быть расширен пользовательскими иконками через `IconProvider`
|
|
19
|
+
* - Не требует `IconProvider` для работы
|
|
20
|
+
*/
|
|
21
|
+
export declare const defaultIcons: {
|
|
22
|
+
readonly Close: () => Promise<typeof import("../../collection/UserIcon.js")>;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Объединение имён всех встроенных иконок.
|
|
26
|
+
*
|
|
27
|
+
* Используется для:
|
|
28
|
+
* - типизации пропа `name` в `Icon`
|
|
29
|
+
* - автодополнения (autocomplete) для встроенных иконок
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* type TDefaultIconName = "Close";
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export type TDefaultIconName = keyof typeof defaultIcons;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { ComponentType, SVGProps } from "react";
|
|
2
|
+
import type { TDefaultIconName } from "./Icon.registry.js";
|
|
3
|
+
/**
|
|
4
|
+
* Тип "пустого" реестра иконок.
|
|
5
|
+
*
|
|
6
|
+
* Используется как значение по умолчанию в generic-параметрах,
|
|
7
|
+
* чтобы избежать использования `{}` (который допускает любые значения).
|
|
8
|
+
*
|
|
9
|
+
* @remarks
|
|
10
|
+
* Обеспечивает корректную типизацию без ослабления type safety.
|
|
11
|
+
*/
|
|
12
|
+
export type TEmptyIconRegistry = Record<string, never>;
|
|
13
|
+
/**
|
|
14
|
+
* Базовые пропсы для SVG-иконки.
|
|
15
|
+
*
|
|
16
|
+
* Расширяет стандартные SVG-атрибуты и добавляет поддержку цвета.
|
|
17
|
+
*
|
|
18
|
+
* @property color - Цвет заливки иконки (обычно прокидывается в `fill`)
|
|
19
|
+
*/
|
|
20
|
+
export interface IIconComponentProps extends SVGProps<SVGSVGElement> {
|
|
21
|
+
color?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Тип React-компонента иконки.
|
|
25
|
+
*
|
|
26
|
+
* Каждая иконка должна быть функциональным компонентом,
|
|
27
|
+
* принимающим `IIconComponentProps`.
|
|
28
|
+
*/
|
|
29
|
+
export type TIcon = ComponentType<IIconComponentProps>;
|
|
30
|
+
/**
|
|
31
|
+
* Тип модуля, возвращаемого через динамический `import()`.
|
|
32
|
+
*
|
|
33
|
+
* @property default - React-компонент иконки
|
|
34
|
+
*/
|
|
35
|
+
export type TIconModule = {
|
|
36
|
+
default: TIcon;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Тип функции-лоадера иконки.
|
|
40
|
+
*
|
|
41
|
+
* Используется для lazy loading (code splitting) через `import()`.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* const loader: TIconLoader = () => import("./CloseIcon");
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export type TIconLoader = () => Promise<TIconModule>;
|
|
49
|
+
/**
|
|
50
|
+
* Реестр иконок.
|
|
51
|
+
*
|
|
52
|
+
* Представляет собой словарь, где:
|
|
53
|
+
* - ключ — имя иконки
|
|
54
|
+
* - значение — функция загрузки (lazy import)
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* const icons: TIconRegistry = {
|
|
59
|
+
* Close: () => import("./CloseIcon"),
|
|
60
|
+
* };
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export type TIconRegistry = Readonly<Record<string, TIconLoader>>;
|
|
64
|
+
/**
|
|
65
|
+
* Тип допустимых имён иконок.
|
|
66
|
+
*
|
|
67
|
+
* Объединяет:
|
|
68
|
+
* - встроенные иконки (`TDefaultIconName`)
|
|
69
|
+
* - кастомные иконки (`TCustomIcons`)
|
|
70
|
+
*
|
|
71
|
+
* @typeParam TCustomIcons - Реестр кастомных иконок
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```ts
|
|
75
|
+
* type Name = TIconName<typeof appIcons>;
|
|
76
|
+
* // "Close" | "User" | "Settings"
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export type TIconName<TCustomIcons extends TIconRegistry = TEmptyIconRegistry> = Extract<keyof TCustomIcons, string> | TDefaultIconName;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Публичный API модуля иконок для SPA (клиентский рендеринг).
|
|
3
|
+
*
|
|
4
|
+
* Экспортирует компонент `Icon`, фабрику `createIcon` и связанные типы
|
|
5
|
+
* с поддержкой ленивой загрузки иконок через динамический `import()`.
|
|
6
|
+
*/
|
|
7
|
+
export { Icon, type IconProps } from "./Icon.js";
|
|
8
|
+
export { createIcon } from "./Icon.create.js";
|
|
9
|
+
export type { IIconComponentProps, TEmptyIconRegistry, TIcon, TIconLoader, TIconModule, TIconName, TIconRegistry, } from "./Icon.types.js";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Публичный API пакета иконок для SPA (клиентский рендеринг).
|
|
3
|
+
*
|
|
4
|
+
* Позволяет лениво загружать иконки через динамический `import()`
|
|
5
|
+
* с поддержкой code-splitting.
|
|
6
|
+
*/
|
|
7
|
+
export { IconProvider, useIconContext, type IIconContextValue, type IIconProviderProps } from "./provider/index.js";
|
|
8
|
+
export { Icon, createIcon, type IconProps, type IIconComponentProps, type TEmptyIconRegistry, type TIcon, type TIconLoader, type TIconModule, type TIconName, type TIconRegistry, } from "./icon/index.js";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { useIconContext as e } from "./provider/IconProvider.context.js";
|
|
2
|
+
import { IconProvider as t } from "./provider/IconProvider.js";
|
|
3
|
+
import { Icon as n } from "./icon/Icon.js";
|
|
4
|
+
import { createIcon as r } from "./icon/Icon.create.js";
|
|
5
|
+
export { n as Icon, t as IconProvider, r as createIcon, e as useIconContext };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { TEmptyIconRegistry, TIconRegistry } from "../icon/index.ts";
|
|
2
|
+
import type { IIconContextValue } from "./IconProvider.types.ts";
|
|
3
|
+
/**
|
|
4
|
+
* React-контекст для хранения реестра иконок.
|
|
5
|
+
*
|
|
6
|
+
* Используется компонентами `Icon` / `AppIcon` для получения кастомных иконок,
|
|
7
|
+
* переданных через `IconProvider`.
|
|
8
|
+
*
|
|
9
|
+
* @remarks
|
|
10
|
+
* - Значение по умолчанию содержит пустой реестр (`icons: {}`)
|
|
11
|
+
* - Без `IconProvider` будут доступны только встроенные (`defaultIcons`) иконки
|
|
12
|
+
*/
|
|
13
|
+
export declare const IconContext: import("react").Context<IIconContextValue<Readonly<Record<string, import("../index.ts").TIconLoader>>>>;
|
|
14
|
+
/**
|
|
15
|
+
* Хук для доступа к `IconContext` с поддержкой типизации кастомных иконок.
|
|
16
|
+
*
|
|
17
|
+
* @typeParam TCustomIcons - Тип реестра кастомных иконок
|
|
18
|
+
*
|
|
19
|
+
* @returns Значение контекста с типизированным полем `icons`
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* const { icons } = useIconContext<typeof appIcons>();
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @remarks
|
|
27
|
+
* - Выполняет приведение типа (`type assertion`), так как TypeScript
|
|
28
|
+
* не может автоматически вывести тип из `IconProvider`
|
|
29
|
+
* - Используется внутри `Icon` для объединения:
|
|
30
|
+
* `{ ...defaultIcons, ...icons }`
|
|
31
|
+
*/
|
|
32
|
+
export declare const useIconContext: <TCustomIcons extends TIconRegistry = TEmptyIconRegistry>() => IIconContextValue<TCustomIcons>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { TEmptyIconRegistry, TIconRegistry } from "../icon/index.ts";
|
|
2
|
+
import type { IIconProviderProps } from "./IconProvider.types.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Провайдер контекста UI-библиотеки (`IconProvider`).
|
|
5
|
+
*
|
|
6
|
+
* Обеспечивает передачу реестра кастомных иконок вниз по дереву компонентов,
|
|
7
|
+
* чтобы они могли быть использованы в `Icon` / `AppIcon`.
|
|
8
|
+
*
|
|
9
|
+
* @typeParam TCustomIcons - Тип реестра кастомных иконок (обычно `typeof appIcons`)
|
|
10
|
+
*
|
|
11
|
+
* @param props - Свойства провайдера
|
|
12
|
+
* @param props.children - Дочерние React-элементы
|
|
13
|
+
* @param props.icons - Реестр кастомных иконок (lazy loaders)
|
|
14
|
+
*
|
|
15
|
+
* @returns Провайдер контекста с доступом к иконкам
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* const appIcons = {
|
|
20
|
+
* User: () => import("./UserIcon"),
|
|
21
|
+
* } as const;
|
|
22
|
+
*
|
|
23
|
+
* <IconProvider icons={appIcons}>
|
|
24
|
+
* <App />
|
|
25
|
+
* </IconProvider>
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @remarks
|
|
29
|
+
* - Не обязателен для использования встроенных (`defaultIcons`) иконок
|
|
30
|
+
* - Обязателен для работы кастомных иконок
|
|
31
|
+
* - Использует `useMemo` для предотвращения лишних перерисовок
|
|
32
|
+
* - Если `icons` не передан, используется пустой реестр
|
|
33
|
+
*/
|
|
34
|
+
export declare const IconProvider: <TCustomIcons extends TIconRegistry = TEmptyIconRegistry>({ children, icons, }: IIconProviderProps<TCustomIcons>) => import("react").JSX.Element;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IconContext as e } from "./IconProvider.context.js";
|
|
2
|
+
import { useMemo as t } from "react";
|
|
3
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
4
|
+
//#region src/icons/spa/provider/IconProvider.tsx
|
|
5
|
+
var r = ({ children: r, icons: i }) => {
|
|
6
|
+
let a = t(() => ({ icons: i ?? {} }), [i]);
|
|
7
|
+
return /* @__PURE__ */ n(e.Provider, {
|
|
8
|
+
value: a,
|
|
9
|
+
children: r
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { r as IconProvider };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { TEmptyIconRegistry, TIconRegistry } from "../icon/index.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Значение, хранящееся в React-контексте `IconContext`.
|
|
5
|
+
*
|
|
6
|
+
* @template TCustomIcons - Тип реестра кастомных иконок (расширяет `TIconRegistry`)
|
|
7
|
+
*/
|
|
8
|
+
export interface IIconContextValue<TCustomIcons extends TIconRegistry = TEmptyIconRegistry> {
|
|
9
|
+
/**
|
|
10
|
+
* Реестр кастомных иконок (ленивые загрузчики)
|
|
11
|
+
*/
|
|
12
|
+
icons: TCustomIcons;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Свойства компонента `IconProvider`.
|
|
16
|
+
*
|
|
17
|
+
* @template TCustomIcons - Тип реестра кастомных иконок (расширяет `TIconRegistry`)
|
|
18
|
+
*/
|
|
19
|
+
export interface IIconProviderProps<TCustomIcons extends TIconRegistry = TEmptyIconRegistry> {
|
|
20
|
+
/**
|
|
21
|
+
* Дочерние React-элементы, которые получат доступ к контексту
|
|
22
|
+
*/
|
|
23
|
+
children: ReactNode;
|
|
24
|
+
/**
|
|
25
|
+
* Реестр кастомных иконок (опционально, по умолчанию пустой объект)
|
|
26
|
+
*/
|
|
27
|
+
icons?: TCustomIcons;
|
|
28
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Публичный API модуля провайдера иконок для SPA (клиентский рендеринг).
|
|
3
|
+
*
|
|
4
|
+
* Экспортирует `IconProvider`, хук `useIconContext` и связанные типы.
|
|
5
|
+
*/
|
|
6
|
+
export { IconProvider } from "./IconProvider.js";
|
|
7
|
+
export { useIconContext } from "./IconProvider.context.js";
|
|
8
|
+
export type { IIconContextValue, IIconProviderProps } from "./IconProvider.types.js";
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { IconProps, TIconRegistry } from "./Icon.types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Создаёт типизированную обёртку над компонентом `Icon`
|
|
4
|
+
* с поддержкой автодополнения (autocomplete) для кастомных иконок.
|
|
5
|
+
*
|
|
6
|
+
* @typeParam TIcons - Реестр иконок (обычно `typeof appIcons`)
|
|
7
|
+
*
|
|
8
|
+
* @returns Компонент иконки с типобезопасным пропом `name`,
|
|
9
|
+
* включающим все иконки из переданного реестра.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* const appIcons = defineIcons({
|
|
14
|
+
* User: UserIcon,
|
|
15
|
+
* Settings: SettingsIcon,
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* const AppIcon = createIcon<typeof appIcons>();
|
|
19
|
+
*
|
|
20
|
+
* <IconProvider icons={appIcons}>
|
|
21
|
+
* <AppIcon name="User" /> // ✅ autocomplete
|
|
22
|
+
* <AppIcon name="Wrong" /> // ❌ ошибка TypeScript
|
|
23
|
+
* </IconProvider>
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @remarks
|
|
27
|
+
* - В отличие от SPA-версии, иконки передаются синхронно (без `import()`)
|
|
28
|
+
* - Требует использования `IconProvider` для передачи реестра иконок в runtime
|
|
29
|
+
*/
|
|
30
|
+
export declare const createIcon: <TIcons extends TIconRegistry>() => {
|
|
31
|
+
(props: IconProps<TIcons>): import("react").JSX.Element;
|
|
32
|
+
displayName: string;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Помогает вывести точный тип реестра иконок для серверного рендеринга.
|
|
36
|
+
*
|
|
37
|
+
* Используется вместе с `createIcon`, чтобы TypeScript сохранил
|
|
38
|
+
* конкретные имена иконок в типе вместо общего `string`.
|
|
39
|
+
*
|
|
40
|
+
* @typeParam TIcons - Реестр иконок (выводится автоматически)
|
|
41
|
+
*
|
|
42
|
+
* @param icons - Реестр иконок с синхронными React-компонентами
|
|
43
|
+
*
|
|
44
|
+
* @returns Тот же реестр иконок с неизменённым (точным) типом
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* const appIcons = defineIcons({
|
|
49
|
+
* User: UserIcon,
|
|
50
|
+
* Close: CloseIcon,
|
|
51
|
+
* });
|
|
52
|
+
*
|
|
53
|
+
* // typeof appIcons → { User: typeof UserIcon; Close: typeof CloseIcon }
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare const defineIcons: <const TIcons extends TIconRegistry>(icons: TIcons) => TIcons;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Icon as e } from "./Icon.js";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
//#region src/icons/ssr/icon/Icon.create.tsx
|
|
4
|
+
var n = () => {
|
|
5
|
+
let n = (n) => /* @__PURE__ */ t(e, { ...n });
|
|
6
|
+
return n.displayName = "SSRIcon", n;
|
|
7
|
+
}, r = (e) => e;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { n as createIcon, r as defineIcons };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { IconProps, TIconRegistry } from "./Icon.types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Компонент иконки для серверного рендеринга (SSR).
|
|
4
|
+
*
|
|
5
|
+
* Иконка загружается синхронно из реестра, переданного через `IconProvider`,
|
|
6
|
+
* без динамических импортов, что корректно работает на сервере.
|
|
7
|
+
*
|
|
8
|
+
* @typeParam TIcons - Тип реестра иконок
|
|
9
|
+
*
|
|
10
|
+
* @param props - Свойства компонента иконки
|
|
11
|
+
* @param props.name - Имя иконки для отображения
|
|
12
|
+
* @param props.size - Размер иконки в пикселях (по умолчанию 24)
|
|
13
|
+
* @param props.width - Ширина иконки (если нужен прямоугольник)
|
|
14
|
+
* @param props.height - Высота иконки (если нужен прямоугольник)
|
|
15
|
+
* @param props.color - Цвет иконки (по умолчанию "currentColor")
|
|
16
|
+
* @param props.deg - Угол поворота иконки в градусах (по умолчанию 0)
|
|
17
|
+
* @param props.onClick - Обработчик клика по иконке
|
|
18
|
+
* @param props.ariaLabel - Атрибут `aria-label` для доступности
|
|
19
|
+
* @param props.style - Дополнительные CSS-стили контейнера
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* <Icon name="Arrow" size={32} color="blue" deg={90} />
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @remarks
|
|
27
|
+
* - Если иконка не найдена в реестре, выводится предупреждение и `null`
|
|
28
|
+
* - Контейнер рендерится как `<span>` с `inline-flex` для центрирования
|
|
29
|
+
* - При указании `ariaLabel` контейнер становится видимым для скринридера (`role="img"`)
|
|
30
|
+
*
|
|
31
|
+
* @returns React-элемент иконки
|
|
32
|
+
*/
|
|
33
|
+
export declare const Icon: <TIcons extends TIconRegistry = TIconRegistry>({ name, size, width, height, color, deg, onClick, ariaLabel, style, }: IconProps<TIcons>) => import("react").JSX.Element | null;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { useIconRegistry as e } from "../provider/useIconRegistry.js";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
//#region src/icons/ssr/icon/Icon.tsx
|
|
4
|
+
var n = ({ name: n, size: r = 24, width: i, height: a, color: o = "currentColor", deg: s = 0, onClick: c, ariaLabel: l, style: u }) => {
|
|
5
|
+
let d = e()[String(n)];
|
|
6
|
+
if (!d) return console.warn(`Иконка "${String(n)}" не найдена`), null;
|
|
7
|
+
let f = {
|
|
8
|
+
display: "inline-flex",
|
|
9
|
+
alignItems: "center",
|
|
10
|
+
justifyContent: "center",
|
|
11
|
+
flex: "0 0 auto",
|
|
12
|
+
width: i ?? r,
|
|
13
|
+
height: a ?? r,
|
|
14
|
+
transform: `rotate(${s}deg)`,
|
|
15
|
+
...u
|
|
16
|
+
};
|
|
17
|
+
return /* @__PURE__ */ t("span", {
|
|
18
|
+
"aria-hidden": !l || void 0,
|
|
19
|
+
"aria-label": l,
|
|
20
|
+
onClick: c,
|
|
21
|
+
role: l ? "img" : void 0,
|
|
22
|
+
style: f,
|
|
23
|
+
children: /* @__PURE__ */ t(d, {
|
|
24
|
+
"aria-hidden": "true",
|
|
25
|
+
color: o,
|
|
26
|
+
focusable: "false"
|
|
27
|
+
})
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
//#endregion
|
|
31
|
+
export { n as Icon };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { ComponentType, CSSProperties, MouseEventHandler, SVGProps } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Базовые пропсы для SVG-иконки.
|
|
4
|
+
*
|
|
5
|
+
* Расширяет стандартные SVG-атрибуты и добавляет поддержку цвета.
|
|
6
|
+
*
|
|
7
|
+
* @property color - Цвет заливки иконки (обычно прокидывается в `fill`)
|
|
8
|
+
*/
|
|
9
|
+
export interface IIconComponentProps extends SVGProps<SVGSVGElement> {
|
|
10
|
+
color?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Тип React-компонента иконки.
|
|
14
|
+
*
|
|
15
|
+
* Каждая иконка должна быть функциональным компонентом,
|
|
16
|
+
* принимающим `IIconComponentProps`.
|
|
17
|
+
*/
|
|
18
|
+
export type TIcon = ComponentType<IIconComponentProps>;
|
|
19
|
+
/**
|
|
20
|
+
* Реестр иконок для серверного рендеринга (SSR).
|
|
21
|
+
*
|
|
22
|
+
* В отличие от SPA-версии, здесь иконки хранятся как уже готовые
|
|
23
|
+
* React-компоненты (синхронно), а не как функции-лоадеры с `import()`.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* const icons: TIconRegistry = {
|
|
28
|
+
* Close: CloseIcon,
|
|
29
|
+
* User: UserIcon,
|
|
30
|
+
* };
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export type TIconRegistry = Readonly<Record<string, TIcon>>;
|
|
34
|
+
/**
|
|
35
|
+
* Тип допустимых имён иконок.
|
|
36
|
+
*
|
|
37
|
+
* Ограничивает проп `name` в `Icon` строго ключами переданного реестра.
|
|
38
|
+
*
|
|
39
|
+
* @typeParam TIcons - Реестр иконок
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* type Name = TIconName<typeof appIcons>;
|
|
44
|
+
* // "Close" | "User"
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export type TIconName<TIcons extends TIconRegistry = TIconRegistry> = Extract<keyof TIcons, string>;
|
|
48
|
+
/**
|
|
49
|
+
* Свойства компонента иконки для серверного рендеринга (SSR).
|
|
50
|
+
*
|
|
51
|
+
* @template TIcons - Тип реестра иконок
|
|
52
|
+
*/
|
|
53
|
+
export interface IconProps<TIcons extends TIconRegistry = TIconRegistry> {
|
|
54
|
+
/**
|
|
55
|
+
* Атрибут aria-label (делает иконку доступной для скринридера)
|
|
56
|
+
*/
|
|
57
|
+
ariaLabel?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Цвет иконки
|
|
60
|
+
*/
|
|
61
|
+
color?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Угол поворота в градусах
|
|
64
|
+
*/
|
|
65
|
+
deg?: number;
|
|
66
|
+
/**
|
|
67
|
+
* Высота (если нужен прямоугольник)
|
|
68
|
+
*/
|
|
69
|
+
height?: number | string;
|
|
70
|
+
/**
|
|
71
|
+
* Имя иконки
|
|
72
|
+
*/
|
|
73
|
+
name: TIconName<TIcons>;
|
|
74
|
+
/**
|
|
75
|
+
* Обработчик клика по контейнеру иконки
|
|
76
|
+
*/
|
|
77
|
+
onClick?: MouseEventHandler<HTMLSpanElement>;
|
|
78
|
+
/**
|
|
79
|
+
* Приоритетный размер (квадратный)
|
|
80
|
+
*/
|
|
81
|
+
size?: number | string;
|
|
82
|
+
/**
|
|
83
|
+
* Дополнительные CSS-стили контейнера
|
|
84
|
+
*/
|
|
85
|
+
style?: CSSProperties;
|
|
86
|
+
/**
|
|
87
|
+
* Ширина (если нужен прямоугольник)
|
|
88
|
+
*/
|
|
89
|
+
width?: number | string;
|
|
90
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Публичный API модуля иконок для серверного рендеринга (SSR).
|
|
3
|
+
*
|
|
4
|
+
* Экспортирует компонент `Icon`, фабрику `createIcon`, хелпер `defineIcons`
|
|
5
|
+
* и связанные типы.
|
|
6
|
+
*/
|
|
7
|
+
export { Icon } from "./Icon.js";
|
|
8
|
+
export { createIcon, defineIcons } from "./Icon.create.js";
|
|
9
|
+
export type { IIconComponentProps, TIcon, TIconRegistry, IconProps, TIconName } from "./Icon.types.js";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Публичный API пакета иконок для серверного рендеринга (SSR).
|
|
3
|
+
*
|
|
4
|
+
* Позволяет отображать иконки синхронно на сервере и клиенте
|
|
5
|
+
* без динамических импортов.
|
|
6
|
+
*/
|
|
7
|
+
export { Icon, createIcon, defineIcons, type IconProps, type IIconComponentProps, type TIcon, type TIconName, type TIconRegistry, } from "./icon/index.js";
|
|
8
|
+
export { IconProvider, useIconRegistry, type IIconProviderProps } from "./provider/index.js";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { useIconRegistry as e } from "./provider/useIconRegistry.js";
|
|
2
|
+
import { Icon as t } from "./icon/Icon.js";
|
|
3
|
+
import { createIcon as n, defineIcons as r } from "./icon/Icon.create.js";
|
|
4
|
+
import { IconProvider as i } from "./provider/IconProvider.js";
|
|
5
|
+
export { t as Icon, i as IconProvider, n as createIcon, r as defineIcons, e as useIconRegistry };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React-контекст для хранения реестра иконок при серверном рендеринге (SSR).
|
|
3
|
+
*
|
|
4
|
+
* Значение по умолчанию — пустой реестр. Фактический реестр иконок
|
|
5
|
+
* передаётся через `IconProvider`.
|
|
6
|
+
*/
|
|
7
|
+
export declare const IconRegistryContext: import("react").Context<Readonly<Record<string, import("../index.js").TIcon>>>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { TIconRegistry } from "../icon/Icon.types.js";
|
|
2
|
+
import type { IIconProviderProps } from "./IconProvider.types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Провайдер реестра иконок для серверного рендеринга (SSR).
|
|
5
|
+
*
|
|
6
|
+
* Передаёт реестр синхронных иконок вниз по дереву компонентов
|
|
7
|
+
* через `IconRegistryContext`, объединяя его с родительским реестром.
|
|
8
|
+
*
|
|
9
|
+
* @typeParam TIcons - Тип реестра иконок
|
|
10
|
+
*
|
|
11
|
+
* @param props - Свойства провайдера
|
|
12
|
+
* @param props.children - Дочерние React-элементы
|
|
13
|
+
* @param props.icons - Реестр иконок (синхронные React-компоненты)
|
|
14
|
+
*
|
|
15
|
+
* @returns Провайдер контекста с доступом к иконкам
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* const appIcons = defineIcons({
|
|
20
|
+
* User: UserIcon,
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* <IconProvider icons={appIcons}>
|
|
24
|
+
* <App />
|
|
25
|
+
* </IconProvider>
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @remarks
|
|
29
|
+
* - Позволяет вкладывать провайдеры: дочерний реестр наследует родительский
|
|
30
|
+
* - При совпадении имён иконки дочернего провайдера переопределяют родительские
|
|
31
|
+
* - Использует `useMemo` для предотвращения лишних перерисовок
|
|
32
|
+
*/
|
|
33
|
+
export declare const IconProvider: <TIcons extends TIconRegistry>({ children, icons }: IIconProviderProps<TIcons>) => import("react").JSX.Element;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { IconRegistryContext as e } from "./IconProvider.context.js";
|
|
2
|
+
import { useContext as t, useMemo as n } from "react";
|
|
3
|
+
import { jsx as r } from "react/jsx-runtime";
|
|
4
|
+
//#region src/icons/ssr/provider/IconProvider.tsx
|
|
5
|
+
var i = ({ children: i, icons: a }) => {
|
|
6
|
+
let o = t(e), s = n(() => ({
|
|
7
|
+
...o,
|
|
8
|
+
...a
|
|
9
|
+
}), [o, a]);
|
|
10
|
+
return /* @__PURE__ */ r(e, {
|
|
11
|
+
value: s,
|
|
12
|
+
children: i
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
//#endregion
|
|
16
|
+
export { i as IconProvider };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { TIconRegistry } from "../icon/Icon.types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Свойства компонента `IconProvider` для серверного рендеринга (SSR).
|
|
5
|
+
*
|
|
6
|
+
* @template TIcons - Тип реестра иконок
|
|
7
|
+
*/
|
|
8
|
+
export interface IIconProviderProps<TIcons extends TIconRegistry = TIconRegistry> {
|
|
9
|
+
/** Дочерние React-элементы, которые получат доступ к реестру иконок */
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
/** Реестр иконок (синхронные React-компоненты) */
|
|
12
|
+
icons: TIcons;
|
|
13
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Публичный API модуля провайдера иконок для серверного рендеринга (SSR).
|
|
3
|
+
*
|
|
4
|
+
* Экспортирует `IconProvider`, хук `useIconRegistry` и связанные типы.
|
|
5
|
+
*/
|
|
6
|
+
export { IconProvider } from "./IconProvider.js";
|
|
7
|
+
export { useIconRegistry } from "./useIconRegistry.js";
|
|
8
|
+
export type { IIconProviderProps } from "./IconProvider.types.js";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { TIconRegistry } from "../icon/Icon.types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Хук для доступа к реестру иконок при серверном рендеринге (SSR).
|
|
4
|
+
*
|
|
5
|
+
* Возвращает текущий реестр иконок из `IconRegistryContext`.
|
|
6
|
+
*
|
|
7
|
+
* @returns Реестр иконок, переданный через `IconProvider`
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const registry = useIconRegistry();
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @remarks
|
|
15
|
+
* - Без `IconProvider` вернёт пустой реестр `{}`
|
|
16
|
+
* - Используется внутри компонента `Icon` для поиска иконки по имени
|
|
17
|
+
*/
|
|
18
|
+
export declare const useIconRegistry: () => TIconRegistry;
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dubium/icons",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"private": false,
|
|
5
|
+
"files": [
|
|
6
|
+
"dist"
|
|
7
|
+
],
|
|
8
|
+
"type": "module",
|
|
9
|
+
"sideEffects": false,
|
|
10
|
+
"exports": {
|
|
11
|
+
"./spa": {
|
|
12
|
+
"types": "./dist/spa/index.d.ts",
|
|
13
|
+
"import": "./dist/spa/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./ssr": {
|
|
16
|
+
"types": "./dist/ssr/index.d.ts",
|
|
17
|
+
"import": "./dist/ssr/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./icons": {
|
|
20
|
+
"types": "./dist/collection/index.d.ts",
|
|
21
|
+
"import": "./dist/collection/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./icons/*": {
|
|
24
|
+
"types": "./dist/collection/*Icon.d.ts",
|
|
25
|
+
"import": "./dist/collection/*Icon.js"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"dev": "vite",
|
|
30
|
+
"build": "vite build && tsc -p tsconfig.build.json",
|
|
31
|
+
"lint": "oxlint",
|
|
32
|
+
"lint:fix": "oxlint --fix",
|
|
33
|
+
"format": "oxfmt",
|
|
34
|
+
"format:check": "oxfmt --check",
|
|
35
|
+
"check": "npm run lint && npm run format:check && npm run typecheck",
|
|
36
|
+
"preview": "vite preview"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/node": "^24.13.3",
|
|
40
|
+
"@types/react": "^19.2.18",
|
|
41
|
+
"@types/react-dom": "^19.2.4",
|
|
42
|
+
"@vitejs/plugin-react": "^6.0.5",
|
|
43
|
+
"oxfmt": "^0.63.0",
|
|
44
|
+
"oxlint": "^1.78.0",
|
|
45
|
+
"oxlint-tsgolint": "^7.0.2001",
|
|
46
|
+
"rollup-plugin-visualizer": "^7.0.1",
|
|
47
|
+
"typescript": "~7.0.2",
|
|
48
|
+
"vite": "^8.2.1"
|
|
49
|
+
},
|
|
50
|
+
"peerDependencies": {
|
|
51
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
52
|
+
"react-dom": "^18.0.0 || ^19.0.0"
|
|
53
|
+
}
|
|
54
|
+
}
|