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.
- package/dist/data/references/commonjs-reference.json +1 -1
- package/dist/data/references/javascript-guide.json +0 -13
- package/dist/data/references/liquid-filters.json +1 -1
- package/dist/data/references/liquid-variables.json +1 -1
- package/dist/data/references/settings-types.json +3717 -0
- package/dist/generators/collections-menu.d.ts +13 -0
- package/dist/generators/collections-menu.js +268 -0
- package/dist/generators/index.d.ts +15 -104
- package/dist/generators/index.js +22 -1098
- package/dist/generators/info-generator.d.ts +21 -0
- package/dist/generators/info-generator.js +70 -0
- package/dist/generators/settings-generator.d.ts +22 -0
- package/dist/generators/settings-generator.js +455 -0
- package/dist/generators/snippet-generator.d.ts +31 -0
- package/dist/generators/snippet-generator.js +484 -0
- package/dist/generators/types.d.ts +43 -0
- package/dist/generators/types.js +5 -0
- package/dist/generators/validation.d.ts +13 -0
- package/dist/generators/validation.js +71 -0
- package/dist/server-http.js +1 -1
- package/dist/server.d.ts +4 -0
- package/dist/server.js +99 -4
- package/dist/types/index.d.ts +3 -1
- package/dist/types/settings.d.ts +123 -0
- package/dist/types/settings.js +71 -0
- package/dist/utils/settings.d.ts +258 -0
- package/dist/utils/settings.js +412 -0
- package/package.json +1 -1
|
@@ -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
|