iwgt 2.4.12 → 2.4.13

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.
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Генераторы для info.json и messages.json
3
+ */
4
+ import type { WidgetConfig } from './types.js';
5
+ /**
6
+ * Генерирует имя виджета из описания
7
+ */
8
+ export declare function generateWidgetName(description: string): string;
9
+ /**
10
+ * Генерирует info.json
11
+ */
12
+ export declare function generateInfoJson(config: WidgetConfig): Record<string, any>;
13
+ /**
14
+ * Генерирует messages.json
15
+ * Использует только те ключи, которых нет в глобальных messages
16
+ * Глобальные ключи: background, indentation, content, adaptive, widget_background_color,
17
+ * wide_background, wide_content, padding_top, padding_bottom, content_max_width,
18
+ * remove_padding_at_edges, hide_desktop, hide_mobile и другие
19
+ */
20
+ export declare function generateMessages(description: string): Record<string, any>;
21
+ //# sourceMappingURL=info-generator.d.ts.map
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Генераторы для info.json и messages.json
3
+ */
4
+ /**
5
+ * Генерирует имя виджета из описания
6
+ */
7
+ export function generateWidgetName(description) {
8
+ const words = description.split(' ').slice(0, 4);
9
+ return words.map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');
10
+ }
11
+ /**
12
+ * Определяет widget_list_kinds в зависимости от категории виджета
13
+ */
14
+ function getWidgetListKinds(category) {
15
+ // Соответствие категорий и widget_list_kinds
16
+ const categoryToListKinds = {
17
+ 'headers': ['header'],
18
+ 'footers': ['footer'],
19
+ 'cart': ['cart'],
20
+ 'products-cards': ['product'],
21
+ // Все остальные категории
22
+ };
23
+ return categoryToListKinds[category] || ['content', 'footer'];
24
+ }
25
+ /**
26
+ * Генерирует info.json
27
+ */
28
+ export function generateInfoJson(config) {
29
+ const infoJson = {
30
+ type: config.type === 'simple_widget_type' ? 'SimpleWidgetType' : 'BlockListWidgetType',
31
+ handle: config.handle,
32
+ page_kinds: ["all"],
33
+ widget_list_kinds: getWidgetListKinds(config.category),
34
+ generation: 4,
35
+ name: generateWidgetName(config.description),
36
+ widget_category_handle: config.category,
37
+ libraries: config.libraries.includes('my-layout') ? config.libraries : [...config.libraries, 'my-layout'],
38
+ };
39
+ // block_template_handle обязателен только для BlockListWidgetType
40
+ if (config.type === 'block_list_widget_type' && config.blockTemplate) {
41
+ infoJson.block_template_handle = config.blockTemplate.handle;
42
+ }
43
+ return infoJson;
44
+ }
45
+ /**
46
+ * Генерирует messages.json
47
+ * Использует только те ключи, которых нет в глобальных messages
48
+ * Глобальные ключи: background, indentation, content, adaptive, widget_background_color,
49
+ * wide_background, wide_content, padding_top, padding_bottom, content_max_width,
50
+ * remove_padding_at_edges, hide_desktop, hide_mobile и другие
51
+ */
52
+ export function generateMessages(description) {
53
+ const name = generateWidgetName(description);
54
+ return {
55
+ ru: {
56
+ widget_name: name,
57
+ // Только специфичные для виджета переводы
58
+ // Все стандартные (background, indentation, content, adaptive и т.д.) уже есть в глобальных
59
+ },
60
+ en: {
61
+ widget_name: name,
62
+ // Только специфичные для виджета переводы
63
+ },
64
+ ua: {
65
+ widget_name: name,
66
+ // Только специфичные для виджета переводы
67
+ },
68
+ };
69
+ }
70
+ //# sourceMappingURL=info-generator.js.map
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Генераторы для настроек виджетов (settings_data.json, settings_form.json)
3
+ */
4
+ import type { BaseSetting as Setting } from '../types/settings.js';
5
+ import type { SettingsFormResult } from './types.js';
6
+ /**
7
+ * Генерирует settings_data.json
8
+ */
9
+ export declare function generateSettingsData(commonSettings: Setting[]): Record<string, any>;
10
+ /**
11
+ * Генерирует settings_form.json
12
+ * Структура согласно документации:
13
+ * - content: специфичные настройки виджета
14
+ * - design: типовые настройки (фон, отступы, адаптивность)
15
+ *
16
+ * ВАЖНО:
17
+ * - Игнорирует виджеты без разделения на content/design
18
+ * - Предотвращает дублирование имен настроек
19
+ * - Автоматически классифицирует настройки по типу
20
+ */
21
+ export declare function generateSettingsForm(commonSettings: Setting[]): SettingsFormResult;
22
+ //# sourceMappingURL=settings-generator.d.ts.map
@@ -0,0 +1,455 @@
1
+ /**
2
+ * Генераторы для настроек виджетов (settings_data.json, settings_form.json)
3
+ */
4
+ /**
5
+ * Паттерны настроек, которые относятся к дизайну
6
+ * На основе анализа 350+ системных виджетов
7
+ */
8
+ const DESIGN_SETTINGS_PATTERNS = [
9
+ // Цвета и фон
10
+ 'bg', 'background', 'color', 'border', 'shadow',
11
+ // Размеры и отступы
12
+ 'width', 'height', 'padding', 'margin', 'gap', 'spacing',
13
+ 'pt', 'pb', 'pl', 'pr', 'mt', 'mb', 'ml', 'mr',
14
+ 'layout-pt', 'layout-pb', 'layout-wide-bg', 'layout-wide-content',
15
+ 'layout-content-max-width', 'layout-edge',
16
+ // Скрытие элементов
17
+ 'hide-desktop', 'hide-mobile', 'hide-',
18
+ // Изображения
19
+ 'img-ratio', 'img-fit', 'img-border-radius', 'banner-border-radius',
20
+ 'image-ratio', 'image-fit', 'image-border-radius',
21
+ // Шрифты и типографика
22
+ 'font-size', 'font-weight', 'font-family', 'text-align', 'line-height',
23
+ 'heading-ratio', 'heading-weight', 'text-color',
24
+ // Сетка и позиционирование
25
+ 'grid', 'flex', 'align', 'justify', 'position',
26
+ 'catalog-grid', 'menu-grid', 'banner-grid',
27
+ // Анимации и эффекты
28
+ 'hover', 'transition', 'animation', 'zoom', 'scale',
29
+ 'switch-img', 'zoom-on-hover',
30
+ // Скругления и границы
31
+ 'border-radius', 'radius', 'rounding',
32
+ // Рейтинг и стикеры
33
+ 'rating-color', 'sticker-font-size', 'sale-bg',
34
+ // Продуктовые стили
35
+ 'product-border-radius', 'product-background', 'product-bg',
36
+ 'product-info-align', 'product-desc-limit',
37
+ // Меню и навигация
38
+ 'menu-grid-list', 'menu-img', 'subcollections-items-limit',
39
+ 'menu-item-min-width', 'menu-row-gap', 'menu-column-gap',
40
+ // Адаптивность
41
+ 'mobile', 'desktop', 'responsive', 'breakpoint'
42
+ ];
43
+ /**
44
+ * Паттерны настроек, которые относятся к контенту
45
+ * На основе анализа 350+ системных виджетов
46
+ */
47
+ const CONTENT_SETTINGS_PATTERNS = [
48
+ // Текст и контент
49
+ 'title', 'heading', 'text', 'description', 'content',
50
+ 'current-page-description', 'current-page-short-description',
51
+ // Функциональность
52
+ 'enable', 'disable', 'show', 'open', 'close',
53
+ 'open-first', 'enable-server-reload',
54
+ // Данные и информация
55
+ 'phone', 'email', 'address', 'working-hours',
56
+ 'logo-img', 'logo-max-width',
57
+ // Навигация и меню
58
+ 'menu-handle', 'navigation',
59
+ // Продукты и каталог
60
+ 'product-hide', 'hide-variants', 'hide-sku', 'hide-description',
61
+ 'hide-rating', 'hide-compare', 'hide-favorite',
62
+ 'show-selected-variant-photos',
63
+ // Ссылки и виджеты
64
+ 'link-to-widget', 'category-handle',
65
+ // Информационные блоки
66
+ 'info', 'help', 'quick-checkout-info', 'favorites-enable',
67
+ // Настройки отображения контента
68
+ 'display-property-color', 'video-before-image'
69
+ ];
70
+ /**
71
+ * Определяет, относится ли настройка к дизайну
72
+ */
73
+ function isDesignSetting(settingName) {
74
+ return DESIGN_SETTINGS_PATTERNS.some(pattern => settingName.includes(pattern) || settingName === pattern);
75
+ }
76
+ /**
77
+ * Определяет, относится ли настройка к контенту
78
+ */
79
+ function isContentSetting(settingName) {
80
+ return CONTENT_SETTINGS_PATTERNS.some(pattern => settingName.includes(pattern) || settingName === pattern);
81
+ }
82
+ /**
83
+ * Создает элемент настройки для settings_form
84
+ */
85
+ function createSettingItem(setting) {
86
+ const item = {
87
+ name: setting.name,
88
+ label: setting.label || setting.name,
89
+ type: setting.type,
90
+ };
91
+ // Добавляем class если указан
92
+ if (setting.class) {
93
+ item.class = setting.class;
94
+ }
95
+ // Специфичные свойства для разных типов с типизацией
96
+ switch (setting.type) {
97
+ case 'checkbox':
98
+ item.value = setting.value !== undefined ? setting.value : false;
99
+ break;
100
+ case 'text':
101
+ case 'rich-text':
102
+ item.value = setting.value || "";
103
+ break;
104
+ case 'select':
105
+ item.options = setting.options || [{ text: "{{ messages.default }}", value: "default" }];
106
+ item.value = setting.value || null;
107
+ break;
108
+ case 'button-group':
109
+ item.options = setting.options || [];
110
+ item.value = setting.value || null;
111
+ break;
112
+ case 'number':
113
+ case 'range':
114
+ item.min = setting.min !== undefined ? setting.min : 0;
115
+ item.max = setting.max !== undefined ? setting.max : 100;
116
+ item.step = setting.step !== undefined ? setting.step : 1;
117
+ if (setting.unit)
118
+ item.unit = setting.unit;
119
+ if (setting.with_btns)
120
+ item.with_btns = setting.with_btns;
121
+ break;
122
+ case 'color':
123
+ item.value = setting.value || "#ffffff";
124
+ if (setting.clearable)
125
+ item.clearable = setting.clearable;
126
+ if (setting.fallback)
127
+ item.fallback = setting.fallback;
128
+ break;
129
+ case 'file':
130
+ item.value = setting.value || null;
131
+ if (setting['with-generate-logo'])
132
+ item['with-generate-logo'] = setting['with-generate-logo'];
133
+ break;
134
+ case 'blog':
135
+ item.value = setting.value || null;
136
+ if (setting.edit_admin_link)
137
+ item.edit_admin_link = setting.edit_admin_link;
138
+ break;
139
+ case 'info':
140
+ item.value = setting.value || "";
141
+ break;
142
+ case 'current-page-description':
143
+ item.value = setting.value || "";
144
+ break;
145
+ case 'icon_group':
146
+ item.value = setting.value || "";
147
+ break;
148
+ case 'link-to-widget':
149
+ item.value = setting.value || "";
150
+ break;
151
+ case 'button_switch':
152
+ item.value = setting.value !== undefined ? setting.value : false;
153
+ break;
154
+ default:
155
+ // Для неизвестных типов используем базовые свойства
156
+ item.value = setting.value || "";
157
+ }
158
+ // Общие свойства
159
+ if (setting.help)
160
+ item.help = setting.help;
161
+ if (setting.general !== undefined)
162
+ item.general = setting.general;
163
+ if (setting.general_position)
164
+ item.general_position = setting.general_position;
165
+ if (setting.general_label)
166
+ item.general_label = setting.general_label;
167
+ if (setting.enable_server_reload)
168
+ item.enable_server_reload = setting.enable_server_reload;
169
+ if (setting.hide_mobile)
170
+ item.hide_mobile = setting.hide_mobile;
171
+ return item;
172
+ }
173
+ /**
174
+ * Генерирует settings_data.json
175
+ */
176
+ export function generateSettingsData(commonSettings) {
177
+ const data = {
178
+ // Стандартные настройки design
179
+ bg: "",
180
+ "layout-wide-bg": false,
181
+ "layout-pt": 2,
182
+ "layout-pb": 2,
183
+ "layout-content-max-width": 1200,
184
+ "layout-wide-content": false,
185
+ "layout-edge": false,
186
+ "hide-desktop": false,
187
+ "hide-mobile": false,
188
+ };
189
+ // Добавляем дефолтное значение для заголовка
190
+ data.title = "";
191
+ // Добавляем настройки из категории
192
+ commonSettings.forEach(setting => {
193
+ // Генерируем дефолтное значение в зависимости от типа
194
+ switch (setting.type) {
195
+ case 'checkbox':
196
+ data[setting.name] = setting.value === true ? true : false;
197
+ break;
198
+ case 'text':
199
+ case 'rich-text':
200
+ data[setting.name] = setting.value || '';
201
+ break;
202
+ case 'number':
203
+ case 'range':
204
+ data[setting.name] = setting.value !== undefined ? setting.value : (setting.min || 0);
205
+ break;
206
+ case 'color':
207
+ data[setting.name] = setting.value || '';
208
+ break;
209
+ case 'select':
210
+ data[setting.name] = setting.value || (setting.options?.[0]?.value || 'default');
211
+ break;
212
+ case 'button-group':
213
+ data[setting.name] = setting.value || (setting.options?.[0]?.value || 'default');
214
+ break;
215
+ case 'file':
216
+ data[setting.name] = setting.value || null;
217
+ break;
218
+ case 'blog':
219
+ data[setting.name] = setting.value || null;
220
+ break;
221
+ case 'info':
222
+ data[setting.name] = setting.value || '';
223
+ break;
224
+ case 'current-page-description':
225
+ data[setting.name] = setting.value || '';
226
+ break;
227
+ case 'icon_group':
228
+ data[setting.name] = setting.value || '';
229
+ break;
230
+ case 'link-to-widget':
231
+ data[setting.name] = setting.value || '';
232
+ break;
233
+ case 'button_switch':
234
+ data[setting.name] = setting.value === true ? true : false;
235
+ break;
236
+ default:
237
+ data[setting.name] = setting.value || '';
238
+ }
239
+ });
240
+ return data;
241
+ }
242
+ /**
243
+ * Генерирует settings_form.json
244
+ * Структура согласно документации:
245
+ * - content: специфичные настройки виджета
246
+ * - design: типовые настройки (фон, отступы, адаптивность)
247
+ *
248
+ * ВАЖНО:
249
+ * - Игнорирует виджеты без разделения на content/design
250
+ * - Предотвращает дублирование имен настроек
251
+ * - Автоматически классифицирует настройки по типу
252
+ */
253
+ export function generateSettingsForm(commonSettings) {
254
+ const form = {
255
+ content: [],
256
+ design: [
257
+ {
258
+ type: "group",
259
+ name: "{{ messages.background }}",
260
+ items: [
261
+ {
262
+ name: "bg",
263
+ label: "{{ messages.widget_background_color }}",
264
+ type: "color",
265
+ clearable: true
266
+ },
267
+ {
268
+ class: "checkbox",
269
+ name: "layout-wide-bg",
270
+ label: "{{ messages.wide_background }}",
271
+ type: "checkbox"
272
+ }
273
+ ]
274
+ },
275
+ {
276
+ type: "group",
277
+ name: "{{ messages.indentation }}",
278
+ items: [
279
+ {
280
+ class: "range",
281
+ name: "layout-pt",
282
+ min: 0,
283
+ max: 10,
284
+ step: 0.5,
285
+ label: "{{ messages.padding_top }} (vw)",
286
+ type: "number",
287
+ with_btns: true,
288
+ unit: "vw"
289
+ },
290
+ {
291
+ class: "range",
292
+ name: "layout-pb",
293
+ min: 0,
294
+ max: 10,
295
+ step: 0.5,
296
+ label: "{{ messages.padding_bottom }} (vw)",
297
+ type: "number",
298
+ with_btns: true,
299
+ unit: "vw"
300
+ }
301
+ ]
302
+ },
303
+ {
304
+ type: "group",
305
+ name: "{{ messages.content }}",
306
+ items: [
307
+ {
308
+ class: "number",
309
+ name: "layout-content-max-width",
310
+ min: 400,
311
+ max: 2000,
312
+ label: "{{ messages.content_max_width }}",
313
+ type: "number",
314
+ unit: "px",
315
+ hide_mobile: true
316
+ },
317
+ {
318
+ class: "checkbox",
319
+ name: "layout-wide-content",
320
+ label: "{{ messages.wide_content }}",
321
+ type: "checkbox",
322
+ hide_mobile: true
323
+ },
324
+ {
325
+ class: "checkbox",
326
+ name: "layout-edge",
327
+ label: "{{ messages.remove_padding_at_edges }}",
328
+ type: "checkbox"
329
+ }
330
+ ]
331
+ },
332
+ {
333
+ type: "group",
334
+ name: "{{ messages.adaptive }}",
335
+ items: [
336
+ {
337
+ class: "checkbox",
338
+ name: "hide-desktop",
339
+ label: "{{ messages.hide_desktop }}",
340
+ type: "checkbox"
341
+ },
342
+ {
343
+ class: "checkbox",
344
+ name: "hide-mobile",
345
+ label: "{{ messages.hide_mobile }}",
346
+ type: "checkbox"
347
+ }
348
+ ]
349
+ }
350
+ ]
351
+ };
352
+ let count = 11; // базовые настройки в design (bg, layout-wide-bg, layout-pt, layout-pb, layout-content-max-width, layout-wide-content, layout-edge, hide-desktop, hide-mobile)
353
+ // Проверяем, есть ли настройки без разделения на content/design
354
+ // Если все настройки относятся к дизайну, игнорируем их (как в системных виджетах)
355
+ const hasContentSettings = commonSettings.some(setting => isContentSetting(setting.name));
356
+ if (!hasContentSettings && commonSettings.length > 0) {
357
+ console.warn('⚠️ Все настройки относятся к дизайну. Игнорируем их, как в системных виджетах без разделения content/design.');
358
+ // Добавляем только базовую группу с заголовком
359
+ form.content.push({
360
+ type: "group",
361
+ name: "{{ messages.content_settings }}",
362
+ items: [
363
+ {
364
+ class: "text",
365
+ name: "title",
366
+ label: "{{ messages.title }}",
367
+ type: "text",
368
+ general: true
369
+ }
370
+ ]
371
+ });
372
+ count++;
373
+ return { form, count };
374
+ }
375
+ // Собираем уникальные имена настроек для предотвращения дубликатов
376
+ const usedNames = new Set();
377
+ // Добавляем имена базовых настроек design
378
+ ['bg', 'layout-wide-bg', 'layout-pt', 'layout-pb', 'layout-content-max-width', 'layout-wide-content', 'layout-edge', 'hide-desktop', 'hide-mobile'].forEach(name => {
379
+ usedNames.add(name);
380
+ });
381
+ // Разделяем настройки на content и design
382
+ const contentSettings = [];
383
+ const designSettings = [];
384
+ commonSettings.forEach(setting => {
385
+ // Проверяем дубликаты
386
+ if (usedNames.has(setting.name)) {
387
+ console.warn(`⚠️ Дублирующееся имя настройки "${setting.name}". Пропускаем.`);
388
+ return;
389
+ }
390
+ usedNames.add(setting.name);
391
+ // Классифицируем настройку
392
+ if (isDesignSetting(setting.name)) {
393
+ designSettings.push(setting);
394
+ }
395
+ else if (isContentSetting(setting.name)) {
396
+ contentSettings.push(setting);
397
+ }
398
+ else {
399
+ // Если не можем определить, добавляем в content по умолчанию
400
+ console.warn(`⚠️ Неопределенный тип настройки "${setting.name}". Добавляем в content.`);
401
+ contentSettings.push(setting);
402
+ }
403
+ });
404
+ // Добавляем настройки дизайна в соответствующие группы
405
+ if (designSettings.length > 0) {
406
+ const designGroup = {
407
+ type: "group",
408
+ name: "{{ messages.widget_settings }}",
409
+ items: [],
410
+ };
411
+ designSettings.forEach(setting => {
412
+ const item = createSettingItem(setting);
413
+ designGroup.items.push(item);
414
+ count++;
415
+ });
416
+ if (designGroup.items.length > 0) {
417
+ form.design.push(designGroup);
418
+ }
419
+ }
420
+ // Добавляем настройки контента
421
+ if (contentSettings.length > 0) {
422
+ const categoryGroup = {
423
+ type: "group",
424
+ name: "{{ messages.settings }}",
425
+ items: [],
426
+ };
427
+ contentSettings.forEach(setting => {
428
+ const item = createSettingItem(setting);
429
+ categoryGroup.items.push(item);
430
+ count++;
431
+ });
432
+ if (categoryGroup.items.length > 0) {
433
+ form.content.push(categoryGroup);
434
+ }
435
+ }
436
+ else {
437
+ // Если нет специфичных настроек контента, добавляем минимальную группу с заголовком
438
+ form.content.push({
439
+ type: "group",
440
+ name: "{{ messages.content_settings }}",
441
+ items: [
442
+ {
443
+ class: "text",
444
+ name: "title",
445
+ label: "{{ messages.title }}",
446
+ type: "text",
447
+ general: true
448
+ }
449
+ ]
450
+ });
451
+ count++;
452
+ }
453
+ return { form, count };
454
+ }
455
+ //# sourceMappingURL=settings-generator.js.map
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Генераторы для snippet файлов (liquid, scss, js)
3
+ */
4
+ import type { WidgetConfig } from './types.js';
5
+ import type { BlockTemplate } from '../types/index.js';
6
+ /**
7
+ * Генерирует snippet.liquid
8
+ * ВАЖНО: Код автоматически оборачивается системой в div.layout с CSS-переменными
9
+ * НЕ добавляйте обёртку layout вручную!
10
+ */
11
+ export declare function generateSnippetLiquid(config: WidgetConfig, cleanMode?: boolean): string;
12
+ /**
13
+ * Генерирует snippet.scss
14
+ * ВАЖНО: Весь код оборачивается в класс виджета
15
+ * Используйте & для обращения к родительскому элементу (layout + класс виджета)
16
+ */
17
+ export declare function generateSnippetScss(config: WidgetConfig, cleanMode?: boolean): string;
18
+ /**
19
+ * Генерирует snippet.js
20
+ * ВАЖНО:
21
+ * - Код автоматически оборачивается в try/catch
22
+ * - Доступны переменные: widget (селектор) и $widget (jQuery объект)
23
+ * - НЕ используйте Vue.js или другие фреймворки!
24
+ * - На странице может быть несколько экземпляров виджета - используйте $widget.each()
25
+ */
26
+ export declare function generateSnippetJs(config: WidgetConfig, cleanMode?: boolean): string;
27
+ /**
28
+ * Генерирует setup.json для block_list_widget_type
29
+ */
30
+ export declare function generateSetupJson(blockTemplate: BlockTemplate): Record<string, any>;
31
+ //# sourceMappingURL=snippet-generator.d.ts.map