@elcrm/components 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Avatar.d.ts +30 -2
- package/dist/Badge.d.ts +11 -2
- package/dist/Block.d.ts +9 -2
- package/dist/Brand.d.ts +18 -2
- package/dist/Card.d.ts +7 -2
- package/dist/Column.d.ts +8 -2
- package/dist/EmptyState.d.ts +13 -2
- package/dist/Footer.d.ts +6 -2
- package/dist/Header.css +1 -1
- package/dist/Header.d.ts +13 -2
- package/dist/Item.d.ts +19 -2
- package/dist/Layout.css +1 -1
- package/dist/Layout.d.ts +10 -2
- package/dist/List.d.ts +8 -2
- package/dist/Loading.d.ts +6 -2
- package/dist/Menu.css +1 -1
- package/dist/Menu.d.ts +22 -2
- package/dist/NavSections.d.ts +37 -2
- package/dist/Row.d.ts +8 -2
- package/dist/Section.d.ts +29 -2
- package/dist/TabSections.d.ts +31 -2
- package/dist/index.css +3 -3
- package/package.json +14 -3
package/dist/Avatar.d.ts
CHANGED
|
@@ -1,2 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Инициалы из имени: «Иван Петров» → «ИП», «admin» → «AD».
|
|
4
|
+
*/
|
|
5
|
+
export declare function initialsFromName(name: string): string;
|
|
6
|
+
type Common = {
|
|
7
|
+
/** URL картинки; если нет — инициалы из `name` / `children` */
|
|
8
|
+
src?: string;
|
|
9
|
+
alt?: string;
|
|
10
|
+
/** Имя для инициалов и aria-label по умолчанию */
|
|
11
|
+
name?: string;
|
|
12
|
+
size?: "s" | "m" | "l";
|
|
13
|
+
/** Подсветка (например активный пункт шапки) */
|
|
14
|
+
active?: boolean;
|
|
15
|
+
children?: React.ReactNode;
|
|
16
|
+
className?: string;
|
|
17
|
+
};
|
|
18
|
+
export type AvatarProps = (Common & React.ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
19
|
+
as?: "button";
|
|
20
|
+
}) | (Common & React.HTMLAttributes<HTMLSpanElement> & {
|
|
21
|
+
as: "span";
|
|
22
|
+
}) | (Common & React.HTMLAttributes<HTMLDivElement> & {
|
|
23
|
+
as: "div";
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* Аватар: фото или инициалы.
|
|
27
|
+
* Токены: --avatar-*
|
|
28
|
+
*/
|
|
29
|
+
export declare function Avatar(props: AvatarProps): React.JSX.Element;
|
|
30
|
+
export {};
|
package/dist/Badge.d.ts
CHANGED
|
@@ -1,2 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type BadgeProps = React.HTMLAttributes<HTMLSpanElement> & {
|
|
3
|
+
/** Визуальный тон */
|
|
4
|
+
tone?: "neutral" | "accent" | "success" | "warning" | "danger";
|
|
5
|
+
children?: React.ReactNode;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Компактная метка / статус.
|
|
9
|
+
* Токены: --badge-*
|
|
10
|
+
*/
|
|
11
|
+
export declare function Badge({ tone, children, className, ...rest }: BadgeProps): React.JSX.Element;
|
package/dist/Block.d.ts
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type BlockProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
3
|
+
row?: boolean;
|
|
4
|
+
/** Отступ между детьми: число (px) или CSS-строка */
|
|
5
|
+
gap?: number | string;
|
|
6
|
+
children?: React.ReactNode;
|
|
7
|
+
};
|
|
8
|
+
/** Блок-стек (колонка или ряд). Токены: --block-* */
|
|
9
|
+
export declare function Block({ row, gap, children, className, style, ...rest }: BlockProps): React.JSX.Element;
|
package/dist/Brand.d.ts
CHANGED
|
@@ -1,2 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
type Common = {
|
|
3
|
+
children?: React.ReactNode;
|
|
4
|
+
className?: string;
|
|
5
|
+
};
|
|
6
|
+
export type BrandProps = (Common & React.ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
7
|
+
as?: "button";
|
|
8
|
+
}) | (Common & React.HTMLAttributes<HTMLElement> & {
|
|
9
|
+
as: "strong";
|
|
10
|
+
}) | (Common & React.AnchorHTMLAttributes<HTMLAnchorElement> & {
|
|
11
|
+
as: "a";
|
|
12
|
+
});
|
|
13
|
+
/**
|
|
14
|
+
* Название / логотип в шапке.
|
|
15
|
+
* Токены: --brand-*
|
|
16
|
+
*/
|
|
17
|
+
export declare function Brand(props: BrandProps): React.JSX.Element;
|
|
18
|
+
export {};
|
package/dist/Card.d.ts
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type CardProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
3
|
+
title?: React.ReactNode;
|
|
4
|
+
children?: React.ReactNode;
|
|
5
|
+
};
|
|
6
|
+
/** Карточка. Токены: --card-* */
|
|
7
|
+
export declare function Card({ title, children, className, ...rest }: CardProps): React.JSX.Element;
|
package/dist/Column.d.ts
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type ColumnProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
3
|
+
/** Отступ между детьми: число (px) или CSS-строка */
|
|
4
|
+
gap?: number | string;
|
|
5
|
+
children?: React.ReactNode;
|
|
6
|
+
};
|
|
7
|
+
/** Вертикальная колонка. Токены: --column-* */
|
|
8
|
+
export declare function Column({ gap, children, className, style, ...rest }: ColumnProps): React.JSX.Element;
|
package/dist/EmptyState.d.ts
CHANGED
|
@@ -1,2 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type EmptyStateProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
3
|
+
title?: React.ReactNode;
|
|
4
|
+
description?: React.ReactNode;
|
|
5
|
+
icon?: React.ReactNode;
|
|
6
|
+
actions?: React.ReactNode;
|
|
7
|
+
children?: React.ReactNode;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Заглушка «нет данных».
|
|
11
|
+
* Токены: --empty-state-*
|
|
12
|
+
*/
|
|
13
|
+
export declare function EmptyState({ title, description, icon, actions, children, className, ...rest }: EmptyStateProps): React.JSX.Element;
|
package/dist/Footer.d.ts
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type FooterProps = React.HTMLAttributes<HTMLElement> & {
|
|
3
|
+
children?: React.ReactNode;
|
|
4
|
+
};
|
|
5
|
+
/** Подвал. Токены: --footer-* */
|
|
6
|
+
export declare function Footer({ children, className, ...rest }: FooterProps): React.JSX.Element;
|
package/dist/Header.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer elcrm-components{.chr{display:flex;align-items:center;gap:var(--header-gap);min-height:var(--header-height);padding:var(--header-padding);color:var(--header-color);background:var(--header-background);border-bottom:1px solid var(--header-border);border-radius:var(--header-radius);box-shadow:var(--header-shadow);margin:var(--header-margin);position:
|
|
1
|
+
@layer elcrm-components{.chr{display:flex;align-items:center;gap:var(--header-gap);flex-shrink:0;min-height:var(--header-height);padding:var(--header-padding);color:var(--header-color);background:var(--header-background);border-bottom:1px solid var(--header-border);border-radius:var(--header-radius);box-shadow:var(--header-shadow);margin:var(--header-margin);position:relative;z-index:var(--header-z)}.chb{flex-shrink:0}.chn{display:flex;align-items:center;min-width:0}.chs{flex:1;min-width:0;margin-left:auto;max-width:18rem}.cha{display:flex;align-items:center;gap:.5rem;flex-shrink:0;margin-left:auto}.chs+.cha{margin-left:0}}
|
package/dist/Header.d.ts
CHANGED
|
@@ -1,2 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type HeaderProps = React.HTMLAttributes<HTMLElement> & {
|
|
3
|
+
brand?: React.ReactNode;
|
|
4
|
+
nav?: React.ReactNode;
|
|
5
|
+
search?: React.ReactNode;
|
|
6
|
+
actions?: React.ReactNode;
|
|
7
|
+
children?: React.ReactNode;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Шапка приложения со слотами.
|
|
11
|
+
* Токены: --header-background, --header-color, --header-border, …
|
|
12
|
+
*/
|
|
13
|
+
export declare function Header({ brand, nav, search, actions, children, className, ...rest }: HeaderProps): React.JSX.Element;
|
package/dist/Item.d.ts
CHANGED
|
@@ -1,2 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
type Common = {
|
|
3
|
+
active?: boolean;
|
|
4
|
+
children?: React.ReactNode;
|
|
5
|
+
className?: string;
|
|
6
|
+
};
|
|
7
|
+
export type ItemProps = (Common & React.ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
8
|
+
as?: "button";
|
|
9
|
+
}) | (Common & React.AnchorHTMLAttributes<HTMLAnchorElement> & {
|
|
10
|
+
as: "a";
|
|
11
|
+
}) | (Common & React.LiHTMLAttributes<HTMLLIElement> & {
|
|
12
|
+
as: "li";
|
|
13
|
+
});
|
|
14
|
+
/**
|
|
15
|
+
* Элемент списка / строки.
|
|
16
|
+
* Токены: --item-background, --item-background-hover, --item-radius, …
|
|
17
|
+
*/
|
|
18
|
+
export declare function Item(props: ItemProps): React.JSX.Element;
|
|
19
|
+
export {};
|
package/dist/Layout.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer elcrm-components{.clr{display:flex;flex-direction:column;min-height:
|
|
1
|
+
@layer elcrm-components{.clr{display:flex;flex-direction:column;flex:1 1 auto;height:100%;min-height:0;max-height:100%;overflow:hidden;background:var(--layout-background);gap:var(--layout-gap)}.clm{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;min-height:0;overflow:hidden}}
|
package/dist/Layout.d.ts
CHANGED
|
@@ -1,2 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type LayoutProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
3
|
+
/** Слот шапки (обычно Header) */
|
|
4
|
+
header?: React.ReactNode;
|
|
5
|
+
/** Слот подвала */
|
|
6
|
+
footer?: React.ReactNode;
|
|
7
|
+
children?: React.ReactNode;
|
|
8
|
+
};
|
|
9
|
+
/** Оболочка страницы: header + main + footer */
|
|
10
|
+
export declare function Layout({ header, footer, children, className, ...rest }: LayoutProps): React.JSX.Element;
|
package/dist/List.d.ts
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type ListProps = React.HTMLAttributes<HTMLUListElement> & {
|
|
3
|
+
/** Горизонтальный список */
|
|
4
|
+
row?: boolean;
|
|
5
|
+
children?: React.ReactNode;
|
|
6
|
+
};
|
|
7
|
+
/** Список. Токены: --list-* */
|
|
8
|
+
export declare function List({ row, children, className, ...rest }: ListProps): React.JSX.Element;
|
package/dist/Loading.d.ts
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type LoadingProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
3
|
+
children?: React.ReactNode;
|
|
4
|
+
};
|
|
5
|
+
/** Плейсхолдер загрузки. Токены: --loading-* */
|
|
6
|
+
export declare function Loading({ children, className, ...rest }: LoadingProps): React.JSX.Element;
|
package/dist/Menu.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@layer elcrm-components{.cmr{display:flex;align-items:center;gap:var(--menu-gap);margin:0;padding:0;list-style:none}.cmv{flex-direction:column;align-items:stretch}.cmi{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;background:var(--menu-item-background);color:var(--menu-item-color);padding:var(--menu-item-padding);border-radius:var(--menu-item-radius);font:inherit;cursor:pointer;text-align:left}.cmi:hover{background:var(--menu-item-background-hover);color:var(--menu-item-color-active)}.cma,.cmi[aria-current=page],.cmi[data-active=true]{background:var(--menu-item-background-active);color:var(--menu-item-color-active)}}
|
|
1
|
+
@layer elcrm-components{.cmr{display:flex;align-items:center;gap:var(--menu-gap);margin:0;padding:0;list-style:none}.cmv{flex-direction:column;align-items:stretch}.cmi{-webkit-appearance:none;-moz-appearance:none;appearance:none;display:inline-flex;align-items:center;justify-content:center;border:0;background:var(--menu-item-background);color:var(--menu-item-color);padding:var(--menu-item-padding);border-radius:var(--menu-item-radius);font:inherit;line-height:1;cursor:pointer;text-align:left}.cmi>svg{display:block;flex-shrink:0}.cmi:hover{background:var(--menu-item-background-hover);color:var(--menu-item-color-active)}.cma,.cmi[aria-current=page],.cmi[data-active=true]{background:var(--menu-item-background-active);color:var(--menu-item-color-active)}}
|
package/dist/Menu.d.ts
CHANGED
|
@@ -1,2 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type MenuItem = {
|
|
3
|
+
key: string;
|
|
4
|
+
label: React.ReactNode;
|
|
5
|
+
active?: boolean;
|
|
6
|
+
onClick?: () => void;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export type MenuProps = Omit<React.HTMLAttributes<HTMLElement>, "onSelect"> & {
|
|
10
|
+
items?: MenuItem[];
|
|
11
|
+
/** Вертикальный ряд */
|
|
12
|
+
vertical?: boolean;
|
|
13
|
+
/** Активный ключ (если не задан item.active) */
|
|
14
|
+
activeKey?: string;
|
|
15
|
+
onSelect?: (key: string) => void;
|
|
16
|
+
children?: React.ReactNode;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Навигационное меню (не overlay).
|
|
20
|
+
* Токены: --menu-*, --menu-item-*
|
|
21
|
+
*/
|
|
22
|
+
export declare function Menu({ items, vertical, activeKey, onSelect, children, className, ...rest }: MenuProps): React.JSX.Element;
|
package/dist/NavSections.d.ts
CHANGED
|
@@ -1,2 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { LazyRouteChunk } from './lazyRoute';
|
|
3
|
+
export type NavSectionsItem = {
|
|
4
|
+
key: string;
|
|
5
|
+
label: React.ReactNode;
|
|
6
|
+
icon?: React.ReactNode;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export type NavSectionsGroup = {
|
|
10
|
+
/** Подпись группы (например «Личное») */
|
|
11
|
+
label?: React.ReactNode;
|
|
12
|
+
items: NavSectionsItem[];
|
|
13
|
+
};
|
|
14
|
+
export type NavSectionsProps = {
|
|
15
|
+
/** Группы бокового меню */
|
|
16
|
+
groups: NavSectionsGroup[];
|
|
17
|
+
/**
|
|
18
|
+
* Резолвер секции: обычно `createLazyResolver((k) => import(\`./sections/${k}.tsx\`))`.
|
|
19
|
+
*/
|
|
20
|
+
resolveSection: (key: string) => LazyRouteChunk | React.ComponentType;
|
|
21
|
+
/** Контролируемый активный ключ */
|
|
22
|
+
activeKey?: string;
|
|
23
|
+
/** Начальный ключ (неконтролируемый режим) */
|
|
24
|
+
defaultActiveKey?: string;
|
|
25
|
+
onChange?: (key: string) => void;
|
|
26
|
+
loading?: React.ReactNode;
|
|
27
|
+
/** Низ сайдбара (например «Назад») */
|
|
28
|
+
footer?: React.ReactNode;
|
|
29
|
+
className?: string;
|
|
30
|
+
/** aria-label для nav */
|
|
31
|
+
navLabel?: string;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Настройки / профиль: сайдбар + lazy-секции справа.
|
|
35
|
+
* Токены: --nav-sections-*
|
|
36
|
+
*/
|
|
37
|
+
export declare function NavSections({ groups, resolveSection, activeKey: activeKeyProp, defaultActiveKey, onChange, loading, footer, className, navLabel, }: NavSectionsProps): React.JSX.Element;
|
package/dist/Row.d.ts
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type RowProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
3
|
+
/** Отступ между детьми: число (px) или CSS-строка */
|
|
4
|
+
gap?: number | string;
|
|
5
|
+
children?: React.ReactNode;
|
|
6
|
+
};
|
|
7
|
+
/** Горизонтальный ряд. Токены: --row-* */
|
|
8
|
+
export declare function Row({ gap, children, className, style, ...rest }: RowProps): React.JSX.Element;
|
package/dist/Section.d.ts
CHANGED
|
@@ -1,2 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type SectionProps = {
|
|
3
|
+
/** Заголовок */
|
|
4
|
+
title?: React.ReactNode;
|
|
5
|
+
/** Подзаголовок / описание */
|
|
6
|
+
description?: React.ReactNode;
|
|
7
|
+
/** Иконка / логотип над или рядом с заголовком */
|
|
8
|
+
icon?: React.ReactNode;
|
|
9
|
+
children?: React.ReactNode;
|
|
10
|
+
/** Блок действий (кнопки под контентом или в шапке) */
|
|
11
|
+
actions?: React.ReactNode;
|
|
12
|
+
/**
|
|
13
|
+
* `page` — секция модуля / панель настроек.
|
|
14
|
+
* `block` — блок внутри панели (заголовок + разделитель).
|
|
15
|
+
* `auth` — центрированная карточка входа.
|
|
16
|
+
*/
|
|
17
|
+
variant?: "page" | "block" | "auth";
|
|
18
|
+
/** Выравнивание шапки */
|
|
19
|
+
align?: "start" | "center";
|
|
20
|
+
/** Размер заголовка */
|
|
21
|
+
titleSize?: "md" | "lg";
|
|
22
|
+
className?: string;
|
|
23
|
+
as?: "section" | "main" | "div";
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Единая секция страницы: title + description + icon + children.
|
|
27
|
+
* Токены: --section-*
|
|
28
|
+
*/
|
|
29
|
+
export declare function Section({ title, description, icon, children, actions, variant, align, titleSize, className, as, }: SectionProps): React.JSX.Element;
|
package/dist/TabSections.d.ts
CHANGED
|
@@ -1,2 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { LazyRouteChunk } from './lazyRoute';
|
|
3
|
+
export type TabSectionsItem = {
|
|
4
|
+
key: string;
|
|
5
|
+
label: React.ReactNode;
|
|
6
|
+
/** Бейдж справа от подписи (число / текст) */
|
|
7
|
+
badge?: React.ReactNode;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type TabSectionsProps = {
|
|
11
|
+
/** Горизонтальные вкладки (ключ = файл секции) */
|
|
12
|
+
items: TabSectionsItem[];
|
|
13
|
+
/**
|
|
14
|
+
* Резолвер: обычно `createLazyResolver((k) => import(\`./sections/${k}.tsx\`))`.
|
|
15
|
+
*/
|
|
16
|
+
resolveSection: (key: string) => LazyRouteChunk | React.ComponentType;
|
|
17
|
+
activeKey?: string;
|
|
18
|
+
defaultActiveKey?: string;
|
|
19
|
+
onChange?: (key: string) => void;
|
|
20
|
+
loading?: React.ReactNode;
|
|
21
|
+
/** Справа в ряду вкладок (фильтр, сортировка…) */
|
|
22
|
+
actions?: React.ReactNode;
|
|
23
|
+
className?: string;
|
|
24
|
+
navLabel?: string;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Как NavSections, но вкладки горизонтально. Без своего заголовка —
|
|
28
|
+
* оборачивайте в Section.
|
|
29
|
+
* Токены: --tab-sections-*
|
|
30
|
+
*/
|
|
31
|
+
export declare function TabSections({ items, resolveSection, activeKey: activeKeyProp, defaultActiveKey, onChange, loading, actions, className, navLabel, }: TabSectionsProps): React.JSX.Element;
|
package/dist/index.css
CHANGED
|
@@ -14,17 +14,17 @@
|
|
|
14
14
|
|
|
15
15
|
@layer elcrm-components{.cfr{padding:var(--footer-padding);color:var(--footer-color);background:var(--footer-background);border-top:1px solid var(--footer-border);font-size:var(--footer-font-size)}}
|
|
16
16
|
|
|
17
|
-
@layer elcrm-components{.chr{display:flex;align-items:center;gap:var(--header-gap);min-height:var(--header-height);padding:var(--header-padding);color:var(--header-color);background:var(--header-background);border-bottom:1px solid var(--header-border);border-radius:var(--header-radius);box-shadow:var(--header-shadow);margin:var(--header-margin);position:
|
|
17
|
+
@layer elcrm-components{.chr{display:flex;align-items:center;gap:var(--header-gap);flex-shrink:0;min-height:var(--header-height);padding:var(--header-padding);color:var(--header-color);background:var(--header-background);border-bottom:1px solid var(--header-border);border-radius:var(--header-radius);box-shadow:var(--header-shadow);margin:var(--header-margin);position:relative;z-index:var(--header-z)}.chb{flex-shrink:0}.chn{display:flex;align-items:center;min-width:0}.chs{flex:1;min-width:0;margin-left:auto;max-width:18rem}.cha{display:flex;align-items:center;gap:.5rem;flex-shrink:0;margin-left:auto}.chs+.cha{margin-left:0}}
|
|
18
18
|
|
|
19
19
|
@layer elcrm-components{.cir{display:flex;align-items:center;gap:var(--item-gap);padding:var(--item-padding);color:var(--item-color);background:var(--item-background);border:1px solid var(--item-border);border-radius:var(--item-radius);cursor:default}.cir:is(button,a){-webkit-appearance:none;-moz-appearance:none;appearance:none;font:inherit;text-align:left;width:100%;cursor:pointer}.cir:hover{background:var(--item-background-hover)}.cia,.cir[aria-current=true],.cir[data-active=true]{background:var(--item-background-active)}}
|
|
20
20
|
|
|
21
|
-
@layer elcrm-components{.clr{display:flex;flex-direction:column;min-height:
|
|
21
|
+
@layer elcrm-components{.clr{display:flex;flex-direction:column;flex:1 1 auto;height:100%;min-height:0;max-height:100%;overflow:hidden;background:var(--layout-background);gap:var(--layout-gap)}.clm{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;min-height:0;overflow:hidden}}
|
|
22
22
|
|
|
23
23
|
@layer elcrm-components{.csr{display:flex;flex-direction:column;gap:var(--list-gap);padding:var(--list-padding);margin:0;list-style:none}.csh{flex-direction:row;flex-wrap:wrap}}
|
|
24
24
|
|
|
25
25
|
@layer elcrm-components{.cgr{display:flex;align-items:center;justify-content:center;padding:var(--loading-padding);color:var(--loading-color)}}
|
|
26
26
|
|
|
27
|
-
@layer elcrm-components{.cmr{display:flex;align-items:center;gap:var(--menu-gap);margin:0;padding:0;list-style:none}.cmv{flex-direction:column;align-items:stretch}.cmi{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;background:var(--menu-item-background);color:var(--menu-item-color);padding:var(--menu-item-padding);border-radius:var(--menu-item-radius);font:inherit;cursor:pointer;text-align:left}.cmi:hover{background:var(--menu-item-background-hover);color:var(--menu-item-color-active)}.cma,.cmi[aria-current=page],.cmi[data-active=true]{background:var(--menu-item-background-active);color:var(--menu-item-color-active)}}
|
|
27
|
+
@layer elcrm-components{.cmr{display:flex;align-items:center;gap:var(--menu-gap);margin:0;padding:0;list-style:none}.cmv{flex-direction:column;align-items:stretch}.cmi{-webkit-appearance:none;-moz-appearance:none;appearance:none;display:inline-flex;align-items:center;justify-content:center;border:0;background:var(--menu-item-background);color:var(--menu-item-color);padding:var(--menu-item-padding);border-radius:var(--menu-item-radius);font:inherit;line-height:1;cursor:pointer;text-align:left}.cmi>svg{display:block;flex-shrink:0}.cmi:hover{background:var(--menu-item-background-hover);color:var(--menu-item-color-active)}.cma,.cmi[aria-current=page],.cmi[data-active=true]{background:var(--menu-item-background-active);color:var(--menu-item-color-active)}}
|
|
28
28
|
|
|
29
29
|
@layer elcrm-components{.cvr{display:flex;align-items:stretch;gap:var(--nav-sections-gap);width:100%;flex:1 1 auto;min-height:0;box-sizing:border-box;padding:var(--nav-sections-padding)}.cvn{display:flex;flex-direction:column;gap:1rem;flex:0 0 var(--nav-sections-nav-width);width:var(--nav-sections-nav-width);min-width:var(--nav-sections-nav-width);box-sizing:border-box}.cvg{display:flex;flex-direction:column;gap:2px;padding-bottom:.75rem;border-bottom:1px solid var(--nav-sections-group-border)}.cvg:last-of-type{border-bottom:none;padding-bottom:0}.cvl{font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--nav-sections-label-color);padding:0 10px 6px}.cvi{-webkit-appearance:none;-moz-appearance:none;appearance:none;display:flex;align-items:center;gap:8px;width:100%;text-align:left;border:none;border-radius:var(--nav-sections-item-radius);background:transparent;color:var(--nav-sections-item-color);font:inherit;font-size:14px;padding:var(--nav-sections-item-padding);cursor:pointer;position:relative;transition:background .12s ease,color .12s ease}.cvi:hover:not(:disabled){background:var(--nav-sections-item-background-hover)}.cva{background:var(--nav-sections-item-background-active)}.cva:before{content:"";position:absolute;left:0;top:6px;bottom:6px;width:3px;border-radius:0 2px 2px 0;background:var(--nav-sections-accent)}.cvi:disabled{opacity:.45;cursor:not-allowed}.cvc{display:inline-flex;flex:0 0 auto;color:var(--nav-sections-icon-color);line-height:0}.cva .cvc{color:var(--nav-sections-item-color)}.cvt{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cvf{margin-top:auto;padding-top:.75rem;border-top:1px solid var(--nav-sections-footer-border)}.cvm{flex:1 1 auto;min-width:0;max-width:var(--nav-sections-main-max-width);width:100%;min-height:0;overflow:auto;--section-padding: 0}@media (max-width: 720px){.cvr{flex-direction:column}.cvn{flex:none;width:100%;min-width:0;max-width:none}}}
|
|
30
30
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elcrm/components",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "Shell UI elCRM: Layout, Header, Section, NavSections, Avatar и др. — стили через CSS-токены.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "MaSkal <dev@elcrm.online>",
|
|
@@ -40,10 +40,18 @@
|
|
|
40
40
|
"main": "./dist/index.es.js",
|
|
41
41
|
"module": "./dist/index.es.js",
|
|
42
42
|
"types": "./dist/index.d.ts",
|
|
43
|
+
"typings": "./dist/index.d.ts",
|
|
43
44
|
"exports": {
|
|
44
45
|
".": {
|
|
45
46
|
"types": "./dist/index.d.ts",
|
|
46
|
-
"import":
|
|
47
|
+
"import": {
|
|
48
|
+
"types": "./dist/index.d.ts",
|
|
49
|
+
"default": "./dist/index.es.js"
|
|
50
|
+
},
|
|
51
|
+
"require": {
|
|
52
|
+
"types": "./dist/index.d.ts",
|
|
53
|
+
"default": "./dist/index.es.js"
|
|
54
|
+
},
|
|
47
55
|
"default": "./dist/index.es.js"
|
|
48
56
|
},
|
|
49
57
|
"./style.css": {
|
|
@@ -53,7 +61,10 @@
|
|
|
53
61
|
},
|
|
54
62
|
"./*": {
|
|
55
63
|
"types": "./dist/*.d.ts",
|
|
56
|
-
"import":
|
|
64
|
+
"import": {
|
|
65
|
+
"types": "./dist/*.d.ts",
|
|
66
|
+
"default": "./dist/*.js"
|
|
67
|
+
},
|
|
57
68
|
"default": "./dist/*.js"
|
|
58
69
|
},
|
|
59
70
|
"./package.json": "./package.json"
|