iwgt 2.3.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/LICENSE +22 -0
- package/README.md +27 -0
- package/dist/data/references/block-templates-full.json +2420 -0
- package/dist/data/references/category-block-templates.json +328 -0
- package/dist/data/references/category-settings.json +12530 -0
- package/dist/data/references/collections-menu-patterns.json +306 -0
- package/dist/data/references/commonjs-reference.json +1403 -0
- package/dist/data/references/icons-registry.json +724 -0
- package/dist/data/references/libraries-registry.json +632 -0
- package/dist/data/references/liquid-filters.json +497 -0
- package/dist/data/references/liquid-variables.json +3196 -0
- package/dist/data/references/messages-templates.json +3116 -0
- package/dist/data/references/my-layout-reference.json +95 -0
- package/dist/generators/index.d.ts +87 -0
- package/dist/generators/index.js +1052 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +5 -0
- package/dist/server-http.d.ts +7 -0
- package/dist/server-http.js +165 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.js +579 -0
- package/dist/tools/index.d.ts +38 -0
- package/dist/tools/index.js +430 -0
- package/dist/types/index.d.ts +181 -0
- package/dist/types/index.js +3 -0
- package/dist/utils/index.d.ts +29 -0
- package/dist/utils/index.js +157 -0
- package/package.json +28 -0
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Collections Menu Patterns Reference",
|
|
3
|
+
"description": "Паттерны для генерации меню категорий в виджетах InSales",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"patterns": [
|
|
6
|
+
{
|
|
7
|
+
"id": "two_level_hierarchical",
|
|
8
|
+
"name": "Двухуровневое иерархическое меню",
|
|
9
|
+
"description": "Меню с двумя уровнями: основные категории и подкатегории",
|
|
10
|
+
"useCase": "Идеально для шапок сайта, где нужно показать основные категории с их подкатегориями",
|
|
11
|
+
"structure": "root_category.subcollections -> subcollections",
|
|
12
|
+
"cacheKeyPattern": "cache_menu_key_{{ widget_drop.list_item_id }}_{{ collections.last_updated_at }}_{{ language.locale }}_{{ custom_params }}",
|
|
13
|
+
"requiredSettings": [
|
|
14
|
+
{
|
|
15
|
+
"handle": "subcollections-items-limit",
|
|
16
|
+
"type": "to_integer",
|
|
17
|
+
"default": 10,
|
|
18
|
+
"description": "Ограничение количества подкатегорий для отображения"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"handle": "hide-menu-photo",
|
|
22
|
+
"type": "checkbox",
|
|
23
|
+
"default": false,
|
|
24
|
+
"description": "Скрыть фотографии категорий"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"handle": "hide-counts",
|
|
28
|
+
"type": "checkbox",
|
|
29
|
+
"default": false,
|
|
30
|
+
"description": "Скрыть счетчики товаров"
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"liquidCode": "{% assign subcollections_items_limit = widget_settings.subcollections-items-limit | to_integer %}\n{% capture cache_menu_key %}cache_menu_key_{{ collections.last_updated_at }}_{{ language.locale }}_{{ widget_settings.hide-menu-photo }}_{{ widget_settings.subcollections-items-limit }}{% endcapture %}\n\n<ul class=\"menu\" data-navigation data-subcollections-items-limit={{subcollections_items_limit}}>\n {% cache cache_menu_key %}\n {% assign level_1 = collections.root_category.subcollections %}\n {% for level_1_item in level_1 %}\n {% assign level_2 = level_1_item.subcollections %}\n \n <li class=\"menu__item is-level-1\" data-navigation-item>\n <div class=\"menu__controls\">\n <a href=\"{{ level_1_item.url }}\" class=\"menu__link\" data-navigation-link=\"{{ level_1_item.url }}\">\n {{ level_1_item.title }}\n </a>\n \n {% if level_2.size > 0 %}\n <button class=\"menu__show-submenu-btn\" type=\"button\">\n <i class=\"icon icon-angle-down\"></i>\n </button>\n {% endif %}\n </div>\n \n {% if level_2.size > 0 %}\n <ul class=\"menu__submenu\" data-navigation-submenu>\n {% for level_2_item in level_2 %}\n <li class=\"menu__item {%if forloop.index > subcollections_items_limit %}is-hide{% endif%}\" data-navigation-item>\n <div class=\"menu__controls\">\n <a href=\"{{ level_2_item.url }}\" class=\"menu__link\" data-navigation-link=\"{{ level_2_item.url }}\">\n {{ level_2_item.title }}\n {% if editor_mode? or widget_settings.hide-counts != true %}\n {% if level_2_item.products_count > 0 %}\n <span class=\"menu__item-count\">{{ level_2_item.products_count }}</span>\n {% endif %}\n {% endif %}\n </a>\n </div>\n </li>\n {% endfor %}\n </ul>\n {% endif %}\n </li>\n {% endfor %}\n {% endcache %}\n</ul>",
|
|
34
|
+
"features": [
|
|
35
|
+
"Кеширование меню",
|
|
36
|
+
"Поддержка фотографий категорий с fallback",
|
|
37
|
+
"Ограничение количества подкатегорий",
|
|
38
|
+
"Счетчики товаров",
|
|
39
|
+
"Data-атрибуты для JavaScript навигации"
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "multi_level_flatten",
|
|
44
|
+
"name": "Многоуровневое меню через flatten_branch",
|
|
45
|
+
"description": "Меню с поддержкой произвольной глубины вложенности через flatten_branch",
|
|
46
|
+
"useCase": "Для сайдбаров, мобильных меню, где нужна глубокая иерархия",
|
|
47
|
+
"structure": "root_category.flatten_branch с контролем уровней",
|
|
48
|
+
"cacheKeyPattern": "cache_menu_key_{{ widget_drop.list_item_id }}_{{ collections.last_updated_at }}_{{ language.locale }}_{{ level_limit }}",
|
|
49
|
+
"requiredSettings": [
|
|
50
|
+
{
|
|
51
|
+
"handle": "level-limit",
|
|
52
|
+
"type": "to_integer",
|
|
53
|
+
"default": 3,
|
|
54
|
+
"description": "Максимальная глубина вложенности меню"
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
"liquidCode": "{% assign level_limit = widget_settings.level-limit | default: 3 | to_integer %}\n{% capture cache_menu_key %}cache_menu_key_{{ collections.last_updated_at }}_{{ language.locale }}_{{ level_limit }}{% endcapture %}\n{% assign prev_link_level = 1 %}\n\n<ul class=\"menu\" data-navigation>\n {% cache cache_menu_key %}\n {% assign root_level = collections.root_category.level %}\n {% for link in collections.root_category.flatten_branch %}\n {% assign node_level = link.level | minus: root_level %}\n {% assign _in_limit = level_limit | minus: node_level %}\n {% assign _next_level_in_limit = _in_limit | minus: 1 %}\n \n {% assign show_level = false %}\n {% if _in_limit >= 0 %}\n {% assign show_level = true %}\n {% endif %}\n \n {% assign show_next_level = false %}\n {% if link.subcollections.size > 0 and _next_level_in_limit >= 0 %}\n {% assign show_next_level = true %}\n {% endif %}\n \n {% if show_level %}\n {% assign level_difference = prev_link_level | minus: link.level | plus: root_level %}\n \n {% if level_difference > 0 %}\n {% for i in (1..level_difference) %}\n {% unless forloop.first %}</li>{% endunless %}\n </ul>\n {% endfor %}\n </li>\n {% endif %}\n \n <li class=\"menu__item\" data-navigation-item>\n <div class=\"menu__controls {% if show_next_level %}with-submenu{% endif %}\">\n <a href=\"{{ link.url }}\" class=\"menu__link\" data-navigation-link=\"{{ link.url }}\">\n {{ link.title }}\n </a>\n \n {% if show_next_level %}\n <button class=\"menu__show-submenu-btn\" type=\"button\">\n <i class=\"icon icon-angle-down\"></i>\n </button>\n {% endif %}\n </div>\n \n {% if show_next_level %}\n <ul class=\"menu__submenu\" data-navigation-submenu>\n {% endif %}\n \n {% assign prev_link_level = node_level %}\n \n {% unless show_next_level %}\n </li>\n {% endunless %}\n \n {% if forloop.last %}\n {% assign prev_link_level = node_level | minus: 1 %}\n {% for i in (1..prev_link_level) %}\n </ul>\n {% endfor %}\n {% endif %}\n {% endif %}\n {% endfor %}\n {% endcache %}\n</ul>",
|
|
58
|
+
"features": [
|
|
59
|
+
"Произвольная глубина вложенности",
|
|
60
|
+
"Контроль отображаемых уровней",
|
|
61
|
+
"Автоматическое построение дерева",
|
|
62
|
+
"Оптимальное для больших каталогов"
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "simple_subcollections",
|
|
67
|
+
"name": "Простое меню подкатегорий",
|
|
68
|
+
"description": "Одноуровневый список подкатегорий выбранной категории",
|
|
69
|
+
"useCase": "Для страниц категорий, навигационных блоков в контенте",
|
|
70
|
+
"structure": "collections[handle].subcollections",
|
|
71
|
+
"cacheKeyPattern": "cache_menu_key_{{ widget_drop.list_item_id }}_{{ collections.last_updated_at }}_{{ language.locale }}_{{ collection_handle }}",
|
|
72
|
+
"requiredSettings": [
|
|
73
|
+
{
|
|
74
|
+
"handle": "collection-handle",
|
|
75
|
+
"type": "string",
|
|
76
|
+
"default": "",
|
|
77
|
+
"description": "Handle категории (по умолчанию root_category)"
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
"liquidCode": "{% capture cache_menu_key %}cache_menu_key_{{ collections.last_updated_at }}_{{ language.locale }}_{{ widget_settings.collection-handle }}{% endcapture %}\n{% cache cache_menu_key %}\n {% assign source_handle = widget_settings.collection-handle | default: collections.root_category.handle %}\n {% assign collection_list = collections[source_handle].subcollections %}\n {% if collection_list.size > 0 %}\n <div class=\"menu-wrapper\">\n <ul class=\"menu\" data-navigation>\n {% for collection_item in collection_list %}\n <li class=\"menu__item\" data-navigation-item>\n <div class=\"menu__controls\">\n <a href=\"{{ collection_item.url }}\" class=\"menu__link\" data-navigation-link=\"{{ collection_item.url }}\">\n {{ collection_item.title }}\n </a>\n </div>\n </li>\n {% endfor %}\n </ul>\n </div>\n {% endif %}\n{% endcache %}",
|
|
81
|
+
"features": [
|
|
82
|
+
"Простая структура",
|
|
83
|
+
"Выбор родительской категории",
|
|
84
|
+
"Минимальный код",
|
|
85
|
+
"Быстрое отображение"
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "flat_collections_list",
|
|
90
|
+
"name": "Плоский список всех категорий",
|
|
91
|
+
"description": "Простой список всех категорий магазина",
|
|
92
|
+
"useCase": "Для простых каталогов, лендингов",
|
|
93
|
+
"structure": "collections (все категории)",
|
|
94
|
+
"cacheKeyPattern": "cache_menu_key_{{ widget_drop.list_item_id }}_{{ collections.last_updated_at }}_{{ language.locale }}",
|
|
95
|
+
"requiredSettings": [],
|
|
96
|
+
"liquidCode": "{% capture cache_menu_key %}cache_menu_key_{{ collections.last_updated_at }}_{{ language.locale }}{% endcapture %}\n{% cache cache_menu_key %}\n {% if collections.root_category.subcollections.size > 0 %}\n <div class=\"menu-wrapper\" data-navigation>\n {% for collection in collections %}\n {% if collection.products_count > 0 %}\n <div class=\"menu__item\" data-navigation-item>\n <a class=\"menu__link\" href=\"{{ collection.url }}\" data-navigation-link=\"{{ collection.url }}\">\n <span class=\"menu__title\">{{ collection.title }}</span>\n </a>\n </div>\n {% endif %}\n {% endfor %}\n </div>\n {% endif %}\n{% endcache %}",
|
|
97
|
+
"features": [
|
|
98
|
+
"Максимально простая структура",
|
|
99
|
+
"Только категории с товарами",
|
|
100
|
+
"Без иерархии",
|
|
101
|
+
"Легкий в стилизации"
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "tree_structure_flatten",
|
|
106
|
+
"name": "Древовидная структура через collections.flatten",
|
|
107
|
+
"description": "Полное дерево категорий с автоматическим построением через collections.flatten",
|
|
108
|
+
"useCase": "Для полных каталогов, карт сайта",
|
|
109
|
+
"structure": "collections.flatten с level_difference",
|
|
110
|
+
"cacheKeyPattern": "cache_menu_key_{{ widget_drop.list_item_id }}_{{ collections.last_updated_at }}_{{ language.locale }}",
|
|
111
|
+
"requiredSettings": [],
|
|
112
|
+
"liquidCode": "{% capture cache_menu_key %}cache_menu_key_{{ collections.last_updated_at }}_{{ language.locale }}{% endcapture %}\n{% cache cache_menu_key %}\n {% for collection in collections.flatten %}\n {% if collection.first? %}<ul class=\"menu\" data-navigation>{% endif %}\n {% if collection.show? %}\n <li class=\"menu__item\" data-navigation-item>\n <a href=\"{{ collection.url }}\" class=\"menu__link\" data-navigation-link=\"{{ collection.url }}\">\n {{ collection.title }}\n </a>\n </li>\n {% endif %}\n {% if collection.last? %}\n {% for i in (1..collection.level_difference) %}</ul>{% endfor %}\n {% endif %}\n {% endfor %}\n{% endcache %}",
|
|
113
|
+
"features": [
|
|
114
|
+
"Полное автоматическое дерево",
|
|
115
|
+
"Работа с level_difference",
|
|
116
|
+
"Методы first? и last?",
|
|
117
|
+
"Подходит для полных каталогов"
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
],
|
|
121
|
+
"commonPatterns": {
|
|
122
|
+
"cacheKey": {
|
|
123
|
+
"description": "Формирование ключа кеша для меню",
|
|
124
|
+
"template": "{% capture cache_menu_key %}cache_menu_key_{{ prefix }}_{{ collections.last_updated_at }}_{{ language.locale }}_{{ custom_params }}{% endcapture %}",
|
|
125
|
+
"requiredVariables": [
|
|
126
|
+
"collections.last_updated_at",
|
|
127
|
+
"language.locale"
|
|
128
|
+
],
|
|
129
|
+
"explanation": "collections.last_updated_at автоматически обновит кеш при изменении категорий, language.locale обеспечит корректное кеширование для разных языков"
|
|
130
|
+
},
|
|
131
|
+
"imageFallback": {
|
|
132
|
+
"description": "Fallback для изображений категорий",
|
|
133
|
+
"code": "{% if collection.image.original_url contains 'no_image' %}\n {% if collection.products_count > 0 %}\n {% assign collection_first_product = collection.products | first %}\n {% if collection_first_product.images.size > 0 %}\n {% assign collection_photo = collection_first_product.first_image %}\n {% else %}\n {% assign collection_photo = collection.image %}\n {% endif %}\n {% else %}\n {% assign collection_photo = collection.image %}\n {% endif%}\n{% else %}\n {% assign collection_photo = collection.image %}\n{% endif %}",
|
|
134
|
+
"explanation": "Использует первое изображение товара, если у категории нет собственного изображения"
|
|
135
|
+
},
|
|
136
|
+
"levelControl": {
|
|
137
|
+
"description": "Контроль глубины отображения меню",
|
|
138
|
+
"code": "{% assign level_limit = 3 %}\n{% assign _in_limit = level_limit | minus: node_level %}\n{% if _in_limit >= 0 %}\n <!-- show item -->\n{% endif %}",
|
|
139
|
+
"explanation": "Ограничивает глубину отображения, предотвращая слишком глубокую вложенность"
|
|
140
|
+
},
|
|
141
|
+
"subcollectionsLimit": {
|
|
142
|
+
"description": "Ограничение количества подкатегорий",
|
|
143
|
+
"code": "{% assign subcollections_items_limit = widget_settings.subcollections-items-limit | to_integer %}\n{% for level_2_item in level_2 %}\n <li class=\"menu__item {%if forloop.index > subcollections_items_limit %}is-hide{% endif%}\">\n <!-- item -->\n </li>\n{% endfor %}",
|
|
144
|
+
"explanation": "Скрывает подкатегории сверх лимита через CSS класс is-hide"
|
|
145
|
+
},
|
|
146
|
+
"productsCount": {
|
|
147
|
+
"description": "Отображение счетчика товаров",
|
|
148
|
+
"code": "{% if editor_mode? or widget_settings.hide-counts != true %}\n {% if collection.products_count > 0 %}\n <span class=\"menu__item-count\">{{ collection.products_count }}</span>\n {% endif %}\n{% endif %}",
|
|
149
|
+
"explanation": "Показывает количество товаров с учетом настроек и режима редактирования"
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
"collectionMethods": {
|
|
153
|
+
"description": "Методы и свойства категорий для использования в меню",
|
|
154
|
+
"methods": [
|
|
155
|
+
{
|
|
156
|
+
"name": "level",
|
|
157
|
+
"description": "Уровень вложенности категории",
|
|
158
|
+
"example": "{{ collection.level }}",
|
|
159
|
+
"usage": "Для определения глубины и построения иерархии"
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"name": "handle",
|
|
163
|
+
"description": "Уникальный идентификатор категории",
|
|
164
|
+
"example": "{{ collection.handle }}",
|
|
165
|
+
"usage": "Для ссылок и идентификации"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"name": "title",
|
|
169
|
+
"description": "Название категории",
|
|
170
|
+
"example": "{{ collection.title }}",
|
|
171
|
+
"usage": "Отображение в меню"
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"name": "id",
|
|
175
|
+
"description": "ID категории",
|
|
176
|
+
"example": "{{ collection.id }}",
|
|
177
|
+
"usage": "Для data-атрибутов"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"name": "url",
|
|
181
|
+
"description": "URL категории",
|
|
182
|
+
"example": "{{ collection.url }}",
|
|
183
|
+
"usage": "Ссылки в меню"
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"name": "image",
|
|
187
|
+
"description": "Изображение категории",
|
|
188
|
+
"example": "{{ collection.image }}",
|
|
189
|
+
"usage": "Отображение картинок в меню"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"name": "products_count",
|
|
193
|
+
"description": "Количество товаров в категории",
|
|
194
|
+
"example": "{{ collection.products_count }}",
|
|
195
|
+
"usage": "Показ счетчиков товаров"
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"name": "subcollections",
|
|
199
|
+
"description": "Подкатегории",
|
|
200
|
+
"example": "{{ collection.subcollections }}",
|
|
201
|
+
"usage": "Построение иерархии"
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"name": "flatten_branch",
|
|
205
|
+
"description": "Плоский список всех подкатегорий",
|
|
206
|
+
"example": "{{ collection.flatten_branch }}",
|
|
207
|
+
"usage": "Для многоуровневых меню"
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"name": "first?",
|
|
211
|
+
"description": "Первая ли категория среди подкатегорий",
|
|
212
|
+
"example": "{% if collection.first? %}<ul>{% endif %}",
|
|
213
|
+
"usage": "Для построения дерева (collections.flatten)"
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"name": "last?",
|
|
217
|
+
"description": "Последняя ли категория среди подкатегорий",
|
|
218
|
+
"example": "{% if collection.last? %}</ul>{% endif %}",
|
|
219
|
+
"usage": "Для построения дерева (collections.flatten)"
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"name": "level_difference",
|
|
223
|
+
"description": "Разница уровней между текущей и предыдущей категорией",
|
|
224
|
+
"example": "{% for i in (1..collection.level_difference) %}</ul>{% endfor %}",
|
|
225
|
+
"usage": "Определение количества закрывающих тегов"
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"name": "show?",
|
|
229
|
+
"description": "Показывать ли категорию",
|
|
230
|
+
"example": "{% if collection.show? %}<!-- show item -->{% endif %}",
|
|
231
|
+
"usage": "Условное отображение"
|
|
232
|
+
}
|
|
233
|
+
]
|
|
234
|
+
},
|
|
235
|
+
"dataAttributes": {
|
|
236
|
+
"description": "Data-атрибуты для навигации",
|
|
237
|
+
"attributes": [
|
|
238
|
+
{
|
|
239
|
+
"name": "data-navigation",
|
|
240
|
+
"usage": "На ul или div контейнере меню",
|
|
241
|
+
"description": "Основной контейнер навигации"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"name": "data-navigation-item",
|
|
245
|
+
"usage": "На li элементах меню",
|
|
246
|
+
"description": "Элемент навигации"
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"name": "data-navigation-link",
|
|
250
|
+
"usage": "На a элементах с URL",
|
|
251
|
+
"description": "Ссылка навигации",
|
|
252
|
+
"example": "data-navigation-link=\"{{ collection.url }}\""
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
"name": "data-navigation-submenu",
|
|
256
|
+
"usage": "На ul подменю",
|
|
257
|
+
"description": "Подменю"
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"name": "data-menu-handle",
|
|
261
|
+
"usage": "На контейнере меню",
|
|
262
|
+
"description": "Handle меню для связи с настройками"
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
"name": "data-menu-item-id",
|
|
266
|
+
"usage": "На элементах меню",
|
|
267
|
+
"description": "Уникальный идентификатор элемента"
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"name": "data-subcollections-items-limit",
|
|
271
|
+
"usage": "На контейнере меню",
|
|
272
|
+
"description": "Лимит подкатегорий для JavaScript обработки"
|
|
273
|
+
}
|
|
274
|
+
]
|
|
275
|
+
},
|
|
276
|
+
"bestPractices": [
|
|
277
|
+
{
|
|
278
|
+
"title": "Всегда используйте кеширование",
|
|
279
|
+
"description": "Меню категорий редко изменяются, кеширование значительно ускоряет загрузку"
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
"title": "Включайте collections.last_updated_at в ключ кеша",
|
|
283
|
+
"description": "Обеспечивает автоматическое обновление кеша при изменении структуры категорий"
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"title": "Включайте language.locale в ключ кеша",
|
|
287
|
+
"description": "Обеспечивает корректное кеширование для многоязычных сайтов"
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
"title": "Используйте data-navigation атрибуты",
|
|
291
|
+
"description": "Обеспечивает корректную работу JavaScript навигации из библиотеки my-layout"
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
"title": "Ограничивайте количество подкатегорий",
|
|
295
|
+
"description": "Предотвращает перегрузку интерфейса и улучшает UX"
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
"title": "Предусматривайте fallback для изображений",
|
|
299
|
+
"description": "Обеспечивает корректное отображение даже при отсутствии изображений категорий"
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"title": "Контролируйте глубину отображения",
|
|
303
|
+
"description": "Предотвращает слишком глубокую вложенность и улучшает навигацию"
|
|
304
|
+
}
|
|
305
|
+
]
|
|
306
|
+
}
|