@hed-hog/catalog 0.0.293 → 0.0.294

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.
Files changed (45) hide show
  1. package/README.md +409 -379
  2. package/dist/catalog-resource.config.d.ts.map +1 -1
  3. package/dist/catalog-resource.config.js +51 -24
  4. package/dist/catalog-resource.config.js.map +1 -1
  5. package/dist/catalog.controller.d.ts +420 -0
  6. package/dist/catalog.controller.d.ts.map +1 -1
  7. package/dist/catalog.controller.js +98 -0
  8. package/dist/catalog.controller.js.map +1 -1
  9. package/dist/catalog.module.d.ts.map +1 -1
  10. package/dist/catalog.module.js +5 -1
  11. package/dist/catalog.module.js.map +1 -1
  12. package/dist/catalog.service.d.ts +216 -1
  13. package/dist/catalog.service.d.ts.map +1 -1
  14. package/dist/catalog.service.js +1111 -5
  15. package/dist/catalog.service.js.map +1 -1
  16. package/hedhog/data/catalog_attribute.yaml +202 -0
  17. package/hedhog/data/catalog_attribute_option.yaml +109 -0
  18. package/hedhog/data/catalog_category.yaml +47 -0
  19. package/hedhog/data/catalog_category_attribute.yaml +209 -0
  20. package/hedhog/data/menu.yaml +133 -99
  21. package/hedhog/data/route.yaml +72 -8
  22. package/hedhog/frontend/app/[resource]/page.tsx.ejs +391 -33
  23. package/hedhog/frontend/app/_components/catalog-ai-form-assist-dialog.tsx.ejs +340 -0
  24. package/hedhog/frontend/app/_components/catalog-resource-form-sheet.tsx.ejs +907 -92
  25. package/hedhog/frontend/app/_lib/catalog-resources.tsx.ejs +929 -1161
  26. package/hedhog/frontend/messages/en.json +389 -299
  27. package/hedhog/frontend/messages/pt.json +389 -299
  28. package/hedhog/table/catalog_attribute.yaml +67 -52
  29. package/hedhog/table/catalog_attribute_option.yaml +40 -0
  30. package/hedhog/table/catalog_category.yaml +40 -0
  31. package/hedhog/table/catalog_category_attribute.yaml +37 -31
  32. package/hedhog/table/catalog_comparison.yaml +19 -22
  33. package/hedhog/table/catalog_product.yaml +30 -28
  34. package/hedhog/table/catalog_product_attribute_value.yaml +44 -31
  35. package/hedhog/table/catalog_product_category.yaml +13 -13
  36. package/hedhog/table/catalog_score_criterion.yaml +42 -25
  37. package/hedhog/table/catalog_seo_page_rule.yaml +10 -10
  38. package/hedhog/table/catalog_similarity_rule.yaml +33 -20
  39. package/hedhog/table/catalog_site.yaml +21 -13
  40. package/hedhog/table/catalog_site_category.yaml +12 -12
  41. package/package.json +6 -6
  42. package/src/catalog-resource.config.ts +132 -105
  43. package/src/catalog.controller.ts +91 -24
  44. package/src/catalog.module.ts +16 -12
  45. package/src/catalog.service.ts +1569 -56
