@elcrm/components 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +130 -16
  2. package/dist/ActionGroup-ChKFW0mt.js +27 -0
  3. package/dist/ActionGroup.css +1 -0
  4. package/dist/ActionGroup.d.ts +42 -0
  5. package/dist/ActionGroup.js +4 -0
  6. package/dist/Avatar-loGgFt72.js +113 -0
  7. package/dist/Avatar.d.ts +11 -2
  8. package/dist/Avatar.js +3 -2
  9. package/dist/{AvatarGroup-BAWas4pU.js → AvatarGroup-D1gnT3Od.js} +1 -1
  10. package/dist/AvatarGroup.d.ts +2 -1
  11. package/dist/AvatarGroup.js +1 -1
  12. package/dist/AvatarName-0BzyfpMq.js +68 -0
  13. package/dist/AvatarName.css +1 -1
  14. package/dist/AvatarName.d.ts +8 -2
  15. package/dist/AvatarName.js +1 -1
  16. package/dist/Badge-jp-9iNNL.js +28 -0
  17. package/dist/Badge.css +1 -1
  18. package/dist/Badge.d.ts +33 -17
  19. package/dist/Badge.js +1 -1
  20. package/dist/{Block-BAXh0PPp.js → Block-Bu7NEA0g.js} +1 -1
  21. package/dist/Block.js +1 -1
  22. package/dist/Card.css +1 -1
  23. package/dist/Card.d.ts +8 -1
  24. package/dist/ChatFrame-BW2TmCkZ.js +37 -0
  25. package/dist/ChatFrame.css +1 -0
  26. package/dist/ChatList.d.ts +9 -0
  27. package/dist/ChatList.js +7 -0
  28. package/dist/ChatMessages-B8rdXiK-.js +19 -0
  29. package/dist/ChatMessages.d.ts +9 -0
  30. package/dist/ChatMessages.js +4 -0
  31. package/dist/ChatSplit-DNnu3TNq.js +21 -0
  32. package/dist/CheckIcon-FdB8fMEF.js +17 -0
  33. package/dist/CheckIcon.d.ts +8 -0
  34. package/dist/{Column-DDaqX-A7.js → Column-BiogBDf8.js} +1 -1
  35. package/dist/Column.js +1 -1
  36. package/dist/Dropdown-4yUB2tk1.js +142 -0
  37. package/dist/Dropdown.css +1 -1
  38. package/dist/Dropdown.d.ts +3 -3
  39. package/dist/Dropdown.js +1 -1
  40. package/dist/Footer.css +1 -1
  41. package/dist/Item-D4okhsfW.js +46 -0
  42. package/dist/Item.css +1 -1
  43. package/dist/Item.d.ts +8 -1
  44. package/dist/Item.js +1 -1
  45. package/dist/ItemColumn-M7a9L8CI.js +41 -0
  46. package/dist/ItemColumn.css +1 -0
  47. package/dist/ItemColumn.d.ts +62 -0
  48. package/dist/ItemColumn.js +4 -0
  49. package/dist/Layout-mi6Ghayv.js +31 -0
  50. package/dist/Layout.css +1 -1
  51. package/dist/Layout.d.ts +28 -6
  52. package/dist/Layout.js +1 -1
  53. package/dist/Loading-DkkG7RcE.js +16 -0
  54. package/dist/Loading.css +1 -1
  55. package/dist/Loading.d.ts +1 -1
  56. package/dist/Loading.js +1 -1
  57. package/dist/Menu-DuXQv-zT.js +66 -0
  58. package/dist/Menu.css +1 -1
  59. package/dist/Menu.d.ts +15 -3
  60. package/dist/Menu.js +1 -1
  61. package/dist/NavSections-BpyZPimZ.js +79 -0
  62. package/dist/NavSections.css +1 -1
  63. package/dist/NavSections.js +1 -1
  64. package/dist/PageHead-DgaJ1mXY.js +31 -0
  65. package/dist/PageHead.css +1 -1
  66. package/dist/PageHead.d.ts +28 -6
  67. package/dist/PageHead.js +1 -1
  68. package/dist/{PageShell-CghThHS3.js → PageShell-D9EZiO8o.js} +13 -11
  69. package/dist/PageShell.css +1 -1
  70. package/dist/PageShell.d.ts +11 -6
  71. package/dist/PageShell.js +1 -1
  72. package/dist/Popover-D0m5JWIt.js +142 -0
  73. package/dist/Popover.css +1 -0
  74. package/dist/Popover.d.ts +54 -0
  75. package/dist/Popover.js +4 -0
  76. package/dist/PricingGroup-Czuhe81Z.js +120 -0
  77. package/dist/PricingGroup.css +1 -1
  78. package/dist/PricingGroup.js +1 -1
  79. package/dist/{PricingTable-DALddSwM.js → PricingTable-BuLC0opK.js} +69 -75
  80. package/dist/PricingTable.css +1 -1
  81. package/dist/PricingTable.js +1 -1
  82. package/dist/RadioGroup-fcXzhvMu.js +129 -0
  83. package/dist/RadioGroup.css +1 -1
  84. package/dist/RadioGroup.js +1 -1
  85. package/dist/{Row--HIe6vb9.js → Row-DsQOVn18.js} +1 -1
  86. package/dist/Row.js +1 -1
  87. package/dist/Sidebar-CBYq1ad6.js +107 -0
  88. package/dist/Sidebar.css +1 -0
  89. package/dist/Sidebar.d.ts +99 -0
  90. package/dist/Sidebar.js +4 -0
  91. package/dist/Stack-XkmPSswj.js +53 -0
  92. package/dist/Stack.css +1 -1
  93. package/dist/Stack.d.ts +16 -4
  94. package/dist/Stack.js +3 -2
  95. package/dist/Stat-C5iZyEoo.js +27 -0
  96. package/dist/Stat.css +1 -0
  97. package/dist/Stat.d.ts +39 -0
  98. package/dist/Stat.js +4 -0
  99. package/dist/TabSections-DN7yVJoF.js +69 -0
  100. package/dist/TabSections.css +1 -1
  101. package/dist/TabSections.js +1 -1
  102. package/dist/TextGroup-DmhuyMR1.js +23 -0
  103. package/dist/TextGroup.css +1 -0
  104. package/dist/TextGroup.d.ts +36 -0
  105. package/dist/TextGroup.js +4 -0
  106. package/dist/badgeText-CRzlIzi3.js +8 -0
  107. package/dist/badgeText.d.ts +4 -0
  108. package/dist/dark.css +13 -0
  109. package/dist/index.css +31 -17
  110. package/dist/index.d.ts +27 -4
  111. package/dist/index.es.d.ts +82 -0
  112. package/dist/index.es.js +83 -59
  113. package/dist/light.css +13 -0
  114. package/dist/overlayZ.d.ts +9 -0
  115. package/dist/rovingKeys-CGlfTtNQ.js +15 -0
  116. package/dist/rovingKeys.d.ts +13 -0
  117. package/dist/tokens.css +44 -4
  118. package/dist/types.d.ts +2 -0
  119. package/dist/useControllableValue-CWqH1kpM.js +10 -0
  120. package/dist/useControllableValue.d.ts +4 -0
  121. package/package.json +6 -2
  122. package/dist/Avatar-CyNXYvsa.js +0 -101
  123. package/dist/AvatarName-DhD3TytF.js +0 -56
  124. package/dist/Badge-l6nUkl-H.js +0 -22
  125. package/dist/Dropdown-DQlDiWCR.js +0 -168
  126. package/dist/Item-CaU4RW2G.js +0 -38
  127. package/dist/Layout-Xb3-xsmA.js +0 -18
  128. package/dist/Loading-ChGq9peU.js +0 -15
  129. package/dist/Menu-DRBHvSdJ.js +0 -40
  130. package/dist/NavSections-NDcIDD6H.js +0 -59
  131. package/dist/PageHead-Baz9BLuA.js +0 -22
  132. package/dist/PricingGroup-DgcdVSq8.js +0 -126
  133. package/dist/RadioGroup-D2UUOTkY.js +0 -138
  134. package/dist/Stack-b0-XWwQ1.js +0 -31
  135. package/dist/TabSections-DL7DufKU.js +0 -50
