elcrm 1.1.13 → 1.1.15

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 (51) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +1982 -1443
  3. package/package.json +3 -3
  4. package/templates/elcrm-cursor/rules/elcrm-jsdoc.mdc +1 -1
  5. package/templates/elcrm-cursor/rules/elcrm-packages.mdc +1 -1
  6. package/templates/elcrm-cursor/rules/elcrm-ui.mdc +3 -1
  7. package/templates/elcrm-docs/BUTTON.elCRM.md +3 -3
  8. package/templates/elcrm-docs/CLI.elCRM.md +26 -12
  9. package/templates/elcrm-docs/COMPONENTS.elCRM.md +18 -10
  10. package/templates/elcrm-docs/FORM.elCRM.md +11 -3
  11. package/templates/elcrm-docs/ICONS.elCRM.md +2 -0
  12. package/templates/elcrm-docs/NOTIFICATIONS.elCRM.md +1 -1
  13. package/templates/elcrm-docs/SERVER.elCRM.md +3 -1
  14. package/templates/orbit/README.md +12 -0
  15. package/templates/orbit/index.html +28 -0
  16. package/templates/orbit/package.json +39 -0
  17. package/templates/orbit/src/App.tsx +34 -0
  18. package/templates/orbit/src/component/Nav.tsx +139 -0
  19. package/templates/orbit/src/lazyRoute.ts +4 -0
  20. package/templates/orbit/src/lib/icon.tsx +48 -0
  21. package/templates/orbit/src/lib/theme.ts +39 -0
  22. package/templates/orbit/src/main.tsx +54 -0
  23. package/templates/orbit/src/modules/Analytics/index.tsx +5 -0
  24. package/templates/orbit/src/modules/Catalog/index.tsx +7 -0
  25. package/templates/orbit/src/modules/Customers/index.tsx +5 -0
  26. package/templates/orbit/src/modules/Finances/index.tsx +5 -0
  27. package/templates/orbit/src/modules/Home/index.tsx +317 -0
  28. package/templates/orbit/src/modules/Integrations/index.tsx +7 -0
  29. package/templates/orbit/src/modules/Link/index.tsx +7 -0
  30. package/templates/orbit/src/modules/Marketing/index.tsx +5 -0
  31. package/templates/orbit/src/modules/Placeholder.tsx +13 -0
  32. package/templates/orbit/src/modules/Settings/index.tsx +22 -0
  33. package/templates/orbit/src/modules/Store/index.tsx +7 -0
  34. package/templates/orbit/src/pages/Auth.tsx +45 -0
  35. package/templates/orbit/src/pages/Main.tsx +29 -0
  36. package/templates/orbit/src/router-data.d.ts +10 -0
  37. package/templates/orbit/src/state.ts +28 -0
  38. package/templates/orbit/src/style/elcrm.css +27 -0
  39. package/templates/orbit/src/style/theme-dark.css +148 -0
  40. package/templates/orbit/src/style/theme-light.css +148 -0
  41. package/templates/orbit/src/style/theme.css +177 -0
  42. package/templates/orbit/src/vite-env.d.ts +1 -0
  43. package/templates/orbit/tsconfig.json +19 -0
  44. package/templates/orbit/vite.config.ts +14 -0
  45. package/templates/panel/README.md +1 -1
  46. package/templates/panel/web/package.json +9 -9
  47. package/templates/panel/web/src/pages/Auth.tsx +1 -1
  48. package/templates/panel/web/src/style/theme-dark.css +9 -32
  49. package/templates/panel/web/src/style/theme-light.css +9 -32
  50. package/templates/panel/web/src/style/theme.css +20 -39
  51. package/templates/panel/web/vite.config.ts +3 -0
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Тёмная тема panel: ТОЛЬКО цвета / тени / hover / border с цветом.
3
+ * Размеры — theme.css
4
+ */
5
+ html[data-theme="dark"],
6
+ body[data-theme="dark"] {
7
+ color-scheme: dark;
8
+
9
+ /* —— палитра —— */
10
+ --bg: #0f1216;
11
+ --panel: #171b22;
12
+ --panel-elevated: #1e2430;
13
+ --text: #e8eaed;
14
+ --muted: #9aa3af;
15
+ --line: #2a3140;
16
+ --accent: #5b8cff;
17
+ --danger: #ff6b6b;
18
+ --success: #3dd68c;
19
+ --warning: #f59e0b;
20
+ --shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
21
+
22
+ /* —— button —— */
23
+ --button-focus-ring: rgba(91, 140, 255, 0.55);
24
+ --button-border-primary: 1px solid transparent;
25
+ --button-primary-bg: var(--accent);
26
+ --button-primary-fg: #ffffff;
27
+ --button-primary-hover-bg: #7aa3ff;
28
+ --button-primary-hover-fg: #ffffff;
29
+ --button-primary-active-bg: #3d74e0;
30
+ --button-primary-active-fg: #ffffff;
31
+ --button-secondary-bg: rgba(255, 255, 255, 0.08);
32
+ --button-secondary-fg: rgba(255, 255, 255, 0.92);
33
+ --button-secondary-hover-bg: rgba(255, 255, 255, 0.12);
34
+ --button-secondary-hover-fg: #ffffff;
35
+ --button-secondary-active-bg: rgba(255, 255, 255, 0.16);
36
+ --button-secondary-active-fg: #ffffff;
37
+ --button-border-secondary: 1px solid var(--line);
38
+ --button-positive-bg: var(--success);
39
+ --button-positive-fg: #0f1216;
40
+ --button-positive-hover-bg: #52e0a0;
41
+ --button-positive-hover-fg: #0f1216;
42
+ --button-positive-active-bg: #2bb872;
43
+ --button-positive-active-fg: #0f1216;
44
+ --button-border-positive: 1px solid transparent;
45
+ --button-negative-bg: var(--danger);
46
+ --button-negative-fg: #ffffff;
47
+ --button-negative-hover-bg: #ff8585;
48
+ --button-negative-hover-fg: #ffffff;
49
+ --button-negative-active-bg: #e05555;
50
+ --button-negative-active-fg: #ffffff;
51
+ --button-border-negative: 1px solid transparent;
52
+ --button-ghost-bg: transparent;
53
+ --button-ghost-fg: var(--muted);
54
+ --button-ghost-hover-bg: rgba(255, 255, 255, 0.06);
55
+ --button-ghost-hover-fg: var(--text);
56
+ --button-ghost-active-bg: rgba(255, 255, 255, 0.1);
57
+ --button-ghost-active-fg: var(--text);
58
+ --button-border-ghost: transparent;
59
+ --button-disabled-bg: rgba(255, 255, 255, 0.08);
60
+ --button-disabled-fg: rgba(255, 255, 255, 0.4);
61
+ --button-border-disabled: 1px solid transparent;
62
+ --button-await-bg: rgba(255, 255, 255, 0.08);
63
+ --button-await-fg: rgba(255, 255, 255, 0.4);
64
+ --button-border-await: 1px solid transparent;
65
+
66
+ /* —— form / control —— */
67
+ --field-border: 1px solid var(--line);
68
+ --field-border-hover: #3a4558;
69
+ --field-border-focus: var(--accent);
70
+ --field-border-disabled: var(--line);
71
+ --field-focus-ring: rgba(91, 140, 255, 0.28);
72
+ --field-focus-shadow: 0 0 0 3px var(--field-focus-ring);
73
+ --field-background: #0c0f14;
74
+ --field-background-focus: #0c0f14;
75
+ --field-background-disabled: #141820;
76
+ --field-background-active: var(--accent);
77
+ --field-color: var(--text);
78
+ --field-color-disabled: #5c6575;
79
+ --field-placeholder: var(--muted);
80
+ --field-label-color: var(--muted);
81
+ --field-icon-color: var(--muted);
82
+
83
+ --field-check-box-border: 2px solid var(--muted);
84
+ --field-error-border: var(--danger);
85
+ --field-error-color: #ff8e8e;
86
+ --field-error-background: rgba(255, 107, 107, 0.12);
87
+ --select-background: var(--panel-elevated);
88
+ --select-color: var(--text);
89
+ --select-separator: 1px solid var(--line);
90
+ --select-li-hover-bg: rgba(255, 255, 255, 0.06);
91
+ --select-li-selected-bg: rgba(91, 140, 255, 0.18);
92
+
93
+ /* @elcrm/form — общая тень попапов (Date / Select / Color / Time) */
94
+ --popup-shadow: 0 6px 24px 0 #00000040;
95
+
96
+ /* —— modal / alert / notice —— */
97
+ --modal-background-color: var(--panel-elevated);
98
+ --modal-background-overflow: rgba(0, 0, 0, 0.65);
99
+ --modal-box-shadow: rgba(0, 0, 0, 0.5);
100
+ --modal-shadow: rgba(0, 0, 0, 0.35);
101
+ --modal-color: var(--text);
102
+ --modal-text: var(--text);
103
+ --modal-exit: var(--muted);
104
+ --modal-disabled: #5c6575;
105
+ --modal-shade: var(--panel);
106
+ --modal-tinge: rgba(255, 255, 255, 0.04);
107
+ --modal-border: var(--line);
108
+
109
+ --alert-color: var(--text);
110
+ --alert-overlay: rgba(0, 0, 0, 0.55);
111
+ --alert-background: rgba(23, 27, 34, 0.96);
112
+ --alert-button-color: var(--accent);
113
+
114
+ --notice-background: rgba(23, 27, 34, 0.96);
115
+ --notice-color: var(--text);
116
+
117
+ --color-text: var(--text);
118
+ --color-field-focus: var(--field-background);
119
+
120
+ /* —— @elcrm/components: shell (общие) + узкие avatar —— */
121
+ --shell-color: var(--text);
122
+ --shell-color-muted: var(--muted);
123
+ --shell-color-accent: var(--accent);
124
+ --shell-color-danger: var(--danger);
125
+ --shell-color-success: var(--success);
126
+ --shell-color-warning: var(--warning);
127
+ --shell-border: var(--line);
128
+ --shell-background: var(--panel);
129
+ --shell-background-muted: var(--bg);
130
+ --shell-bg: var(--bg);
131
+ --sidebar-block-bg: var(--shell-background);
132
+ --sidebar-block-border: var(--shell-border);
133
+ --sidebar-block-shadow: none;
134
+ --sidebar-item-active: var(--shell-color);
135
+ --sidebar-item-active-bg: var(--shell-background-selected);
136
+ --sidebar-icon-active: var(--shell-color-accent);
137
+ --shell-background-hover: color-mix(in srgb, var(--text) 8%, transparent);
138
+ --shell-background-selected: color-mix(in srgb, var(--accent) 14%, transparent);
139
+ --shell-shadow: var(--shadow);
140
+
141
+ --avatar-background: var(--shell-color-accent);
142
+ --avatar-color: var(--button-primary-fg);
143
+ --avatar-name-title-color: var(--shell-color);
144
+ --avatar-name-description-color: var(--shell-color-muted);
145
+ --avatar-border: 1px solid var(--shell-border);
146
+ --avatar-outline-active: 2px solid
147
+ color-mix(in srgb, var(--accent) 70%, white);
148
+ }
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Светлая тема panel: ТОЛЬКО цвета / тени / hover / border с цветом.
3
+ * Размеры — theme.css
4
+ */
5
+ html[data-theme="light"],
6
+ body[data-theme="light"] {
7
+ color-scheme: light;
8
+
9
+ /* —— палитра —— */
10
+ --bg: #f4f6f9;
11
+ --panel: #ffffff;
12
+ --panel-elevated: #ffffff;
13
+ --text: #1a1f29;
14
+ --muted: #6b7380;
15
+ --line: #d8dee8;
16
+ --accent: #111111;
17
+ --danger: #d64545;
18
+ --success: #1f9d62;
19
+ --warning: #d97706;
20
+ --shadow: 0 8px 24px rgba(26, 31, 41, 0.1);
21
+
22
+ /* —— button —— */
23
+ --button-focus-ring: rgba(59, 110, 245, 0.55);
24
+ --button-border-primary: 1px solid transparent;
25
+ --button-primary-bg: var(--text);
26
+ --button-primary-fg: #ffffff;
27
+ --button-primary-hover-bg: #2a2f38;
28
+ --button-primary-hover-fg: #ffffff;
29
+ --button-primary-active-bg: #111111;
30
+ --button-primary-active-fg: #ffffff;
31
+ --button-secondary-bg: #eef1f6;
32
+ --button-secondary-fg: var(--text);
33
+ --button-secondary-hover-bg: #e2e7ef;
34
+ --button-secondary-hover-fg: var(--text);
35
+ --button-secondary-active-bg: #d8dee8;
36
+ --button-secondary-active-fg: var(--text);
37
+ --button-border-secondary: 1px solid var(--line);
38
+ --button-positive-bg: var(--success);
39
+ --button-positive-fg: #ffffff;
40
+ --button-positive-hover-bg: #198a55;
41
+ --button-positive-hover-fg: #ffffff;
42
+ --button-positive-active-bg: #157348;
43
+ --button-positive-active-fg: #ffffff;
44
+ --button-border-positive: 1px solid transparent;
45
+ --button-negative-bg: var(--danger);
46
+ --button-negative-fg: #ffffff;
47
+ --button-negative-hover-bg: #c03c3c;
48
+ --button-negative-hover-fg: #ffffff;
49
+ --button-negative-active-bg: #a83434;
50
+ --button-negative-active-fg: #ffffff;
51
+ --button-border-negative: 1px solid transparent;
52
+ --button-ghost-bg: transparent;
53
+ --button-ghost-fg: var(--muted);
54
+ --button-ghost-hover-bg: rgba(26, 31, 41, 0.06);
55
+ --button-ghost-hover-fg: var(--text);
56
+ --button-ghost-active-bg: rgba(26, 31, 41, 0.1);
57
+ --button-ghost-active-fg: var(--text);
58
+ --button-border-ghost: transparent;
59
+ --button-disabled-bg: #e6e6e6;
60
+ --button-disabled-fg: #6b6b6b;
61
+ --button-border-disabled: 1px solid transparent;
62
+ --button-await-bg: #e6e6e6;
63
+ --button-await-fg: #6b6b6b;
64
+ --button-border-await: 1px solid transparent;
65
+
66
+ /* —— form / control —— */
67
+ --field-border: 1px solid var(--line);
68
+ --field-border-hover: #b8c0ce;
69
+ --field-border-focus: var(--accent);
70
+ --field-border-disabled: var(--line);
71
+ --field-focus-ring: rgba(59, 110, 245, 0.22);
72
+ --field-focus-shadow: 0 0 0 3px var(--field-focus-ring);
73
+ --field-background: #ffffff;
74
+ --field-background-focus: #ffffff;
75
+ --field-background-disabled: #eef1f6;
76
+ --field-background-active: var(--accent);
77
+ --field-color: var(--text);
78
+ --field-color-disabled: #9aa3af;
79
+ --field-placeholder: var(--muted);
80
+ --field-label-color: var(--muted);
81
+ --field-icon-color: var(--muted);
82
+
83
+ --field-check-box-border: 2px solid var(--muted);
84
+ --field-error-border: var(--danger);
85
+ --field-error-color: var(--danger);
86
+ --field-error-background: rgba(214, 69, 69, 0.1);
87
+ --select-background: #ffffff;
88
+ --select-color: var(--text);
89
+ --select-separator: 1px solid var(--line);
90
+ --select-li-hover-bg: rgba(26, 31, 41, 0.05);
91
+ --select-li-selected-bg: rgba(59, 110, 245, 0.12);
92
+
93
+ /* @elcrm/form — общая тень попапов (Date / Select / Color / Time) */
94
+ --popup-shadow: 0 6px 24px 0 #00000040;
95
+
96
+ /* —— modal / alert / notice —— */
97
+ --modal-background-color: #ffffff;
98
+ --modal-background-overflow: rgba(26, 31, 41, 0.4);
99
+ --modal-box-shadow: rgba(26, 31, 41, 0.18);
100
+ --modal-shadow: rgba(26, 31, 41, 0.12);
101
+ --modal-color: var(--text);
102
+ --modal-text: var(--text);
103
+ --modal-exit: var(--muted);
104
+ --modal-disabled: #9aa3af;
105
+ --modal-shade: #f4f6f9;
106
+ --modal-tinge: rgba(26, 31, 41, 0.04);
107
+ --modal-border: var(--line);
108
+
109
+ --alert-color: var(--text);
110
+ --alert-overlay: rgba(26, 31, 41, 0.4);
111
+ --alert-background: rgba(255, 255, 255, 0.97);
112
+ --alert-button-color: var(--accent);
113
+
114
+ --notice-background: rgba(255, 255, 255, 0.97);
115
+ --notice-color: var(--text);
116
+
117
+ --color-text: var(--text);
118
+ --color-field-focus: var(--field-background);
119
+
120
+ /* —— @elcrm/components: shell (общие) + узкие avatar —— */
121
+ --shell-color: var(--text);
122
+ --shell-color-muted: var(--muted);
123
+ --shell-color-accent: var(--accent);
124
+ --shell-color-danger: var(--danger);
125
+ --shell-color-success: var(--success);
126
+ --shell-color-warning: var(--warning);
127
+ --shell-border: var(--line);
128
+ --shell-background: var(--panel);
129
+ --shell-background-muted: var(--bg);
130
+ --shell-bg: var(--bg);
131
+ --sidebar-block-bg: var(--shell-background);
132
+ --sidebar-block-border: var(--shell-border);
133
+ --sidebar-block-shadow: none;
134
+ --sidebar-item-active: var(--shell-color);
135
+ --sidebar-item-active-bg: var(--shell-background-selected);
136
+ --sidebar-icon-active: var(--shell-color-accent);
137
+ --shell-background-hover: color-mix(in srgb, var(--text) 6%, transparent);
138
+ --shell-background-selected: color-mix(in srgb, var(--accent) 10%, transparent);
139
+ --shell-shadow: var(--shadow);
140
+
141
+ --avatar-background: var(--shell-color-accent);
142
+ --avatar-color: var(--button-primary-fg);
143
+ --avatar-name-title-color: var(--shell-color);
144
+ --avatar-name-description-color: var(--shell-color-muted);
145
+ --avatar-border: 1px solid var(--shell-border);
146
+ --avatar-outline-active: 2px solid
147
+ color-mix(in srgb, var(--accent) 70%, white);
148
+ }
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Общие токены panel — ТОЛЬКО размеры / радиусы / отступы / gap / тени без цвета.
3
+ * Любой цвет, color-mix, var(--text|--accent|…) — только в theme-light / theme-dark.
4
+ */
5
+ :root {
6
+ /* —— button (@elcrm/button: геометрия без цвета) —— */
7
+ --button-height: var(--control-height-m, var(--control-height));
8
+ --button-height-s: var(--control-height-s, 32px);
9
+ --button-height-m: var(--control-height-m, var(--control-height));
10
+ --button-height-l: var(--control-height-l, 48px);
11
+ --button-padding: 0.65em 1em;
12
+ --button-padding-s: 0 8px;
13
+ --button-gap: 0.5em;
14
+ --button-radius: 10px;
15
+ --button-border: 1px solid transparent;
16
+ --button-max-width: 100%;
17
+ --button-min-width-m: 200px;
18
+ --button-transition: 0.18s ease;
19
+ --button-focus-ring-offset: 2px;
20
+ --button-size-s: 14px;
21
+ --button-size-m: 16px;
22
+ --button-size-l: 18px;
23
+ --button-shadow: none;
24
+ --button-shadow-hover: none;
25
+ --button-shadow-active: none;
26
+ --button-primary-shadow: none;
27
+ --button-primary-hover-shadow: none;
28
+ --button-primary-active-shadow: none;
29
+ --button-secondary-shadow: none;
30
+ --button-secondary-hover-shadow: none;
31
+ --button-secondary-active-shadow: none;
32
+ --button-positive-shadow: none;
33
+ --button-positive-hover-shadow: none;
34
+ --button-positive-active-shadow: none;
35
+ --button-negative-shadow: none;
36
+ --button-negative-hover-shadow: none;
37
+ --button-negative-active-shadow: none;
38
+ --button-ghost-shadow: none;
39
+ --button-ghost-hover-shadow: none;
40
+ --button-ghost-active-shadow: none;
41
+
42
+ /* —— form / control —— */
43
+ --control-height: 44px;
44
+ --control-height-s: 32px;
45
+ --control-height-m: var(--control-height);
46
+ --control-height-l: 48px;
47
+ --control-radius: 10px;
48
+ --control-font-size: 15px;
49
+ --field-height: var(--control-height);
50
+ --field-width: 100%;
51
+ /* единый padding капсулы (size s|m|l → через --field-height) */
52
+ --field-padding-block: calc(var(--field-height) * 0.18);
53
+ --field-padding-inline: calc(var(--field-height) * 0.32);
54
+ --field-padding: var(--field-padding-block) var(--field-padding-inline);
55
+ --field-radius: var(--control-radius);
56
+ --field-label-size: 13px;
57
+ --field-search-min-width: 200px;
58
+ --field-search-expand-min: 180px;
59
+ --field-search-list-max-height: 240px;
60
+
61
+ /* —— modal —— */
62
+ --modal-radius: 12px;
63
+
64
+ /* —— shell (@elcrm/components: общие токены, как --control-* у form) —— */
65
+ --shell-radius: var(--control-radius);
66
+ --shell-font-size: var(--control-font-size);
67
+ --shell-font-size-sm: 13px;
68
+ --shell-font-size-lg: 18px;
69
+ --shell-font-weight: 600;
70
+ --shell-gap: 12px;
71
+ --shell-gap-sm: 8px;
72
+ --shell-gap-lg: 16px;
73
+ --shell-padding-block: 10px;
74
+ --shell-padding-inline: 14px;
75
+ --shell-padding: var(--shell-padding-block) var(--shell-padding-inline);
76
+ --shell-icon-size: 20px;
77
+ --shell-check-size: 18px;
78
+ --shell-status-size: 10px;
79
+ --shell-disabled-opacity: 0.55;
80
+ --shell-z: 1000;
81
+ --elcrm-z-popover: 1000;
82
+
83
+ /* —— узкие (@elcrm/components) —— */
84
+ --header-radius: var(--shell-radius);
85
+ --header-height: 52px;
86
+ --header-shadow: none;
87
+ --header-margin: 0;
88
+ --header-z: 20;
89
+
90
+ --section-padding: 1.5rem 1.75rem 2.5rem;
91
+ --section-title-size: 1.5rem;
92
+ --section-title-size-md: 1.25rem;
93
+ --section-auth-card-max-width: 22rem;
94
+
95
+ --nav-sections-padding: 1.5rem 1.75rem 2.5rem;
96
+ --nav-sections-nav-width: 220px;
97
+ --nav-sections-main-max-width: 720px;
98
+
99
+ --avatar-size-s: 1.5rem;
100
+ --avatar-size-m: 2rem;
101
+ --avatar-size-l: 2.75rem;
102
+ --avatar-radius: 999px;
103
+ --avatar-font-size-s: 0.6rem;
104
+ --avatar-font-size-m: 0.7rem;
105
+ --avatar-font-size-l: 0.95rem;
106
+ --avatar-font-weight: 700;
107
+ --avatar-outline-offset: 0;
108
+ --avatar-group-overlap: -0.4rem;
109
+ --avatar-group-ring: 2px;
110
+ --avatar-name-title-color: var(--shell-color);
111
+ --avatar-name-description-color: var(--shell-color-muted);
112
+
113
+ --dropdown-min-width: 12rem;
114
+ --dropdown-max-width: 20rem;
115
+ --dropdown-max-height: 20rem;
116
+ --card-pointer: auto;
117
+ --stack-grid-min: 180px;
118
+ /* Задаётся Stack через style при columns=…; дефолт — одна колонка */
119
+ --stack-columns-template: minmax(0, 1fr);
120
+ --item-column-gap: 12px;
121
+ --item-column-icon-size: 40px;
122
+ --item-column-icon-radius: 999px;
123
+ --stat-value-size: 1.75rem;
124
+ --sidebar-width: 260px;
125
+ --sidebar-pad-x: 12px;
126
+ --sidebar-pad-y: 16px;
127
+ --sidebar-block-radius: 14px;
128
+ --sidebar-item-font-size: 13px;
129
+ --sidebar-item-padding: 6px 10px;
130
+ --sidebar-icon-size: 16px;
131
+ --sidebar-group-font-size: 11px;
132
+ --pricing-card-min-width: 16rem;
133
+ --pricing-table-label-width: 10rem;
134
+ }
135
+
136
+ /* —— база приложения (без захардкоженных цветов) —— */
137
+ :root {
138
+ font-family: "IBM Plex Sans", system-ui, sans-serif;
139
+ line-height: 1.45;
140
+ }
141
+
142
+ * {
143
+ box-sizing: border-box;
144
+ }
145
+
146
+ html,
147
+ body {
148
+ margin: 0;
149
+ min-height: 100vh;
150
+ color: var(--text);
151
+ background: var(--bg);
152
+ }
153
+
154
+ #root {
155
+ min-height: 100vh;
156
+ }
157
+
158
+ #root[data-page="main"] {
159
+ display: flex;
160
+ flex-direction: column;
161
+ }
162
+
163
+ .muted {
164
+ margin: 0;
165
+ font-size: 0.9rem;
166
+ color: var(--muted);
167
+ }
168
+
169
+ .app-error {
170
+ padding: 2rem;
171
+ color: var(--text);
172
+ }
173
+
174
+ .app-error pre {
175
+ white-space: pre-wrap;
176
+ color: var(--danger);
177
+ }
@@ -0,0 +1 @@
1
+ /// <reference types="vite/client" />
@@ -0,0 +1,19 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "useDefineForClassFields": true,
5
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+ "moduleResolution": "bundler",
9
+ "allowImportingTsExtensions": true,
10
+ "isolatedModules": true,
11
+ "moduleDetection": "force",
12
+ "noEmit": true,
13
+ "jsx": "react-jsx",
14
+ "strict": true,
15
+ "noUnusedLocals": false,
16
+ "noUnusedParameters": false
17
+ },
18
+ "include": ["src"]
19
+ }
@@ -0,0 +1,14 @@
1
+ import { defineConfig } from "vite";
2
+ import react from "@vitejs/plugin-react";
3
+
4
+ /**
5
+ * `@elcrm/crypto` — `export namespace Crypto` из .ts.
6
+ * Prebundle Vite не даёт `default` → «does not provide an export named 'default'».
7
+ */
8
+ export default defineConfig({
9
+ plugins: [react()],
10
+ server: { port: 5173 },
11
+ optimizeDeps: {
12
+ exclude: ["@elcrm/crypto"],
13
+ },
14
+ });
@@ -14,7 +14,7 @@ bun run dev
14
14
 