@@ -1,299 +1,389 @@
1
- {
2
- "title": "Catalog",
3
- "subtitle": "Manage the generic multi-niche catalog foundation.",
4
- "openResource": "Open resource",
5
- "searchPlaceholder": "Search by id, slug, name or title...",
6
- "create": "Create",
7
- "edit": "Edit",
8
- "delete": "Delete",
9
- "save": "Save",
10
- "cancel": "Cancel",
11
- "payload": "Payload",
12
- "empty": "No records found.",
13
- "backToCatalog": "Back to dashboard",
14
- "refresh": "Refresh",
15
- "newRecord": "New record",
16
- "editRecord": "Edit record",
17
- "confirmDelete": "Delete this record?",
18
- "confirmDeleteDescription": "This operation cannot be undone.",
19
- "unsupportedResource": "Unsupported catalog resource.",
20
- "breadcrumbs": {
21
- "home": "Home",
22
- "catalog": "Catalog"
23
- },
24
- "navigation": {
25
- "current": "Current"
26
- },
27
- "dashboard": {
28
- "title": "Dashboard",
29
- "subtitle": "Operational overview of the catalog with indicators, distribution, and quick access.",
30
- "heroBadge": "Catalog overview",
31
- "heroTitle": "Track the catalog ecosystem from one control room.",
32
- "heroDescription": "Monitor the most important domains, compare resource volume, and jump straight to the areas your team touches every day.",
33
- "primaryAction": "Open products",
34
- "secondaryAction": "View imports",
35
- "summary": {
36
- "totalRecords": "Total records",
37
- "activeRecords": "Active/published monitored",
38
- "monitoredResources": "Resources with data"
39
- },
40
- "card": {
41
- "totalLabel": "Total",
42
- "activeLabel": "{count} active/published",
43
- "noActiveLabel": "No tracked status metric"
44
- },
45
- "charts": {
46
- "volume": {
47
- "title": "Highest volume by resource",
48
- "description": "Comparison across the catalog resources with the largest record sets."
49
- },
50
- "status": {
51
- "title": "Tracked status vs other records",
52
- "description": "Status view across the {count} resources that expose tracked status metrics."
53
- },
54
- "distribution": {
55
- "title": "Volume distribution",
56
- "description": "Relative share of the top resources inside the current catalog base."
57
- }
58
- },
59
- "ranking": {
60
- "title": "Resource ranking",
61
- "description": "The largest catalog areas right now.",
62
- "activeCount": "{count} active/published"
63
- },
64
- "quickActions": {
65
- "itemHint": "Quick access"
66
- },
67
- "footer": {
68
- "title": "Consolidated module view",
69
- "description": "The charts use real per-resource stats that already exist and organize team navigation around them.",
70
- "realData": "Real data",
71
- "multiView": "Multi-resource view",
72
- "resourceCount": "{count} monitored resources"
73
- }
74
- },
75
- "resource": {
76
- "notFound": "Resource not found",
77
- "unsupportedDescription": "Choose one of the module resources to continue navigating through the catalog.",
78
- "createShortcut": "Create new record",
79
- "listTitle": "Resource records",
80
- "listDescription": "Track the resource data with search, filter, pagination, and quick actions.",
81
- "payloadHintTitle": "Raw format editing",
82
- "payloadHintDescription": "The dialogs use JSON to speed up testing and operational adjustments for the team.",
83
- "recordPreview": "Raw preview of the current payload.",
84
- "emptyState": "No records found for this current slice.",
85
- "emptyStateTitle": "No records found",
86
- "emptyStateDescription": "Adjust filters or create the first record for this resource.",
87
- "emptyStateAction": "Create new record",
88
- "booleans": {
89
- "true": "Yes",
90
- "false": "No"
91
- },
92
- "kpis": {
93
- "total": "Resource total",
94
- "active": "Active/published",
95
- "visible": "Visible records",
96
- "activeInSlice": "Active in slice",
97
- "inStockInSlice": "In stock in slice",
98
- "filterableInSlice": "Filterable in slice",
99
- "requiredInSlice": "Required in slice",
100
- "publishedInSlice": "Active/published in slice"
101
- },
102
- "filters": {
103
- "all": "All",
104
- "status": "Status",
105
- "availability_status": "Availability",
106
- "data_type": "Data type",
107
- "facet_mode": "Facet mode"
108
- },
109
- "filterOptions": {
110
- "status": {
111
- "active": "Active",
112
- "inactive": "Inactive",
113
- "draft": "Draft",
114
- "published": "Published",
115
- "archived": "Archived",
116
- "hidden": "Hidden"
117
- },
118
- "availability_status": {
119
- "inStock": "In stock",
120
- "outOfStock": "Out of stock",
121
- "preorder": "Pre-order"
122
- },
123
- "data_type": {
124
- "text": "Text",
125
- "number": "Number",
126
- "boolean": "Boolean",
127
- "json": "JSON"
128
- },
129
- "facet_mode": {
130
- "default": "Default",
131
- "range": "Range",
132
- "select": "Select"
133
- }
134
- },
135
- "fields": {
136
- "actions": "Actions",
137
- "id": "ID",
138
- "name": "Name",
139
- "slug": "Slug",
140
- "status": "Status",
141
- "normalizedName": "Normalized name",
142
- "websiteUrl": "Website",
143
- "domain": "Domain",
144
- "defaultLocaleId": "Default locale",
145
- "sku": "SKU",
146
- "brandId": "Brand",
147
- "categoryId": "Category",
148
- "groupId": "Group",
149
- "label": "Label",
150
- "dataType": "Data type",
151
- "comparisonMode": "Comparison mode",
152
- "requiredForComparison": "Required for comparison",
153
- "facetMode": "Facet mode",
154
- "attributeId": "Attribute",
155
- "isRequired": "Required",
156
- "isHighlighted": "Highlighted",
157
- "weight": "Weight",
158
- "siteId": "Site",
159
- "merchantId": "Merchant",
160
- "productId": "Product",
161
- "priceAmount": "Price",
162
- "merchantType": "Merchant type",
163
- "logoFileId": "Logo file",
164
- "commissionType": "Commission type",
165
- "defaultCommissionValue": "Default commission",
166
- "priority": "Priority",
167
- "sourceType": "Source type",
168
- "isFilterable": "Filterable"
169
- },
170
- "summary": {
171
- "total": "Resource total",
172
- "visible": "Visible in list",
173
- "active": "Active"
174
- },
175
- "valueLabels": {
176
- "status": {
177
- "active": "Active",
178
- "inactive": "Inactive",
179
- "draft": "Draft",
180
- "published": "Published",
181
- "archived": "Archived",
182
- "hidden": "Hidden"
183
- },
184
- "comparison_status": {
185
- "draft": "Draft",
186
- "ready": "Ready",
187
- "disabled": "Disabled"
188
- },
189
- "availability_status": {
190
- "in_stock": "In stock",
191
- "out_of_stock": "Out of stock",
192
- "preorder": "Pre-order"
193
- },
194
- "site_type": {
195
- "portal": "Portal"
196
- },
197
- "merchant_type": {
198
- "retailer": "Retailer"
199
- },
200
- "network_type": {
201
- "direct": "Direct"
202
- },
203
- "commission_type": {
204
- "percentage": "Percentage"
205
- },
206
- "page_type": {
207
- "comparison": "Comparison"
208
- },
209
- "canonical_strategy": {
210
- "self": "Self"
211
- },
212
- "source_type": {
213
- "api": "API"
214
- },
215
- "data_type": {
216
- "text": "Text",
217
- "number": "Number",
218
- "boolean": "Boolean",
219
- "json": "JSON"
220
- },
221
- "comparison_mode": {
222
- "neutral": "Neutral"
223
- },
224
- "facet_mode": {
225
- "default": "Default",
226
- "range": "Range",
227
- "select": "Select"
228
- }
229
- }
230
- },
231
- "toasts": {
232
- "saveSuccess": "{resource} saved successfully.",
233
- "saveError": "Failed to save resource.",
234
- "deleteSuccess": "Record deleted successfully.",
235
- "deleteError": "Failed to delete record."
236
- },
237
- "resources": {
238
- "brands": {
239
- "title": "Brands",
240
- "shortTitle": "Brands",
241
- "description": "Manufacturers, brands, and portfolio normalization."
242
- },
243
- "sites": {
244
- "title": "Sites",
245
- "shortTitle": "Sites",
246
- "description": "Domains, visual identity, and multi-site publishing scope."
247
- },
248
- "products": {
249
- "title": "Products",
250
- "shortTitle": "Products",
251
- "description": "Core product catalog with reusable relationships."
252
- },
253
- "attributeGroups": {
254
- "title": "Attribute groups",
255
- "shortTitle": "Groups",
256
- "description": "Visual and logical groupings for comparable specifications."
257
- },
258
- "attributes": {
259
- "title": "Attributes",
260
- "shortTitle": "Attributes",
261
- "description": "Dictionary of dynamic and comparable technical attributes."
262
- },
263
- "categoryAttributes": {
264
- "title": "Category attributes",
265
- "shortTitle": "Cat. attrs",
266
- "description": "Relevance and display rules for attributes by category."
267
- },
268
- "comparisons": {
269
- "title": "Comparisons",
270
- "shortTitle": "Comparisons",
271
- "description": "Manual and automated comparison pages across products."
272
- },
273
- "offers": {
274
- "title": "Offers",
275
- "shortTitle": "Offers",
276
- "description": "Commercial offers, prices, and affiliate links."
277
- },
278
- "merchants": {
279
- "title": "Merchants",
280
- "shortTitle": "Merchants",
281
- "description": "Stores, retailers, and commerce partners."
282
- },
283
- "affiliatePrograms": {
284
- "title": "Affiliate programs",
285
- "shortTitle": "Affiliate",
286
- "description": "Affiliate networks and direct programs per merchant."
287
- },
288
- "seoRules": {
289
- "title": "SEO rules",
290
- "shortTitle": "SEO",
291
- "description": "Rules for programmatic page generation and canonical behavior."
292
- },
293
- "importSources": {
294
- "title": "Import sources",
295
- "shortTitle": "Imports",
296
- "description": "Feeds, APIs, and external integrations for catalog ingestion."
297
- }
298
- }
299
- }
1
+ {
2
+ "title": "Catalog",
3
+ "subtitle": "Manage categories, attributes, products, offers, and publication for the structured catalog.",
4
+ "openResource": "Open resource",
5
+ "searchPlaceholder": "Search by id, slug, name, or title...",
6
+ "create": "Create",
7
+ "edit": "Edit",
8
+ "delete": "Delete",
9
+ "save": "Save",
10
+ "cancel": "Cancel",
11
+ "aiAssist": {
12
+ "button": "Use AI",
13
+ "title": "Form assist",
14
+ "description": "Describe what should be filled for {resource}. The suggestion will only be applied to the current form.",
15
+ "promptLabel": "Prompt",
16
+ "promptPlaceholder": "Example: Create a brand named ASUS with the official website https://www.asus.com and active status.",
17
+ "promptHint": "AI suggests values for the current form, but you still review everything before saving.",
18
+ "generate": "Generate suggestion",
19
+ "apply": "Apply suggestions",
20
+ "previewTitle": "Suggestion preview",
21
+ "previewDescription": "Review the suggested values before applying them to the form.",
22
+ "sections": {
23
+ "fields": "Form fields",
24
+ "productAttributes": "Technical attributes",
25
+ "warnings": "Warnings"
26
+ },
27
+ "errors": {
28
+ "promptRequired": "Enter a prompt to use AI.",
29
+ "generate": "Could not generate the AI suggestion."
30
+ },
31
+ "toasts": {
32
+ "applied": "Suggestions applied to the form."
33
+ }
34
+ },
35
+ "backToCatalog": "Back to dashboard",
36
+ "refresh": "Refresh",
37
+ "confirmDelete": "Delete this record?",
38
+ "confirmDeleteDescription": "This operation cannot be undone.",
39
+ "unsupportedResource": "Unsupported catalog resource.",
40
+ "breadcrumbs": {
41
+ "home": "Home",
42
+ "catalog": "Catalog"
43
+ },
44
+ "dashboard": {
45
+ "title": "Dashboard",
46
+ "subtitle": "Operational view of the catalog with real resource data.",
47
+ "heroBadge": "Catalog overview",
48
+ "heroTitle": "Track the structured catalog from one control panel.",
49
+ "heroDescription": "Monitor the resources the team uses most, compare domain volumes, and move quickly across the areas operated every day.",
50
+ "primaryAction": "Open products",
51
+ "secondaryAction": "View imports",
52
+ "summary": {
53
+ "totalRecords": "Total records",
54
+ "activeRecords": "Active/published",
55
+ "monitoredResources": "Resources with data"
56
+ },
57
+ "card": {
58
+ "totalLabel": "Total",
59
+ "activeLabel": "{count} active/published",
60
+ "noActiveLabel": "No tracked metric"
61
+ },
62
+ "charts": {
63
+ "volume": {
64
+ "title": "Highest volume by resource",
65
+ "description": "Comparison across the resources with the most records."
66
+ },
67
+ "status": {
68
+ "title": "Tracked status",
69
+ "description": "Status view across the {count} resources with a tracked metric."
70
+ },
71
+ "distribution": {
72
+ "title": "Volume distribution",
73
+ "description": "Relative share of the main resources."
74
+ }
75
+ },
76
+ "ranking": {
77
+ "title": "Resource ranking",
78
+ "description": "The largest modules right now.",
79
+ "activeCount": "{count} active/published"
80
+ },
81
+ "quickActions": {
82
+ "itemHint": "Quick access"
83
+ },
84
+ "footer": {
85
+ "title": "Consolidated module view",
86
+ "description": "The charts use real statistics and organize navigation around them.",
87
+ "realData": "Real data",
88
+ "multiView": "Multi-resource view",
89
+ "resourceCount": "{count} monitored resources"
90
+ }
91
+ },
92
+ "resource": {
93
+ "notFound": "Resource not found",
94
+ "unsupportedDescription": "Choose one of the module resources to continue navigating through the catalog.",
95
+ "emptyStateTitle": "No records found",
96
+ "emptyStateDescription": "Adjust filters or create the first record for this resource.",
97
+ "emptyStateAction": "Create new record",
98
+ "booleans": {
99
+ "true": "Yes",
100
+ "false": "No"
101
+ },
102
+ "kpis": {
103
+ "total": "Resource total",
104
+ "active": "Active/published",
105
+ "visible": "Visible records",
106
+ "activeInSlice": "Active in slice",
107
+ "inStockInSlice": "In stock in slice",
108
+ "filterableInSlice": "Filterable in slice",
109
+ "requiredInSlice": "Required in slice",
110
+ "publishedInSlice": "Published in slice",
111
+ "verifiedInSlice": "Verified in slice"
112
+ },
113
+ "filters": {
114
+ "all": "All",
115
+ "status": "Status",
116
+ "availability_status": "Availability",
117
+ "data_type": "Data type",
118
+ "facet_mode": "Facet mode",
119
+ "is_verified": "Verification"
120
+ },
121
+ "filterOptions": {
122
+ "status": {
123
+ "active": "Active",
124
+ "inactive": "Inactive",
125
+ "draft": "Draft",
126
+ "published": "Published",
127
+ "archived": "Archived",
128
+ "hidden": "Hidden"
129
+ },
130
+ "availability_status": {
131
+ "inStock": "In stock",
132
+ "outOfStock": "Out of stock",
133
+ "preOrder": "Pre-order",
134
+ "unknown": "Unknown"
135
+ },
136
+ "data_type": {
137
+ "text": "Text",
138
+ "longText": "Long text",
139
+ "number": "Number",
140
+ "boolean": "Boolean",
141
+ "option": "Option"
142
+ },
143
+ "facet_mode": {
144
+ "default": "Default",
145
+ "range": "Range",
146
+ "select": "Select",
147
+ "hidden": "Hidden"
148
+ },
149
+ "is_verified": {
150
+ "verified": "Verified",
151
+ "unverified": "Unverified"
152
+ }
153
+ },
154
+ "fields": {
155
+ "actions": "Actions",
156
+ "id": "ID",
157
+ "name": "Name",
158
+ "slug": "Slug",
159
+ "status": "Status",
160
+ "normalizedName": "Normalized name",
161
+ "websiteUrl": "Website",
162
+ "domain": "Domain",
163
+ "defaultLocaleId": "Default locale",
164
+ "sku": "SKU",
165
+ "brandId": "Brand",
166
+ "code": "Code",
167
+ "groupId": "Group",
168
+ "groupName": "Group name",
169
+ "label": "Label",
170
+ "dataType": "Data type",
171
+ "comparisonMode": "Comparison mode",
172
+ "requiredForComparison": "Required for comparison",
173
+ "isComparable": "Comparable",
174
+ "isRequiredDefault": "Required by default",
175
+ "facetMode": "Facet mode",
176
+ "attributeId": "Attribute",
177
+ "isRequired": "Required",
178
+ "isHighlighted": "Highlighted",
179
+ "isHighlight": "Highlight",
180
+ "isFilterVisible": "Visible in filters",
181
+ "isComparisonVisible": "Visible in comparison",
182
+ "weight": "Weight",
183
+ "siteId": "Site",
184
+ "merchantId": "Merchant",
185
+ "productId": "Product",
186
+ "priceAmount": "Price",
187
+ "merchantType": "Merchant type",
188
+ "logoFileId": "Logo file",
189
+ "commissionType": "Commission type",
190
+ "defaultCommissionValue": "Default commission",
191
+ "priority": "Priority",
192
+ "sourceType": "Source type",
193
+ "isFilterable": "Filterable",
194
+ "parentCategoryId": "Parent category",
195
+ "comparisonEnabled": "Comparison enabled",
196
+ "sortOrder": "Sort order",
197
+ "catalogCategoryId": "Category",
198
+ "isActive": "Active",
199
+ "optionValue": "Option value",
200
+ "isDefault": "Default",
201
+ "attributeOptionId": "Attribute option",
202
+ "rawValue": "Raw value",
203
+ "normalizedValue": "Normalized value",
204
+ "valueText": "Text value",
205
+ "isVerified": "Verified"
206
+ },
207
+ "valueLabels": {
208
+ "status": {
209
+ "active": "Active",
210
+ "inactive": "Inactive",
211
+ "draft": "Draft",
212
+ "published": "Published",
213
+ "archived": "Archived",
214
+ "hidden": "Hidden"
215
+ },
216
+ "comparison_status": {
217
+ "draft": "Draft",
218
+ "ready": "Ready",
219
+ "disabled": "Disabled"
220
+ },
221
+ "availability_status": {
222
+ "in_stock": "In stock",
223
+ "out_of_stock": "Out of stock",
224
+ "pre_order": "Pre-order",
225
+ "unknown": "Unknown"
226
+ },
227
+ "site_type": {
228
+ "portal": "Portal",
229
+ "niche": "Niche",
230
+ "tenant": "Tenant"
231
+ },
232
+ "merchant_type": {
233
+ "retailer": "Retailer",
234
+ "marketplace": "Marketplace",
235
+ "saas": "SaaS",
236
+ "direct": "Direct"
237
+ },
238
+ "network_type": {
239
+ "amazon": "Amazon",
240
+ "mercado_livre": "Mercado Livre",
241
+ "aliexpress": "AliExpress",
242
+ "kabum": "KaBuM!",
243
+ "direct": "Direct",
244
+ "network": "Network"
245
+ },
246
+ "commission_type": {
247
+ "percentage": "Percentage",
248
+ "fixed": "Fixed"
249
+ },
250
+ "page_type": {
251
+ "comparison": "Comparison",
252
+ "best_of": "Best of",
253
+ "cost_benefit": "Cost benefit",
254
+ "attribute": "Attribute",
255
+ "price_range": "Price range",
256
+ "brand": "Brand",
257
+ "use_case": "Use case"
258
+ },
259
+ "canonical_strategy": {
260
+ "self": "Self",
261
+ "parent": "Parent",
262
+ "custom": "Custom"
263
+ },
264
+ "source_type": {
265
+ "api": "API",
266
+ "feed": "Feed",
267
+ "file": "File",
268
+ "crawler": "Crawler"
269
+ },
270
+ "data_type": {
271
+ "text": "Text",
272
+ "long_text": "Long text",
273
+ "number": "Number",
274
+ "boolean": "Boolean",
275
+ "option": "Option"
276
+ },
277
+ "comparison_mode": {
278
+ "neutral": "Neutral",
279
+ "higher_better": "Higher is better",
280
+ "lower_better": "Lower is better",
281
+ "boolean_true_better": "True is better",
282
+ "exact_match": "Exact match"
283
+ },
284
+ "facet_mode": {
285
+ "default": "Default",
286
+ "range": "Range",
287
+ "select": "Select",
288
+ "hidden": "Hidden"
289
+ },
290
+ "comparison_type": {
291
+ "manual": "Manual",
292
+ "automatic": "Automatic",
293
+ "similarity": "Similarity",
294
+ "compatibility": "Compatibility"
295
+ },
296
+ "generation_mode": {
297
+ "manual": "Manual",
298
+ "automatic": "Automatic"
299
+ },
300
+ "is_verified": {
301
+ "true": "Verified",
302
+ "false": "Unverified"
303
+ }
304
+ }
305
+ },
306
+ "toasts": {
307
+ "saveSuccess": "{resource} saved successfully.",
308
+ "saveError": "Failed to save resource.",
309
+ "deleteSuccess": "Record deleted successfully.",
310
+ "deleteError": "Failed to delete record."
311
+ },
312
+ "resources": {
313
+ "categories": {
314
+ "title": "Categories",
315
+ "shortTitle": "Categories",
316
+ "description": "Official catalog taxonomy for attributes, products, and publication."
317
+ },
318
+ "brands": {
319
+ "title": "Brands",
320
+ "shortTitle": "Brands",
321
+ "description": "Manufacturers, brands, and portfolio normalization."
322
+ },
323
+ "sites": {
324
+ "title": "Sites",
325
+ "shortTitle": "Sites",
326
+ "description": "Domains, visual identity, and multi-site publication."
327
+ },
328
+ "products": {
329
+ "title": "Products",
330
+ "shortTitle": "Products",
331
+ "description": "Main product catalog with structured attributes."
332
+ },
333
+ "attributeGroups": {
334
+ "title": "Attribute groups",
335
+ "shortTitle": "Groups",
336
+ "description": "Visual and logical groupings for comparable attributes."
337
+ },
338
+ "attributes": {
339
+ "title": "Attributes",
340
+ "shortTitle": "Attributes",
341
+ "description": "Typed dictionary of comparable attributes."
342
+ },
343
+ "attributeOptions": {
344
+ "title": "Attribute options",
345
+ "shortTitle": "Options",
346
+ "description": "Enumerable options for select-type attributes."
347
+ },
348
+ "categoryAttributes": {
349
+ "title": "Category attributes",
350
+ "shortTitle": "Cat. attrs",
351
+ "description": "Required, highlight, and facet rules per category."
352
+ },
353
+ "productAttributes": {
354
+ "title": "Product attributes",
355
+ "shortTitle": "Prod. attrs",
356
+ "description": "Structured attribute values by product."
357
+ },
358
+ "comparisons": {
359
+ "title": "Comparisons",
360
+ "shortTitle": "Comparisons",
361
+ "description": "Comparison pages between products."
362
+ },
363
+ "offers": {
364
+ "title": "Offers",
365
+ "shortTitle": "Offers",
366
+ "description": "Commercial offers, prices, and affiliate links."
367
+ },
368
+ "merchants": {
369
+ "title": "Merchants",
370
+ "shortTitle": "Merchants",
371
+ "description": "Stores, retailers, and business partners."
372
+ },
373
+ "affiliatePrograms": {
374
+ "title": "Affiliate programs",
375
+ "shortTitle": "Affiliate",
376
+ "description": "Affiliate networks and direct programs by merchant."
377
+ },
378
+ "seoRules": {
379
+ "title": "SEO rules",
380
+ "shortTitle": "SEO",
381
+ "description": "Rules for programmatic page generation."
382
+ },
383
+ "importSources": {
384
+ "title": "Import sources",
385
+ "shortTitle": "Imports",
386
+ "description": "Feeds, APIs, and external integrations for ingestion."
387
+ }
388
+ }
389
+ }