@@ -0,0 +1,28 @@
1
+ import t from "react";
2
+ import { c as j } from "./cx-CcykAxZN.js";
3
+ import './Badge.css';const u = "cjr", i = "cjs", p = "cjm", w = "cjl", f = "cjn", g = "cja", N = "cju", h = "cjw", x = "cjd", z = "cjo", s = {
4
+ r: u,
5
+ s: i,
6
+ m: p,
7
+ l: w,
8
+ n: f,
9
+ a: g,
10
+ u: N,
11
+ w: h,
12
+ d: x,
13
+ o: z
14
+ };
15
+ function E(e) {
16
+ const {
17
+ tone: c = "neutral",
18
+ size: n = "m",
19
+ dot: o,
20
+ children: a,
21
+ className: r,
22
+ ...l
23
+ } = e, m = c === "accent" ? s.a : c === "success" ? s.u : c === "warning" ? s.w : c === "danger" ? s.d : s.n, d = n === "s" ? s.s : n === "l" ? s.l : s.m;
24
+ return /* @__PURE__ */ t.createElement("span", { className: j(s.r, d, m, r), ...l }, o ? /* @__PURE__ */ t.createElement("span", { className: s.o, "aria-hidden": !0 }) : null, a);
25
+ }
26
+ export {
27
+ E as B
28
+ };
package/dist/Badge.css CHANGED
@@ -1 +1 @@
1
- @layer elcrm-components{.cjr{display:inline-flex;align-items:center;justify-content:center;gap:.25rem;padding:.2rem .5rem;border-radius:999px;border:0;font-size:var(--shell-font-size-sm);font-weight:var(--shell-font-weight);line-height:1;white-space:nowrap}.cjn{background:var(--shell-background-hover);color:var(--shell-color)}.cja{background:color-mix(in srgb,var(--shell-color-accent) 16%,transparent);color:var(--shell-color-accent)}.cju{background:color-mix(in srgb,var(--shell-color-success) 16%,transparent);color:var(--shell-color-success)}.cjw{background:color-mix(in srgb,var(--shell-color-warning) 16%,transparent);color:var(--shell-color-warning)}.cjd{background:color-mix(in srgb,var(--shell-color-danger) 16%,transparent);color:var(--shell-color-danger)}}
1
+ @layer elcrm-components{.cjr{display:inline-flex;align-items:center;justify-content:center;gap:.25rem;padding:.2rem .5rem;border-radius:999px;border:0;font-size:var(--shell-font-size-sm);font-weight:600;line-height:1;white-space:nowrap}.cjs{padding:2px var(--shell-gap-sm);font-size:var(--shell-font-size-sm);letter-spacing:.04em}.cjm{padding:.2rem .5rem;font-size:var(--shell-font-size-sm)}.cjl{padding:.3rem .65rem;font-size:var(--shell-font-size)}.cjn{background:var(--shell-background-hover);color:var(--shell-color)}.cja{background:color-mix(in srgb,var(--shell-color-accent) 16%,transparent);color:var(--shell-color-accent)}.cju{background:color-mix(in srgb,var(--shell-color-success) 16%,transparent);color:var(--shell-color-success)}.cjw{background:color-mix(in srgb,var(--shell-color-warning) 16%,transparent);color:var(--shell-color-warning)}.cjd{background:color-mix(in srgb,var(--shell-color-danger) 16%,transparent);color:var(--shell-color-danger)}.cjo{flex-shrink:0;width:.45em;height:.45em;border-radius:50%;background:currentColor}}
package/dist/Badge.d.ts CHANGED
@@ -1,26 +1,42 @@
1
1
  import { default as React } from 'react';
