@xipkg/calls-config 0.0.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.
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # @xipkg/calls-config
2
+
3
+ Статический конфиг для calls-пакетов: сетка видео, onboarding IDs, baseline audio options.
4
+
5
+ Env-зависимые настройки передаются через `CallsRuntimeConfigProvider` из `@xipkg/calls-providers`.
6
+
7
+ См. [docs/migrations/calls-runtime-config.md](../../docs/migrations/calls-runtime-config.md)
@@ -0,0 +1,71 @@
1
+ declare const ONBOARDING_IDS: {
2
+ readonly WHITEBOARD_BUTTON: "calls-onboarding-whiteboard-button";
3
+ readonly LINK_BUTTON: "calls-onboarding-link-button";
4
+ readonly SETTINGS_BUTTON: "calls-onboarding-settings-button";
5
+ readonly BACK_BUTTON: "calls-onboarding-back-button";
6
+ };
7
+
8
+ /**
9
+ * Конфигурация для адаптивной сетки пользователей в ВКС
10
+ * Оптимизирована для соотношения сторон 1:1 и всех устройств
11
+ */
12
+ interface GridLayoutConfig {
13
+ columns: number;
14
+ rows: number;
15
+ minTiles: number;
16
+ maxTiles: number;
17
+ minWidth: number;
18
+ minHeight: number;
19
+ name: string;
20
+ }
21
+ declare const GRID_CONFIG: {
22
+ readonly TILE: {
23
+ readonly HEIGHT: 200;
24
+ readonly WIDTH: 200;
25
+ readonly MIN_HEIGHT: 120;
26
+ readonly MIN_WIDTH: 120;
27
+ readonly ASPECT_RATIO: 1;
28
+ };
29
+ readonly BREAKPOINTS: {
30
+ readonly xs: 360;
31
+ readonly sm: 640;
32
+ readonly md: 768;
33
+ readonly lg: 1024;
34
+ readonly xl: 1280;
35
+ readonly '2xl': 1536;
36
+ };
37
+ readonly MAX_TILES_PER_PAGE: {
38
+ readonly xs: 1;
39
+ readonly sm: 4;
40
+ readonly md: 6;
41
+ readonly lg: 9;
42
+ readonly xl: 12;
43
+ readonly '2xl': 16;
44
+ };
45
+ readonly PAGINATION: {
46
+ readonly SWIPE_THRESHOLD: 50;
47
+ readonly AUTO_HIDE_DELAY: 2000;
48
+ };
49
+ readonly CAROUSEL: {
50
+ readonly SCROLL_BAR_WIDTH: 17;
51
+ readonly MIN_VISIBLE_TILES: 1;
52
+ };
53
+ };
54
+ /**
55
+ * Функция для выбора подходящей конфигурации на основе размера экрана
56
+ */
57
+ declare const getGridLayoutsForScreen: (screenWidth: number) => GridLayoutConfig[];
58
+ /**
59
+ * Функция для получения оптимальной конфигурации для конкретного количества участников
60
+ */
61
+ declare const getOptimalGridLayout: (participantCount: number, screenWidth: number) => GridLayoutConfig | null;
62
+ type GridBreakpoint = keyof typeof GRID_CONFIG.BREAKPOINTS;
63
+
64
+ /** Базовые WebRTC-ограничения для захвата аудио (эхо, шум, AGC). */
65
+ declare function getBaselineAudioCaptureOptions(): {
66
+ echoCancellation: true;
67
+ noiseSuppression: true;
68
+ autoGainControl: true;
69
+ };
70
+
71
+ export { GRID_CONFIG, type GridBreakpoint, type GridLayoutConfig, ONBOARDING_IDS, getBaselineAudioCaptureOptions, getGridLayoutsForScreen, getOptimalGridLayout };
package/dist/index.mjs ADDED
@@ -0,0 +1,242 @@
1
+ // src/onboarding/onboarding.ts
2
+ var ONBOARDING_IDS = {
3
+ WHITEBOARD_BUTTON: "calls-onboarding-whiteboard-button",
4
+ LINK_BUTTON: "calls-onboarding-link-button",
5
+ SETTINGS_BUTTON: "calls-onboarding-settings-button",
6
+ BACK_BUTTON: "calls-onboarding-back-button"
7
+ };
8
+
9
+ // src/grid/grid.ts
10
+ var GRID_CONFIG = {
11
+ // Размеры тайлов с соотношением сторон 1:1
12
+ TILE: {
13
+ HEIGHT: 200,
14
+ WIDTH: 200,
15
+ MIN_HEIGHT: 120,
16
+ MIN_WIDTH: 120,
17
+ ASPECT_RATIO: 1
18
+ // Квадратные плитки
19
+ },
20
+ // Брейкпоинты для адаптивности
21
+ BREAKPOINTS: {
22
+ xs: 360,
23
+ // Мобильные телефоны
24
+ sm: 640,
25
+ // Планшеты
26
+ md: 768,
27
+ // Небольшие десктопы
28
+ lg: 1024,
29
+ // Десктопы
30
+ xl: 1280,
31
+ // Большие экраны
32
+ "2xl": 1536
33
+ // Очень большие экраны
34
+ },
35
+ // Максимальное количество тайлов на странице
36
+ MAX_TILES_PER_PAGE: {
37
+ xs: 1,
38
+ sm: 4,
39
+ md: 6,
40
+ lg: 9,
41
+ xl: 12,
42
+ "2xl": 16
43
+ },
44
+ // Настройки пагинации
45
+ PAGINATION: {
46
+ SWIPE_THRESHOLD: 50,
47
+ AUTO_HIDE_DELAY: 2e3
48
+ },
49
+ // Настройки карусели
50
+ CAROUSEL: {
51
+ SCROLL_BAR_WIDTH: 17,
52
+ MIN_VISIBLE_TILES: 1
53
+ }
54
+ };
55
+ var CUSTOM_GRID_LAYOUTS = [
56
+ // 1 участник - полноэкранный режим
57
+ {
58
+ columns: 1,
59
+ rows: 1,
60
+ minTiles: 1,
61
+ maxTiles: 1,
62
+ minWidth: 0,
63
+ minHeight: 0,
64
+ name: "single-participant"
65
+ },
66
+ // 2 участника - горизонтальная линия
67
+ {
68
+ columns: 2,
69
+ rows: 1,
70
+ minTiles: 2,
71
+ maxTiles: 2,
72
+ minWidth: 0,
73
+ minHeight: 0,
74
+ name: "two-participants"
75
+ },
76
+ // 3-4 участника - квадрат 2x2
77
+ {
78
+ columns: 2,
79
+ rows: 2,
80
+ minTiles: 3,
81
+ maxTiles: 4,
82
+ minWidth: 0,
83
+ minHeight: 0,
84
+ name: "small-grid"
85
+ },
86
+ // 5-6 участников - 3x2 (оптимально для средних экранов)
87
+ {
88
+ columns: 3,
89
+ rows: 2,
90
+ minTiles: 5,
91
+ maxTiles: 6,
92
+ minWidth: 0,
93
+ minHeight: 0,
94
+ name: "medium-grid"
95
+ },
96
+ // 7-9 участников - квадрат 3x3
97
+ {
98
+ columns: 3,
99
+ rows: 3,
100
+ minTiles: 7,
101
+ maxTiles: 9,
102
+ minWidth: 0,
103
+ minHeight: 0,
104
+ name: "large-grid"
105
+ },
106
+ // 10-12 участников - 4x3
107
+ {
108
+ columns: 4,
109
+ rows: 3,
110
+ minTiles: 10,
111
+ maxTiles: 12,
112
+ minWidth: 0,
113
+ minHeight: 0,
114
+ name: "wide-grid"
115
+ },
116
+ // 13-16 участников - квадрат 4x4
117
+ {
118
+ columns: 4,
119
+ rows: 4,
120
+ minTiles: 13,
121
+ maxTiles: 16,
122
+ minWidth: 0,
123
+ minHeight: 0,
124
+ name: "full-grid"
125
+ }
126
+ ];
127
+ var MOBILE_GRID_LAYOUTS = [
128
+ // 1 участник
129
+ {
130
+ columns: 1,
131
+ rows: 1,
132
+ minTiles: 1,
133
+ maxTiles: 1,
134
+ minWidth: 0,
135
+ minHeight: 0,
136
+ name: "mobile-single"
137
+ },
138
+ // 2-4 участника - вертикальная колонка
139
+ {
140
+ columns: 1,
141
+ rows: 4,
142
+ minTiles: 2,
143
+ maxTiles: 4,
144
+ minWidth: 0,
145
+ minHeight: 0,
146
+ name: "mobile-vertical"
147
+ },
148
+ // 5-6 участников - 2x3
149
+ {
150
+ columns: 2,
151
+ rows: 3,
152
+ minTiles: 5,
153
+ maxTiles: 6,
154
+ minWidth: 0,
155
+ minHeight: 0,
156
+ name: "mobile-small-grid"
157
+ },
158
+ // 7-9 участников - 3x3
159
+ {
160
+ columns: 3,
161
+ rows: 3,
162
+ minTiles: 7,
163
+ maxTiles: 9,
164
+ minWidth: 0,
165
+ minHeight: 0,
166
+ name: "mobile-grid"
167
+ }
168
+ ];
169
+ var TABLET_GRID_LAYOUTS = [
170
+ // 1-2 участника
171
+ {
172
+ columns: 2,
173
+ rows: 1,
174
+ minTiles: 1,
175
+ maxTiles: 2,
176
+ minWidth: 0,
177
+ minHeight: 0,
178
+ name: "tablet-small"
179
+ },
180
+ // 3-4 участника - 2x2
181
+ {
182
+ columns: 2,
183
+ rows: 2,
184
+ minTiles: 3,
185
+ maxTiles: 4,
186
+ minWidth: 0,
187
+ minHeight: 0,
188
+ name: "tablet-medium"
189
+ },
190
+ // 5-6 участников - 3x2
191
+ {
192
+ columns: 3,
193
+ rows: 2,
194
+ minTiles: 5,
195
+ maxTiles: 6,
196
+ minWidth: 0,
197
+ minHeight: 0,
198
+ name: "tablet-large"
199
+ },
200
+ // 7-9 участников - 3x3
201
+ {
202
+ columns: 3,
203
+ rows: 3,
204
+ minTiles: 7,
205
+ maxTiles: 9,
206
+ minWidth: 0,
207
+ minHeight: 0,
208
+ name: "tablet-grid"
209
+ }
210
+ ];
211
+ var getGridLayoutsForScreen = (screenWidth) => {
212
+ if (screenWidth < 640) {
213
+ return MOBILE_GRID_LAYOUTS;
214
+ } else if (screenWidth < 1024) {
215
+ return TABLET_GRID_LAYOUTS;
216
+ } else {
217
+ return CUSTOM_GRID_LAYOUTS;
218
+ }
219
+ };
220
+ var getOptimalGridLayout = (participantCount, screenWidth) => {
221
+ const layouts = getGridLayoutsForScreen(screenWidth);
222
+ const suitableLayout = layouts.find(
223
+ (layout) => participantCount >= layout.minTiles && participantCount <= layout.maxTiles
224
+ );
225
+ if (suitableLayout) {
226
+ return suitableLayout;
227
+ }
228
+ return layouts[layouts.length - 1] || null;
229
+ };
230
+
231
+ // src/callConfig/callConfig.ts
232
+ function getBaselineAudioCaptureOptions() {
233
+ return {
234
+ echoCancellation: true,
235
+ noiseSuppression: true,
236
+ autoGainControl: true
237
+ };
238
+ }
239
+
240
+ export { GRID_CONFIG, ONBOARDING_IDS, getBaselineAudioCaptureOptions, getGridLayoutsForScreen, getOptimalGridLayout };
241
+ //# sourceMappingURL=index.mjs.map
242
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/onboarding/onboarding.ts","../src/grid/grid.ts","../src/callConfig/callConfig.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export const ONBOARDING_IDS = {\n WHITEBOARD_BUTTON: 'calls-onboarding-whiteboard-button',\n LINK_BUTTON: 'calls-onboarding-link-button',\n SETTINGS_BUTTON: 'calls-onboarding-settings-button',\n BACK_BUTTON: 'calls-onboarding-back-button',\n} as const;\n","/**\n * Конфигурация для адаптивной сетки пользователей в ВКС\n * Оптимизирована для соотношения сторон 1:1 и всех устройств\n */\n\nexport interface GridLayoutConfig {\n columns: number;\n rows: number;\n minTiles: number;\n maxTiles: number;\n minWidth: number;\n minHeight: number;\n name: string;\n}\n\nexport const GRID_CONFIG = {\n // Размеры тайлов с соотношением сторон 1:1\n TILE: {\n HEIGHT: 200,\n WIDTH: 200,\n MIN_HEIGHT: 120,\n MIN_WIDTH: 120,\n ASPECT_RATIO: 1, // Квадратные плитки\n },\n\n // Брейкпоинты для адаптивности\n BREAKPOINTS: {\n xs: 360, // Мобильные телефоны\n sm: 640, // Планшеты\n md: 768, // Небольшие десктопы\n lg: 1024, // Десктопы\n xl: 1280, // Большие экраны\n '2xl': 1536, // Очень большие экраны\n },\n\n // Максимальное количество тайлов на странице\n MAX_TILES_PER_PAGE: {\n xs: 1,\n sm: 4,\n md: 6,\n lg: 9,\n xl: 12,\n '2xl': 16,\n },\n\n // Настройки пагинации\n PAGINATION: {\n SWIPE_THRESHOLD: 50,\n AUTO_HIDE_DELAY: 2000,\n },\n\n // Настройки карусели\n CAROUSEL: {\n SCROLL_BAR_WIDTH: 17,\n MIN_VISIBLE_TILES: 1,\n },\n} as const;\n\n/**\n * Кастомные конфигурации gridLayouts для адаптивной сетки\n * Основано на рекомендациях LiveKit для соотношения сторон 1:1\n */\nexport const CUSTOM_GRID_LAYOUTS: GridLayoutConfig[] = [\n // 1 участник - полноэкранный режим\n {\n columns: 1,\n rows: 1,\n minTiles: 1,\n maxTiles: 1,\n minWidth: 0,\n minHeight: 0,\n name: 'single-participant',\n },\n\n // 2 участника - горизонтальная линия\n {\n columns: 2,\n rows: 1,\n minTiles: 2,\n maxTiles: 2,\n minWidth: 0,\n minHeight: 0,\n name: 'two-participants',\n },\n\n // 3-4 участника - квадрат 2x2\n {\n columns: 2,\n rows: 2,\n minTiles: 3,\n maxTiles: 4,\n minWidth: 0,\n minHeight: 0,\n name: 'small-grid',\n },\n\n // 5-6 участников - 3x2 (оптимально для средних экранов)\n {\n columns: 3,\n rows: 2,\n minTiles: 5,\n maxTiles: 6,\n minWidth: 0,\n minHeight: 0,\n name: 'medium-grid',\n },\n\n // 7-9 участников - квадрат 3x3\n {\n columns: 3,\n rows: 3,\n minTiles: 7,\n maxTiles: 9,\n minWidth: 0,\n minHeight: 0,\n name: 'large-grid',\n },\n\n // 10-12 участников - 4x3\n {\n columns: 4,\n rows: 3,\n minTiles: 10,\n maxTiles: 12,\n minWidth: 0,\n minHeight: 0,\n name: 'wide-grid',\n },\n\n // 13-16 участников - квадрат 4x4\n {\n columns: 4,\n rows: 4,\n minTiles: 13,\n maxTiles: 16,\n minWidth: 0,\n minHeight: 0,\n name: 'full-grid',\n },\n];\n\n/**\n * Конфигурации для мобильных устройств\n */\nexport const MOBILE_GRID_LAYOUTS: GridLayoutConfig[] = [\n // 1 участник\n {\n columns: 1,\n rows: 1,\n minTiles: 1,\n maxTiles: 1,\n minWidth: 0,\n minHeight: 0,\n name: 'mobile-single',\n },\n\n // 2-4 участника - вертикальная колонка\n {\n columns: 1,\n rows: 4,\n minTiles: 2,\n maxTiles: 4,\n minWidth: 0,\n minHeight: 0,\n name: 'mobile-vertical',\n },\n\n // 5-6 участников - 2x3\n {\n columns: 2,\n rows: 3,\n minTiles: 5,\n maxTiles: 6,\n minWidth: 0,\n minHeight: 0,\n name: 'mobile-small-grid',\n },\n\n // 7-9 участников - 3x3\n {\n columns: 3,\n rows: 3,\n minTiles: 7,\n maxTiles: 9,\n minWidth: 0,\n minHeight: 0,\n name: 'mobile-grid',\n },\n];\n\n/**\n * Конфигурации для планшетов\n */\nexport const TABLET_GRID_LAYOUTS: GridLayoutConfig[] = [\n // 1-2 участника\n {\n columns: 2,\n rows: 1,\n minTiles: 1,\n maxTiles: 2,\n minWidth: 0,\n minHeight: 0,\n name: 'tablet-small',\n },\n\n // 3-4 участника - 2x2\n {\n columns: 2,\n rows: 2,\n minTiles: 3,\n maxTiles: 4,\n minWidth: 0,\n minHeight: 0,\n name: 'tablet-medium',\n },\n\n // 5-6 участников - 3x2\n {\n columns: 3,\n rows: 2,\n minTiles: 5,\n maxTiles: 6,\n minWidth: 0,\n minHeight: 0,\n name: 'tablet-large',\n },\n\n // 7-9 участников - 3x3\n {\n columns: 3,\n rows: 3,\n minTiles: 7,\n maxTiles: 9,\n minWidth: 0,\n minHeight: 0,\n name: 'tablet-grid',\n },\n];\n\n/**\n * Функция для выбора подходящей конфигурации на основе размера экрана\n */\nexport const getGridLayoutsForScreen = (screenWidth: number): GridLayoutConfig[] => {\n if (screenWidth < 640) {\n return MOBILE_GRID_LAYOUTS;\n } else if (screenWidth < 1024) {\n return TABLET_GRID_LAYOUTS;\n } else {\n return CUSTOM_GRID_LAYOUTS;\n }\n};\n\n/**\n * Функция для получения оптимальной конфигурации для конкретного количества участников\n */\nexport const getOptimalGridLayout = (\n participantCount: number,\n screenWidth: number,\n): GridLayoutConfig | null => {\n const layouts = getGridLayoutsForScreen(screenWidth);\n\n const suitableLayout = layouts.find(\n (layout) => participantCount >= layout.minTiles && participantCount <= layout.maxTiles,\n );\n\n if (suitableLayout) {\n return suitableLayout;\n }\n\n return layouts[layouts.length - 1] || null;\n};\n\nexport type GridBreakpoint = keyof typeof GRID_CONFIG.BREAKPOINTS;\nexport type GridConfig = typeof GRID_CONFIG;\n","/** Базовые WebRTC-ограничения для захвата аудио (эхо, шум, AGC). */\nexport function getBaselineAudioCaptureOptions(): {\n echoCancellation: true;\n noiseSuppression: true;\n autoGainControl: true;\n} {\n return {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n };\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@xipkg/calls-config",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "development": "./index.ts",
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.mjs",
10
+ "default": "./dist/index.mjs"
11
+ }
12
+ },
13
+ "license": "MIT",
14
+ "scripts": {
15
+ "lint": "eslint \"**/*.{ts,tsx}\"",
16
+ "dev": "tsup --watch",
17
+ "build": "tsup"
18
+ },
19
+ "dependencies": {},
20
+ "devDependencies": {
21
+ "@eslint/js": "^9.19.0",
22
+ "common.eslint": "*",
23
+ "common.typescript": "*",
24
+ "@types/node": "^20.3.1",
25
+ "@xipkg/eslint": "3.2.0",
26
+ "@xipkg/typescript": "latest",
27
+ "eslint": "^9.19.0",
28
+ "eslint-plugin-react-hooks": "^5.0.0",
29
+ "eslint-plugin-react-refresh": "^0.4.18",
30
+ "globals": "^15.14.0",
31
+ "typescript": "~5.7.2",
32
+ "typescript-eslint": "^8.22.0"
33
+ },
34
+ "description": "Static configuration for xi.effect calls",
35
+ "author": "xi.effect",
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "main": "./dist/index.mjs",
40
+ "types": "./dist/index.d.ts",
41
+ "files": [
42
+ "dist"
43
+ ]
44
+ }