15
15
  Демо-вход: `admin` / `admin`
16
16
 
17
- Зависимость shell UI: `@elcrm/components@0.0.1` (npm).
17
+ Зависимость shell UI: `@elcrm/components` (npm).
18
18
 
19
19
  ## Структура
20
20
 
@@ -10,20 +10,20 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@elcrm/alert": "0.1.1",
13
- "@elcrm/api": "^0.1.55",
14
- "@elcrm/button": "1.0.2",
15
- "@elcrm/components": "0.0.1",
16
- "@elcrm/core": "0.1.2",
17
- "@elcrm/crypto": "0.0.1",
13
+ "@elcrm/api": "0.1.55",
14
+ "@elcrm/button": "1.1.0",
15
+ "@elcrm/components": "0.1.2",
16
+ "@elcrm/core": "0.1.3",
17
+ "@elcrm/crypto": "0.0.2",
18
18
  "@elcrm/error-boundary": "0.0.2",
19
- "@elcrm/form": "0.1.2",
19
+ "@elcrm/form": "0.1.8",
20
20
  "@elcrm/modal": "0.0.34",
21
21
  "@elcrm/notice": "0.1.3",
22
22
  "@elcrm/notifications": "0.3.1",
23
- "@elcrm/passkey": "^0.0.1",
23
+ "@elcrm/passkey": "0.2.3",
24
24
  "@elcrm/router": "0.0.58",