2
+ import { UiSize } from './types';
3
+ /** Тон метки — те же смыслы, что у Stat */
4
+ export type BadgeTone = "neutral" | "accent" | "success" | "warning" | "danger";
5
+ /** Размер метки */
6
+ export type BadgeSize = UiSize;
7
+ export type BadgeProps = React.HTMLAttributes<HTMLSpanElement> & {
8
+ /**
9
+ * Цвет по смыслу.
10
+ * `neutral` | `accent` | `success` | `warning` | `danger`
11
+ */
12
+ tone?: BadgeTone;
13
+ /**
14
+ * Размер пилюли.
15
+ * `s` — в строке списка; `m` — обычная; `l` — крупнее.
16
+ * По умолчанию `m`.
17
+ */
18
+ size?: BadgeSize;
19
+ /** Точка статуса слева (цвет = `tone`) */
20
+ dot?: boolean;
21
+ /** Текст метки */
22
+ children?: React.ReactNode;
23
+ };
2
24
  /**
3
- * Компактная метка / статус (тон по смыслу).
25
+ * Компактная метка / статус (роль, состояние). Не заменяет Button.
4
26
  *
5
- * Роли: Badge рядом с Item, в Card, в PageHead; не заменяет Button.
27
+ * Props (`BadgeProps`):
28
+ * - `tone` — `neutral` | `accent` | `success` | `warning` | `danger`
29
+ * - `size` — `s` | `m` | `l` (по умолчанию `m`)
30
+ * - `dot` — точка слева (как online / offline)
31
+ * - `children` — текст метки
32
+ * - плюс атрибуты `span` (`className`, `style`, …)
6
33
  *
7
34
  * @example
8
35
  * ```tsx
9
- * <Badge tone="success">Активен</Badge>
10
- * <Badge tone="danger">Просрочен</Badge>
36
+ * <Badge tone="accent" size="s">ADMIN</Badge>
37
+ * <Badge tone="success" size="s" dot>online</Badge>
11
38
  * ```
12
39
  *
13
- * Токены: `--shell-*` (tone через color-mix от `--shell-color-*`).
14
- */
15
- export type BadgeProps = React.HTMLAttributes<HTMLSpanElement> & {
16
- /** Визуальный тон */
17
- tone?: "neutral" | "accent" | "success" | "warning" | "danger";
18
- /** Текст или содержимое метки */
19
- children?: React.ReactNode;
20
- };
21
- /**
22
- * Компактная метка / статус.
23
- *
24
- * @see Item, Card, Avatar
40
+ * @see Item, Card, Stat
25
41
  */
26
- export declare function Badge({ tone, children, className, ...rest }: BadgeProps): React.JSX.Element;
42
+ export declare function Badge(props: BadgeProps): React.JSX.Element;
package/dist/Badge.js CHANGED
@@ -1,4 +1,4 @@
1
- import { B as o } from "./Badge-l6nUkl-H.js";
1
+ import { B as o } from "./Badge-jp-9iNNL.js";
2
2
  export {
3
3
  o as Badge
4
4
  };
@@ -1,5 +1,5 @@
1
1
  import t from "react";
2
- import { S as e } from "./Stack-b0-XWwQ1.js";
2
+ import { S as e } from "./Stack-XkmPSswj.js";
3
3
  function n({ row: o, ...r }) {
4
4
  return /* @__PURE__ */ t.createElement(e, { direction: o ? "row" : "column", ...r });
5
5
  }
package/dist/Block.js CHANGED
@@ -1,4 +1,4 @@
1
- import { B } from "./Block-BAXh0PPp.js";
1
+ import { B } from "./Block-Bu7NEA0g.js";
2
2
  export {
3
3
  B as Block
4
4
  };
package/dist/Card.css CHANGED
@@ -1 +1 @@
1
- @layer elcrm-components{.cdr{background:var(--shell-background);border:1px solid var(--shell-border);border-radius:var(--shell-radius);padding:var(--shell-padding);box-shadow:var(--shell-shadow)}.cdt{margin:0 0 var(--shell-gap-sm);font-size:var(--shell-font-size-lg);font-weight:var(--shell-font-weight);color:var(--shell-color)}}
1
+ @layer elcrm-components{.cdr{background:var(--shell-background);border:1px solid var(--shell-border);border-radius:var(--shell-radius);padding:var(--shell-padding);box-shadow:var(--shell-shadow);cursor:var(--card-pointer)}.cdt{margin:0 0 var(--shell-gap-sm);font-size:var(--shell-font-size-lg);font-weight:var(--shell-font-weight);color:var(--shell-color)}}
package/dist/Card.d.ts CHANGED
@@ -12,7 +12,14 @@ import { default as React } from 'react';
12
12
  * </Card>
13
13
  * ```
14
14
  *
15
- * Токены: `--shell-*`.
15
+ * Токены: `--shell-*`, курсор — `--card-pointer` (по умолчанию `auto`).
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * <Card title="Тенанты" style={{ ["--card-pointer" as string]: "pointer" }}>
20
+ * 12
21
+ * </Card>
22
+ * ```
16
23
  */
