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.
- package/README.md +1 -1
- package/dist/index.js +1982 -1443
- package/package.json +3 -3
- package/templates/elcrm-cursor/rules/elcrm-jsdoc.mdc +1 -1
- package/templates/elcrm-cursor/rules/elcrm-packages.mdc +1 -1
- package/templates/elcrm-cursor/rules/elcrm-ui.mdc +3 -1
- package/templates/elcrm-docs/BUTTON.elCRM.md +3 -3
- package/templates/elcrm-docs/CLI.elCRM.md +26 -12
- package/templates/elcrm-docs/COMPONENTS.elCRM.md +18 -10
- package/templates/elcrm-docs/FORM.elCRM.md +11 -3
- package/templates/elcrm-docs/ICONS.elCRM.md +2 -0
- package/templates/elcrm-docs/NOTIFICATIONS.elCRM.md +1 -1
- package/templates/elcrm-docs/SERVER.elCRM.md +3 -1
- package/templates/orbit/README.md +12 -0
- package/templates/orbit/index.html +28 -0
- package/templates/orbit/package.json +39 -0
- package/templates/orbit/src/App.tsx +34 -0
- package/templates/orbit/src/component/Nav.tsx +139 -0
- package/templates/orbit/src/lazyRoute.ts +4 -0
- package/templates/orbit/src/lib/icon.tsx +48 -0
- package/templates/orbit/src/lib/theme.ts +39 -0
- package/templates/orbit/src/main.tsx +54 -0
- package/templates/orbit/src/modules/Analytics/index.tsx +5 -0
- package/templates/orbit/src/modules/Catalog/index.tsx +7 -0
- package/templates/orbit/src/modules/Customers/index.tsx +5 -0
- package/templates/orbit/src/modules/Finances/index.tsx +5 -0
- package/templates/orbit/src/modules/Home/index.tsx +317 -0
- package/templates/orbit/src/modules/Integrations/index.tsx +7 -0
- package/templates/orbit/src/modules/Link/index.tsx +7 -0
- package/templates/orbit/src/modules/Marketing/index.tsx +5 -0
- package/templates/orbit/src/modules/Placeholder.tsx +13 -0
- package/templates/orbit/src/modules/Settings/index.tsx +22 -0
- package/templates/orbit/src/modules/Store/index.tsx +7 -0
- package/templates/orbit/src/pages/Auth.tsx +45 -0
- package/templates/orbit/src/pages/Main.tsx +29 -0
- package/templates/orbit/src/router-data.d.ts +10 -0
- package/templates/orbit/src/state.ts +28 -0
- package/templates/orbit/src/style/elcrm.css +27 -0
- package/templates/orbit/src/style/theme-dark.css +148 -0
- package/templates/orbit/src/style/theme-light.css +148 -0
- package/templates/orbit/src/style/theme.css +177 -0
- package/templates/orbit/src/vite-env.d.ts +1 -0
- package/templates/orbit/tsconfig.json +19 -0
- package/templates/orbit/vite.config.ts +14 -0
- package/templates/panel/README.md +1 -1
- package/templates/panel/web/package.json +9 -9
- package/templates/panel/web/src/pages/Auth.tsx +1 -1
- package/templates/panel/web/src/style/theme-dark.css +9 -32
- package/templates/panel/web/src/style/theme-light.css +9 -32
- package/templates/panel/web/src/style/theme.css +20 -39
- 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
|
+
});
|
|
@@ -10,20 +10,20 @@
|
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@elcrm/alert": "0.1.1",
|
|
13
|
-
"@elcrm/api": "
|
|
14
|
-
"@elcrm/button": "1.0
|
|
15
|
-
"@elcrm/components": "0.
|
|
16
|
-
"@elcrm/core": "0.1.
|
|
17
|
-
"@elcrm/crypto": "0.0.
|
|
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.
|
|
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": "
|
|
23
|
+
"@elcrm/passkey": "0.2.3",
|
|
24
24
|
"@elcrm/router": "0.0.58",
|
|
25
|
-
"@elcrm/search": "0.1.
|
|
26
|
-
"@elcrm/setting": "
|
|
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);
|