25
- "@elcrm/search": "0.1.1",
26
- "@elcrm/setting": "^0.0.6",
25
+ "@elcrm/search": "0.1.5",
26
+ "@elcrm/setting": "0.0.6",
27
27
  "@elcrm/state": "0.0.7",
28
28
  "@elcrm/tooltip": "0.1.0",
29
29
  "react": "^18.2.0",
@@ -6,7 +6,7 @@ import { Button } from "@elcrm/button";
6
6
  import { Notice } from "@elcrm/notice";
7
7
  import { PasswordField, StringField, useForm } from "@elcrm/form";
8
8
  import { Crypto } from "@elcrm/crypto";
9
- import { usePasskeySupport } from "@elcrm/passkey";
9
+ import { usePasskeySupport } from "@elcrm/passkey/react";
10
10
 
11
11
  /**
12
12
  * Экран входа (`Section variant="auth"`).
@@ -80,38 +80,6 @@ body[data-theme="dark"] {
80
80
  --field-label-color: var(--muted);
81
81
  --field-icon-color: var(--muted);
82
82
 
83
- /* —— search (@elcrm/search) —— */
84
- --search-border: var(--field-border);
85
- --search-border-focus: var(--field-border-focus);
86
- --search-background: var(--field-background);
87
- --search-color: var(--field-color);
88
- --search-placeholder: var(--field-placeholder);
89
- --search-icon-color: var(--field-icon-color);
90
- --search-focus-shadow: var(--field-focus-shadow);
91
- --search-clear-hover-color: var(--field-color);
92
- --search-clear-hover-bg: rgba(255, 255, 255, 0.08);
93
- --search-badge-border: 1px solid var(--line);
94
- --search-badge-background: rgba(255, 255, 255, 0.06);
95
- --search-badge-color: var(--muted);
96
- --search-list-border: 1px solid var(--line);
97
- --search-list-background: #12161e;
98
- --search-list-color: var(--field-color);
99
- --search-list-shadow: 0 10px 28px rgba(0, 0, 0, 0.45);
100
- --search-option-active-bg: rgba(91, 140, 255, 0.16);
101
- --search-option-active-color: var(--text);
102
- --search-option-meta-color: var(--muted);
103
- --search-ghost-bg: transparent;
104
- --search-ghost-bg-focus: rgba(255, 255, 255, 0.06);
105
- --search-ghost-fg: var(--text);
106
- --search-border-ghost: 1px solid transparent;
107
- --search-border-ghost-focus: 1px solid var(--line);
108
- --search-ghost-focus-shadow: none;
109
- --search-filled-bg: rgba(255, 255, 255, 0.08);
110
- --search-filled-bg-focus: rgba(255, 255, 255, 0.12);
111
- --search-filled-fg: var(--text);
112
- --search-border-filled: 1px solid transparent;
113
- --search-border-filled-focus: 1px solid var(--line);
114
- --search-filled-focus-shadow: none;
115
83
  --field-check-box-border: 2px solid var(--muted);