17
24
  export type CardProps = React.HTMLAttributes<HTMLDivElement> & {
18
25
  /** Заголовок карточки (если нет — только children) */
@@ -0,0 +1,37 @@
1
+ import e from "react";
2
+ import { c as f } from "./cx-CcykAxZN.js";
3
+ import './ChatFrame.css';const p = "c8r", u = "c8l", g = "c8g", b = "c8h", h = "c8b", E = "c8f", N = "c8p", c = {
4
+ r: p,
5
+ l: u,
6
+ g,
7
+ h: b,
8
+ b: h,
9
+ f: E,
10
+ p: N
11
+ };
12
+ function x({
13
+ variant: l = "messages",
14
+ as: n = "section",
15
+ header: s,
16
+ footer: t,
17
+ children: a,
18
+ className: r,
19
+ bodyRef: o,
20
+ onBodyScroll: m,
21
+ ...i
22
+ }) {
23
+ return /* @__PURE__ */ e.createElement(
24
+ n,
25
+ {
26
+ className: f(c.r, l === "list" ? c.l : c.g, r),
27
+ ...i
28
+ },
29
+ s != null ? /* @__PURE__ */ e.createElement("div", { className: c.h }, s) : null,
30
+ /* @__PURE__ */ e.createElement("div", { className: c.b, ref: o, onScroll: m }, a),
31
+ t != null ? /* @__PURE__ */ e.createElement("div", { className: c.f }, t) : null
32
+ );
33
+ }
34
+ export {
35
+ x as C,
36
+ c as s
37
+ };
@@ -0,0 +1 @@
1
+ @layer elcrm-components{.c8r{display:flex;flex-direction:column;box-sizing:border-box;min-width:0;min-height:0;height:100%;overflow:hidden;background:var(--chat-background);border:var(--chat-border);border-radius:var(--chat-radius)}.c8l{width:var(--chat-list-width);max-width:100%}.c8g{width:100%}.c8h{flex:0 0 auto;padding:var(--chat-header-padding);border-bottom:var(--chat-border)}.c8b{flex:1 1 auto;min-height:0;overflow:auto;padding:var(--chat-body-padding)}.c8g .c8h{padding:var(--chat-messages-header-padding)}.c8g .c8b{display:flex;flex-direction:column;padding:var(--chat-messages-body-padding)}.c8f{flex:0 0 auto;padding:var(--chat-footer-padding);border-top:var(--chat-border)}.c8g .c8f{padding:var(--chat-messages-footer-padding)}.c8p{display:flex;align-items:stretch;gap:var(--chat-split-gap);min-height:0;height:100%}.c8p>*{min-height:0}}
@@ -0,0 +1,9 @@
1
+ import { default as React } from 'react';
2
+ import { ChatFrameProps } from './ChatFrame';
3
+ export type ChatListProps = Omit<ChatFrameProps, "variant" | "as" | "onBodyScroll">;
4
+ /**
5
+ * Колонка списка диалогов (`aside`).
6
+ *
7
+ * @see ChatMessages, ChatSplit, List, Item
8
+ */
9
+ export declare function ChatList({ "aria-label": ariaLabel, ...rest }: ChatListProps): React.JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { C as r, a as C } from "./ChatSplit-DNnu3TNq.js";
2
+ import { C as s } from "./ChatFrame-BW2TmCkZ.js";
3
+ export {
4
+ s as ChatFrame,
5
+ r as ChatList,
6
+ C as ChatSplit
7
+ };
@@ -0,0 +1,19 @@
1
+ import r from "react";
2
+ import { C as t } from "./ChatFrame-BW2TmCkZ.js";
3
+ function m({
4
+ "aria-label": a = "Переписка",
5
+ ...e
6
+ }) {
7
+ return /* @__PURE__ */ r.createElement(
8
+ t,
9
+ {
10
+ variant: "messages",
11
+ as: "section",
12
+ "aria-label": a,
13
+ ...e
14
+ }
15
+ );
16
+ }
17
+ export {
18
+ m as C
19
+ };
@@ -0,0 +1,9 @@
1
+ import { default as React } from 'react';
2
+ import { ChatFrameProps } from './ChatList/ChatFrame';
3
+ export type ChatMessagesProps = Omit<ChatFrameProps, "variant" | "as">;
4
+ /**
5
+ * Колонка переписки (`section`).
6
+ *
7
+ * @see ChatList, ChatSplit, AvatarName
8
+ */
9
+ export declare function ChatMessages({ "aria-label": ariaLabel, ...rest }: ChatMessagesProps): React.JSX.Element;
@@ -0,0 +1,4 @@
1
+ import { C as e } from "./ChatMessages-B8rdXiK-.js";
2
+ export {
3
+ e as ChatMessages
4
+ };
@@ -0,0 +1,21 @@
1
+ import e from "react";
2
+ import { C as s, s as m } from "./ChatFrame-BW2TmCkZ.js";
3
+ import { c as l } from "./cx-CcykAxZN.js";
4
+ function p({
5
+ "aria-label": a = "Диалоги",
6
+ ...t
7
+ }) {
8
+ return /* @__PURE__ */ e.createElement(s, { variant: "list", as: "aside", "aria-label": a, ...t });
9
+ }
10
+ function f({
11
+ list: a,
12
+ messages: t,
13
+ className: r,
14
+ ...i
15
+ }) {
16
+ return /* @__PURE__ */ e.createElement("div", { className: l(m.p, r), ...i }, a, t);
17
+ }
18
+ export {
19
+ p as C,
20
+ f as a
21
+ };
@@ -0,0 +1,17 @@
1
+ import e from "react";
2
+ function o({ className: r }) {
3
+ return /* @__PURE__ */ e.createElement("svg", { className: r, viewBox: "0 0 12 12", "aria-hidden": !0 }, /* @__PURE__ */ e.createElement(
4
+ "path",
5
+ {
6
+ d: "M2.5 6.2 4.8 8.5 9.5 3.5",
7
+ fill: "none",
8
+ stroke: "currentColor",
9
+ strokeWidth: "1.8",
10
+ strokeLinecap: "round",
11
+ strokeLinejoin: "round"
12
+ }
13
+ ));
14
+ }
15
+ export {
16
+ o as C
17
+ };
@@ -0,0 +1,8 @@
1
+ import { default as React } from 'react';
2
+ /**
3
+ * Галочка shell (RadioGroup / Pricing / Dropdown).
4
+ * Размер и цвет — `currentColor` + `--shell-check-size` у родителя.
5
+ */
6
+ export declare function CheckIcon({ className }: {
7
+ className?: string;
8
+ }): React.JSX.Element;
@@ -1,5 +1,5 @@
1
1
  import o from "react";
2
- import { S as r } from "./Stack-b0-XWwQ1.js";
2
+ import { S as r } from "./Stack-XkmPSswj.js";
3
3
  function n(t) {
4
4
  return /* @__PURE__ */ o.createElement(r, { direction: "column", ...t });
5
5
  }
package/dist/Column.js CHANGED
@@ -1,4 +1,4 @@
1
- import { C as r } from "./Column-DDaqX-A7.js";
1
+ import { C as r } from "./Column-BiogBDf8.js";
2
2
  export {
3
3
  r as Column
4
4
  };
@@ -0,0 +1,142 @@
1
+ import e from "react";
2
+ import { C as f } from "./CheckIcon-FdB8fMEF.js";
3
+ import { c as m } from "./cx-CcykAxZN.js";
4
+ import { P as D } from "./Popover-D0m5JWIt.js";
5
+ import { u as j } from "./useControllableValue-CWqH1kpM.js";
6
+ import './Dropdown.css';const I = "crr", M = "crt", P = "crc", R = "crp", W = "crh", z = "crg", F = "crd", G = "cri", T = "crn", V = "crm", q = "crk", A = "crl", H = "cru", J = "crb", K = "cro", Q = "crf", U = "crx", X = "cry", Y = "crv", n = {
7
+ r: I,
8
+ t: M,
9
+ c: P,
10
+ p: R,
11
+ h: W,
12
+ g: z,
13
+ d: F,
14
+ i: G,
15
+ n: T,
16
+ m: V,
17
+ k: q,
18
+ l: A,
19
+ u: H,
20
+ b: J,
21
+ o: K,
22
+ f: Q,
23
+ x: U,
24
+ y: X,
25
+ v: Y
26
+ };
27
+ function Z() {
28
+ return /* @__PURE__ */ e.createElement("svg", { className: n.c, viewBox: "0 0 12 12", "aria-hidden": !0 }, /* @__PURE__ */ e.createElement(
29
+ "path",
30
+ {
31
+ d: "M2.5 4.5 6 8l3.5-3.5",
32
+ fill: "none",
33
+ stroke: "currentColor",
34
+ strokeWidth: "1.5",
35
+ strokeLinecap: "round",
36
+ strokeLinejoin: "round"
37
+ }
38
+ ));
39
+ }
40
+ function _() {
41
+ return /* @__PURE__ */ e.createElement("svg", { className: n.m, viewBox: "0 0 12 12", "aria-hidden": !0 }, /* @__PURE__ */ e.createElement(
42
+ "path",
43
+ {
44
+ d: "M4.5 2.5 8 6l-3.5 3.5",
45
+ fill: "none",
46
+ stroke: "currentColor",
47
+ strokeWidth: "1.5",
48
+ strokeLinecap: "round",
49
+ strokeLinejoin: "round"
50
+ }
51
+ ));
52
+ }
53
+ function $({ item: a }) {
54
+ return a.checkbox ? /* @__PURE__ */ e.createElement("span", { className: m(n.x, a.checked && n.y), "aria-hidden": !0 }, a.checked ? /* @__PURE__ */ e.createElement(f, { className: n.v }) : null) : a.checked ? /* @__PURE__ */ e.createElement("span", { className: n.k, "aria-hidden": !0 }, /* @__PURE__ */ e.createElement(f, { className: n.v })) : a.status != null ? /* @__PURE__ */ e.createElement(
55
+ "span",
56
+ {
57
+ className: m(n.b, a.status === "online" ? n.o : n.f),
58
+ "aria-hidden": !0
59
+ }
60
+ ) : a.icon != null ? /* @__PURE__ */ e.createElement("span", { className: n.n }, a.icon) : null;
61
+ }
62
+ function S(a, l, t) {
63
+ return l != null && l.length > 0 ? t != null && l[0] && l[0].title == null ? [{ ...l[0], title: t }, ...l.slice(1)] : l : a != null && a.length > 0 ? [{ title: t, items: a }] : t != null ? [{ title: t, items: [] }] : [];
64
+ }
65
+ function le({
66
+ items: a,
67
+ groups: l,
68
+ trigger: t,
69
+ label: o,
70
+ hideChevron: E = !1,
71
+ title: v,
72
+ align: k = "end",
73
+ open: b,
74
+ defaultOpen: N = !1,
75
+ onOpenChange: x,
76
+ closeOnSelect: C = !0,
77
+ disabled: u = !1,
78
+ onSelect: d,
79
+ className: y
80
+ }) {
81
+ const [i = !1, p] = j(
82
+ b,
83
+ N,
84
+ x
85
+ ), g = S(a, l, v), L = (r) => {
86
+ var c;
87
+ if (r.disabled) return;
88
+ (c = r.onClick) == null || c.call(r), d == null || d(r.value, r), r.checkbox || r.submenu || !C || p(!1);
89
+ }, w = t ?? /* @__PURE__ */ e.createElement(
90
+ "button",
91
+ {
92
+ type: "button",
93
+ className: n.t,
94
+ "data-open": i ? "true" : void 0,
95
+ disabled: u,
96
+ "aria-haspopup": "menu",
97
+ "aria-expanded": i
98
+ },
99
+ o,
100
+ E ? null : /* @__PURE__ */ e.createElement(Z, null)
101
+ );
102
+ return /* @__PURE__ */ e.createElement(
103
+ D,
104
+ {
105
+ className: m(n.r, y),
106
+ open: i,
107
+ onOpenChange: (r) => {
108
+ u || p(r);
109
+ },
110
+ align: k,
111
+ trigger: w,
112
+ label: typeof o == "string" ? o : void 0,
113
+ disabled: u
114
+ },
115
+ /* @__PURE__ */ e.createElement("div", { className: n.p, "data-align": k }, g.map((r, h) => /* @__PURE__ */ e.createElement(e.Fragment, { key: h }, h > 0 ? /* @__PURE__ */ e.createElement("hr", { className: n.d }) : null, /* @__PURE__ */ e.createElement("div", { className: n.g, role: "group" }, r.title != null ? /* @__PURE__ */ e.createElement("p", { className: n.h }, r.title) : null, r.items.map((c) => {
116
+ const O = r.items.some(
117
+ (s) => s.checked || s.checkbox || s.status != null || s.icon != null
118
+ ), B = /* @__PURE__ */ e.createElement($, { item: c });
119
+ return /* @__PURE__ */ e.createElement(
120
+ "button",
121
+ {
122
+ key: c.value,
123
+ type: "button",
124
+ role: "menuitem",
125
+ className: n.i,
126
+ "data-checked": (c.checked || c.checkbox) && c.checked ? "true" : void 0,
127
+ "data-danger": c.danger ? "true" : void 0,
128
+ disabled: c.disabled,
129
+ "aria-checked": c.checked != null || c.checkbox ? !!c.checked : void 0,
130
+ onClick: () => L(c)
131
+ },
132
+ O ? B ?? /* @__PURE__ */ e.createElement("span", { className: n.n, "aria-hidden": !0 }) : null,
133
+ c.label != null ? /* @__PURE__ */ e.createElement("span", { className: n.l }, c.label) : null,
134
+ c.shortcut != null ? /* @__PURE__ */ e.createElement("span", { className: n.u }, c.shortcut) : null,
135
+ c.submenu ? /* @__PURE__ */ e.createElement(_, null) : null
136
+ );
137
+ })))))
138
+ );
139
+ }
140
+ export {
141
+ le as D
142
+ };
package/dist/Dropdown.css CHANGED
@@ -1 +1 @@
1
- @layer elcrm-components{.crr{position:relative;display:inline-flex;vertical-align:middle}.crt{display:inline-flex;align-items:center;gap:var(--shell-gap-sm);margin:0;padding:var(--shell-padding);box-sizing:border-box;font:inherit;font-size:var(--shell-font-size);font-weight:var(--shell-font-weight);color:var(--shell-color);background:var(--shell-background);border:1px solid var(--shell-border);border-radius:var(--shell-radius);cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;line-height:1.2}.crt:hover{background:var(--shell-background-hover)}.crt[data-open=true]{border-color:var(--shell-color-accent);color:var(--shell-color-accent)}.crc{display:inline-flex;width:var(--shell-icon-size);height:var(--shell-icon-size);flex-shrink:0;color:var(--shell-color-muted)}.crt[data-open=true] .crc{color:var(--shell-color-accent)}.crp{position:absolute;top:calc(100% + var(--shell-gap-sm));z-index:var(--shell-z);min-width:var(--dropdown-min-width);max-width:var(--dropdown-max-width);max-height:var(--dropdown-max-height);overflow:auto;padding:var(--shell-gap-sm);box-sizing:border-box;background:var(--shell-background);border:1px solid var(--shell-border);border-radius:var(--shell-radius);box-shadow:var(--popup-shadow)}.crp[data-align=start]{left:0}.crp[data-align=end]{right:0}.crh{margin:0;padding:var(--shell-padding);font-size:var(--shell-font-size-sm);font-weight:var(--shell-font-weight);color:var(--shell-color-muted);line-height:1.3}.crg{display:flex;flex-direction:column;gap:2px}.crd{height:0;margin:var(--shell-gap-sm) 0;border:0;border-top:1px solid var(--shell-border)}.cri{display:flex;align-items:center;gap:var(--shell-gap-sm);width:100%;margin:0;padding:var(--shell-padding);box-sizing:border-box;text-align:left;font:inherit;font-size:var(--shell-font-size);font-weight:500;color:var(--shell-color);background:transparent;border:none;border-radius:calc(var(--shell-radius) * .7);cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;line-height:1.35}.cri:hover:not(:disabled),.cri:focus-visible:not(:disabled){background:var(--shell-background-hover);outline:none}.cri[data-checked=true]{background:var(--shell-background-selected)}.cri[data-danger=true]{color:var(--shell-color-danger)}.cri:disabled,.cri[aria-disabled=true]{opacity:var(--shell-disabled-opacity);cursor:not-allowed}.crn,.crk{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;width:var(--shell-icon-size);height:var(--shell-icon-size);color:var(--shell-color-muted)}.crk{color:var(--shell-color-accent)}.crl{flex:1;min-width:0}.cru{flex-shrink:0;margin-left:auto;font-size:var(--shell-font-size-sm);color:var(--shell-color-muted)}.crm{display:inline-flex;flex-shrink:0;margin-left:auto;width:var(--shell-icon-size);height:var(--shell-icon-size);color:var(--shell-color-muted)}.crb{display:inline-flex;flex-shrink:0;width:var(--shell-status-size);height:var(--shell-status-size);border-radius:50%}.cro{background:var(--shell-color-success)}.crf{background:var(--shell-color-muted)}.crx{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;box-sizing:border-box;width:var(--shell-check-size);height:var(--shell-check-size);border:1px solid var(--shell-border);border-radius:calc(var(--shell-radius) * .4);background:var(--shell-background);color:#fff}.cry{border-color:var(--shell-color-accent);background:var(--shell-color-accent)}.crv{width:70%;height:70%;display:block}}
1
+ @layer elcrm-components{.crr{position:relative;display:inline-flex;vertical-align:middle}.crt{display:inline-flex;align-items:center;gap:var(--shell-gap-sm);margin:0;padding:var(--shell-padding);box-sizing:border-box;font:inherit;font-size:var(--shell-font-size);font-weight:var(--shell-font-weight);color:var(--shell-color);background:var(--shell-background);border:1px solid var(--shell-border);border-radius:var(--shell-radius);cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;line-height:1.2}.crt:hover{background:var(--shell-background-hover)}.crt[data-open=true]{border-color:var(--shell-color-accent);color:var(--shell-color-accent)}.crc{display:inline-flex;width:var(--shell-icon-size);height:var(--shell-icon-size);flex-shrink:0;color:var(--shell-color-muted)}.crt[data-open=true] .crc{color:var(--shell-color-accent)}.crp{min-width:0}.crh{margin:0;padding:var(--shell-padding);font-size:var(--shell-font-size-sm);font-weight:var(--shell-font-weight);color:var(--shell-color-muted);line-height:1.3}.crg{display:flex;flex-direction:column;gap:2px}.crd{height:0;margin:var(--shell-gap-sm) 0;border:0;border-top:1px solid var(--shell-border)}.cri{display:flex;align-items:center;gap:var(--shell-gap-sm);width:100%;margin:0;padding:var(--shell-padding);box-sizing:border-box;text-align:left;font:inherit;font-size:var(--shell-font-size);font-weight:500;color:var(--shell-color);background:transparent;border:none;border-radius:calc(var(--shell-radius) * .7);cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;line-height:1.35}.cri:hover:not(:disabled),.cri:focus-visible:not(:disabled){background:var(--shell-background-hover);outline:none}.cri[data-checked=true]{background:var(--shell-background-selected)}.cri[data-danger=true]{color:var(--shell-color-danger)}.cri[data-danger=true] .crn,.cri[data-danger=true] .crm{color:inherit}.cri:disabled,.cri[aria-disabled=true]{opacity:var(--shell-disabled-opacity);cursor:not-allowed}.crn,.crk{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;width:var(--shell-icon-size);height:var(--shell-icon-size);color:var(--shell-color-muted)}.crk{color:var(--shell-color-accent)}.crl{flex:1;min-width:0}.cru{flex-shrink:0;margin-left:auto;font-size:var(--shell-font-size-sm);color:var(--shell-color-muted)}.crm{display:inline-flex;flex-shrink:0;margin-left:auto;width:var(--shell-icon-size);height:var(--shell-icon-size);color:var(--shell-color-muted)}.crb{display:inline-flex;flex-shrink:0;width:var(--shell-status-size);height:var(--shell-status-size);border-radius:50%}.cro{background:var(--shell-color-success)}.crf{background:var(--shell-color-muted)}.crx{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;box-sizing:border-box;width:var(--shell-check-size);height:var(--shell-check-size);border:1px solid var(--shell-border);border-radius:calc(var(--shell-radius) * .4);background:var(--shell-background);color:var(--avatar-color)}.cry{border-color:var(--shell-color-accent);background:var(--shell-color-accent)}.crv{width:70%;height:70%;display:block}}
@@ -80,14 +80,14 @@ export type DropdownProps = Omit<React.HTMLAttributes<HTMLDivElement>, "onChange
80
80
  onSelect?: (value: string, item: DropdownItem) => void;
81
81
  };
82
82
  /**
83
- * Выпадающее меню: триггер + панель с `groups` / `items` рядом с якорем (не portal).
83
+ * Выпадающее меню: триггер + панель с `groups` / `items` (portal, {@link Popover}).
84
84
  *
85
85
  * Когда использовать:
86
86
  * - действия строки списка, переключатели колонок, контекстные пункты у кнопки.
87
87
  *
88
88
  * Отличия:
89
89
  * - {@link Menu} — инлайн-навигация в потоке (шапка), без панели;
90
- * - `@elcrm/overlay`портальное меню/popover поверх layout (фокус-ловушка, слои).
90
+ * - {@link Popover} свой контент в portal, без `items`.
91
91
  *
92
92
  * API: декларативные `items` / `groups`. Идентификатор пункта — `value` (не `key`).
93
93
  * Compound-слоты (`Dropdown.Item`) не используются.
@@ -121,4 +121,4 @@ export type DropdownProps = Omit<React.HTMLAttributes<HTMLDivElement>, "onChange
121
121
  * />
122
122
  * ```
123
123
  */
124
- export declare function Dropdown({ items, groups, trigger, label, hideChevron, title, align, open: openProp, defaultOpen, onOpenChange, closeOnSelect, disabled, onSelect, className, ...rest }: DropdownProps): React.JSX.Element;
124
+ export declare function Dropdown({ items, groups, trigger, label, hideChevron, title, align, open: openProp, defaultOpen, onOpenChange, closeOnSelect, disabled, onSelect, className, }: DropdownProps): React.JSX.Element;
package/dist/Dropdown.js CHANGED
@@ -1,4 +1,4 @@
1
- import { D as p } from "./Dropdown-DQlDiWCR.js";
1
+ import { D as p } from "./Dropdown-4yUB2tk1.js";
2
2
  export {
3
3
  p as Dropdown
4
4
  };
package/dist/Footer.css CHANGED
@@ -1 +1 @@
1
- @layer elcrm-components{.cfr{padding:var(--shell-padding);color:var(--shell-color-muted);background:transparent;border-top:1px solid var(--shell-border);font-size:var(--shell-font-size-sm)}}
1
+ @layer elcrm-components{.cfr{flex-shrink:0;padding:var(--shell-padding);color:var(--shell-color-muted);background:transparent;border-top:1px solid var(--shell-border);font-size:var(--shell-font-size-sm)}}
@@ -0,0 +1,46 @@
1
+ import r from "react";
2
+ import { c as m } from "./cx-CcykAxZN.js";
3
+ import './Item.css';const u = "cir", d = "cia", v = "cic", i = {
4
+ r: u,
5
+ a: d,
6
+ c: v
7
+ };
8
+ function N(s) {
9
+ const {
10
+ active: t,
11
+ variant: o = "plain",
12
+ children: a,
13
+ className: l,
14
+ as: n = "button",
15
+ ...e
16
+ } = s, c = m(i.r, o === "card" && i.c, t && i.a, l);
17
+ return n === "a" ? /* @__PURE__ */ r.createElement(
18
+ "a",
19
+ {
20
+ className: c,
21
+ "data-active": t ? "true" : void 0,
22
+ ...e
23
+ },
24
+ a
25
+ ) : n === "li" ? /* @__PURE__ */ r.createElement(
26
+ "li",
27
+ {
28
+ className: c,
29
+ "data-active": t ? "true" : void 0,
30
+ ...e
31
+ },
32
+ a
33
+ ) : /* @__PURE__ */ r.createElement(
34
+ "button",
35
+ {
36
+ type: "button",
37
+ className: c,
38
+ "data-active": t ? "true" : void 0,
39
+ ...e
40
+ },
41
+ a
42
+ );
43
+ }
44
+ export {
45
+ N as I
46
+ };
package/dist/Item.css CHANGED
@@ -1 +1 @@
1
- @layer elcrm-components{.cir{display:flex;align-items:center;gap:var(--shell-gap-sm);padding:var(--shell-padding);color:var(--shell-color);background:transparent;border:1px solid transparent;border-radius:var(--shell-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(--shell-background-hover)}.cia,.cir[aria-current=true],.cir[data-active=true]{background:var(--shell-background-selected)}}
1
+ @layer elcrm-components{.cir{display:flex;align-items:center;gap:var(--shell-gap-sm);padding:var(--shell-padding);color:var(--shell-color);background:transparent;border:1px solid transparent;border-radius:var(--shell-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(--shell-background-hover)}.cia,.cir[aria-current=true],.cir[data-active=true]{background:var(--shell-background-selected)}.cic{align-items:flex-start;gap:var(--shell-gap);padding:var(--shell-padding);border:1px solid var(--shell-border);border-radius:var(--shell-radius);background:var(--shell-background-muted);flex-shrink:0}.cic:hover,.cic.cia,.cic[data-active=true]{background:color-mix(in srgb,var(--shell-color-accent) 12%,var(--shell-background-muted));border-color:color-mix(in srgb,var(--shell-color-accent) 35%,transparent)}}
package/dist/Item.d.ts CHANGED
@@ -2,6 +2,11 @@ import { default as React } from 'react';
2
2
  type Common = {
3
3
  /** Активное / выбранное состояние */
4
4
  active?: boolean;
5
+ /**
6
+ * `plain` — строка списка.
7
+ * `card` — карточка (идеи / тикеты): рамка, muted-фон, hover.
8
+ */
9
+ variant?: "plain" | "card";
5
10
  /** Содержимое элемента */
6
11
  children?: React.ReactNode;
7
12
  /** Доп. CSS-класс */
@@ -13,11 +18,13 @@ type Common = {
13
18
  * Роли: Item внутри List / Menu; для групповых списков выбора —
14
19
  * RadioGroup / Dropdown с `items` (не собирайте Item вручную).
15
20
  *
21
+ * @param variant `plain` (строка) или `card` (рамка, muted-фон)
22
+ *
16
23
  * @example
17
24
  * ```tsx
18
25
  * <List>
19
26
  * <Item as="li" active>Текущий</Item>
20
- * <Item as="a" href="/docs">Документация</Item>
27
+ * <Item as="button" variant="card" active>Карточка</Item>
21
28
  * </List>
22
29
  * ```
23
30
  *
package/dist/Item.js CHANGED
@@ -1,4 +1,4 @@
1
- import { I as o } from "./Item-CaU4RW2G.js";
1
+ import { I as o } from "./Item-D4okhsfW.js";
2
2
  export {
3
3
  o as Item
4
4
  };
@@ -0,0 +1,41 @@
1
+ import e from "react";
2
+ import { c as N } from "./cx-CcykAxZN.js";
3
+ import './ItemColumn.css';const h = "c7r", v = "c7i", k = "c7b", b = "c7h", x = "c7t", g = "c7x", C = "c7d", F = "c7f", I = "c7p", y = "c7a", L = "c7s", M = "c7l", R = "c7k", l = {
4
+ r: h,
5
+ i: v,
6
+ b: k,
7
+ h: b,
8
+ t: x,
9
+ x: g,
10
+ d: C,
11
+ f: F,
12
+ p: I,
13
+ a: y,
14
+ s: L,
15
+ l: M,
16
+ k: R
17
+ };
18
+ function $({ items: a }) {
19
+ const t = a.filter((n) => n != null && n !== !1 && n !== "");
20
+ return t.length === 0 ? null : /* @__PURE__ */ e.createElement(e.Fragment, null, t.map((n, c) => /* @__PURE__ */ e.createElement(e.Fragment, { key: c }, c > 0 ? /* @__PURE__ */ e.createElement("span", { className: l.p, "aria-hidden": !0 }, "·") : null, /* @__PURE__ */ e.createElement("span", null, n))));
21
+ }
22
+ function w({
23
+ icon: a,
24
+ title: t,
25
+ extra: n,
26
+ aside: c,
27
+ description: s,
28
+ footer: o,
29
+ meta: m,
30
+ size: r = "m",
31
+ unread: i,
32
+ children: E,
33
+ className: d,
34
+ ...p
35
+ }) {
36
+ const f = r === "s" ? l.s : r === "l" ? l.l : void 0, u = o ?? (m != null ? /* @__PURE__ */ e.createElement($, { items: m }) : null);
37
+ return /* @__PURE__ */ e.createElement("div", { className: N(l.r, f, i && l.k, d), ...p }, a != null ? /* @__PURE__ */ e.createElement("span", { className: l.i, "aria-hidden": !0 }, a) : null, /* @__PURE__ */ e.createElement("div", { className: l.b }, t != null || n != null ? /* @__PURE__ */ e.createElement("div", { className: l.h }, t != null ? /* @__PURE__ */ e.createElement("span", { className: l.t }, t) : null, n != null ? /* @__PURE__ */ e.createElement("span", { className: l.x }, n) : null) : null, s != null ? /* @__PURE__ */ e.createElement("div", { className: l.d }, s) : null, u != null ? /* @__PURE__ */ e.createElement("div", { className: l.f }, u) : null, E), c != null ? /* @__PURE__ */ e.createElement("div", { className: l.a }, c) : null);
38
+ }
39
+ export {
40
+ w as I
41
+ };
@@ -0,0 +1 @@
1
+ @layer elcrm-components{.c7r{display:flex;align-items:flex-start;gap:var(--item-column-gap);min-width:0;width:100%;text-align:left}.c7i{flex-shrink:0;box-sizing:border-box;width:var(--item-column-icon-size);height:var(--item-column-icon-size);border-radius:var(--item-column-icon-radius);display:inline-flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--shell-color-accent) 14%,transparent);color:var(--shell-color-accent)}.c7b{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}.c7h{display:flex;align-items:center;gap:8px;min-width:0}.c7t{flex:1;min-width:0;margin:0;font-size:var(--item-column-title-size);font-weight:var(--shell-font-weight);color:var(--shell-color);line-height:var(--item-column-title-line);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c7x{flex-shrink:0;display:inline-flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:6px}.c7d{margin:0;font-size:var(--shell-font-size-sm);font-weight:400;color:var(--shell-color);line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.c7f{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 6px;font-size:12px;color:var(--shell-color-muted);line-height:1.35}.c7p{opacity:.5;-webkit-user-select:none;user-select:none}.c7a{flex-shrink:0;display:inline-flex;align-items:flex-start}.c7s .c7t{font-size:var(--shell-font-size-sm)}.c7s .c7d{font-size:12px}.c7l .c7t{font-size:var(--shell-font-size-lg)}.c7l .c7d{font-size:var(--shell-font-size)}.c7k .c7t{font-weight:700}}