116
84
  --field-error-border: var(--danger);
117
85
  --field-error-color: #ff8e8e;
@@ -159,12 +127,21 @@ body[data-theme="dark"] {
159
127
  --shell-border: var(--line);
160
128
  --shell-background: var(--panel);
161
129
  --shell-background-muted: var(--bg);
130
+ --shell-bg: var(--bg);
131
+ --sidebar-block-bg: var(--shell-background);
132
+ --sidebar-block-border: var(--shell-border);
133
+ --sidebar-block-shadow: none;
134
+ --sidebar-item-active: var(--shell-color);
135
+ --sidebar-item-active-bg: var(--shell-background-selected);
136
+ --sidebar-icon-active: var(--shell-color-accent);
162
137
  --shell-background-hover: color-mix(in srgb, var(--text) 8%, transparent);
163
138
  --shell-background-selected: color-mix(in srgb, var(--accent) 14%, transparent);
164
139
  --shell-shadow: var(--shadow);
165
140
 
166
141
  --avatar-background: var(--shell-color-accent);
167
142
  --avatar-color: var(--button-primary-fg);
143
+ --avatar-name-title-color: var(--shell-color);
144
+ --avatar-name-description-color: var(--shell-color-muted);
168
145
  --avatar-border: 1px solid var(--shell-border);
169
146
  --avatar-outline-active: 2px solid
170
147
  color-mix(in srgb, var(--accent) 70%, white);
@@ -80,38 +80,6 @@ body[data-theme="light"] {
80
80
  --field-label-color: var(--muted);
81
81
  --field-icon-color: var(--muted);
82
82
 
83
- /* —— search (@elcrm/search) —— */
84
- --search-border: var(--field-border);
85
- --search-border-focus: var(--field-border-focus);
86
- --search-background: var(--field-background);
87
- --search-color: var(--field-color);
88
- --search-placeholder: var(--field-placeholder);
89
- --search-icon-color: var(--field-icon-color);
90
- --search-focus-shadow: var(--field-focus-shadow);
91
- --search-clear-hover-color: var(--field-color);
92
- --search-clear-hover-bg: rgba(26, 31, 41, 0.08);
93
- --search-badge-border: 1px solid var(--line);
94
- --search-badge-background: #eef1f6;
95
- --search-badge-color: var(--muted);
96
- --search-list-border: 1px solid var(--line);
97
- --search-list-background: var(--field-background);
98
- --search-list-color: var(--field-color);
99
- --search-list-shadow: 0 8px 24px rgba(15, 18, 22, 0.12);
100
- --search-option-active-bg: rgba(59, 110, 245, 0.1);
101
- --search-option-active-color: var(--text);
102
- --search-option-meta-color: var(--muted);
103
- --search-ghost-bg: transparent;
104
- --search-ghost-bg-focus: rgba(26, 31, 41, 0.04);
105
- --search-ghost-fg: var(--text);
106
- --search-border-ghost: 1px solid transparent;
107
- --search-border-ghost-focus: 1px solid var(--line);
108
- --search-ghost-focus-shadow: none;
109
- --search-filled-bg: #eef1f6;
110
- --search-filled-bg-focus: #e2e7ef;
111
- --search-filled-fg: var(--text);
112
- --search-border-filled: 1px solid transparent;
113
- --search-border-filled-focus: 1px solid var(--line);
114
- --search-filled-focus-shadow: none;
115
83
  --field-check-box-border: 2px solid var(--muted);
116
84
  --field-error-border: var(--danger);
117
85
  --field-error-color: var(--danger);
@@ -159,12 +127,21 @@ body[data-theme="light"] {
159
127
  --shell-border: var(--line);
160
128
  --shell-background: var(--panel);
161
129
  --shell-background-muted: var(--bg);
130
+ --shell-bg: var(--bg);
131
+ --sidebar-block-bg: var(--shell-background);
132
+ --sidebar-block-border: var(--shell-border);
133
+ --sidebar-block-shadow: none;
134
+ --sidebar-item-active: var(--shell-color);
135
+ --sidebar-item-active-bg: var(--shell-background-selected);
136
+ --sidebar-icon-active: var(--shell-color-accent);
162
137
  --shell-background-hover: color-mix(in srgb, var(--text) 6%, transparent);
163
138
  --shell-background-selected: color-mix(in srgb, var(--accent) 10%, transparent);
164
139
  --shell-shadow: var(--shadow);
165
140
 
166
141
  --avatar-background: var(--shell-color-accent);
167
142
  --avatar-color: var(--button-primary-fg);
143
+ --avatar-name-title-color: var(--shell-color);
144
+ --avatar-name-description-color: var(--shell-color-muted);
168
145
  --avatar-border: 1px solid var(--shell-border);
169
146
  --avatar-outline-active: 2px solid
170
147
  color-mix(in srgb, var(--accent) 70%, white);