@coveo/thermidor-schema 1.0.0-beta.1 → 1.0.0-beta.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.
Files changed (43) hide show
  1. package/README.md +32 -5
  2. package/dist/generated/schemas.d.ts +2547 -378
  3. package/dist/generated/schemas.js +689 -143
  4. package/dist/generated/zod3/schemas.d.ts +23821 -0
  5. package/dist/generated/zod3/schemas.js +1087 -0
  6. package/dist/index.d.ts +2 -2
  7. package/dist/index.js +1 -1
  8. package/dist/zod3/index.d.ts +3 -0
  9. package/dist/zod3/index.js +5 -0
  10. package/dist/zod3-compat.d.ts +79 -0
  11. package/dist/zod3-compat.js +82 -0
  12. package/package.json +26 -20
  13. package/schema/base/catalog.schema.json +3 -2
  14. package/schema/base/component.schema.json +24 -20
  15. package/schema/{components/component-contracts.schema.json → component-contracts.schema.json} +23 -5
  16. package/schema/components/bundle-display.schema.json +11 -6
  17. package/schema/components/cart.schema.json +85 -46
  18. package/schema/components/category-facet.schema.json +35 -24
  19. package/schema/components/commerce-search.schema.json +186 -0
  20. package/schema/components/comparison-table.schema.json +35 -11
  21. package/schema/components/date-facet.schema.json +39 -26
  22. package/schema/components/facet-manager.schema.json +16 -18
  23. package/schema/components/layout-stack.schema.json +50 -0
  24. package/schema/components/next-actions-bar.schema.json +16 -18
  25. package/schema/components/numeric-facet.schema.json +43 -26
  26. package/schema/components/page-size.schema.json +79 -0
  27. package/schema/components/pagination.schema.json +45 -19
  28. package/schema/components/product-carousel.schema.json +15 -7
  29. package/schema/components/product-list.schema.json +77 -7
  30. package/schema/components/product-research-card.schema.json +70 -0
  31. package/schema/components/product-summary.schema.json +64 -0
  32. package/schema/components/query-suggestions.schema.json +113 -0
  33. package/schema/components/query-summary.schema.json +76 -0
  34. package/schema/components/regular-facet.schema.json +42 -32
  35. package/schema/components/sort.schema.json +18 -18
  36. package/schema/definitions/bundle-tier.schema.json +9 -4
  37. package/schema/definitions/child-list.schema.json +32 -0
  38. package/schema/definitions/comparison-attribute.schema.json +2 -2
  39. package/schema/definitions/comparison-product.schema.json +2 -2
  40. package/schema/definitions/component-id.schema.json +9 -0
  41. package/schema/definitions/data-binding.schema.json +16 -0
  42. package/schema/components/search-box.schema.json +0 -74
  43. package/schema/definitions/cart-item.schema.json +0 -29
@@ -0,0 +1,70 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/components/product-research-card.schema.json",
4
+ "title": "ProductResearchCard",
5
+ "description": "Renders a research card for a single known product: the product details alongside a short research summary and a list of concise product-education bullets. Read-only from the frontend: the backend is the sole source of truth for the product and the research content.",
6
+ "allOf": [
7
+ {
8
+ "$ref": "https://schema.thermidor.coveo.com/base/component.schema.json"
9
+ }
10
+ ],
11
+ "properties": {
12
+ "id": {
13
+ "type": "string"
14
+ },
15
+ "component": {
16
+ "type": "string",
17
+ "const": "ProductResearchCard"
18
+ },
19
+ "product": {
20
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
21
+ "description": "The researched product, bound to /state/<id>/product."
22
+ },
23
+ "summary": {
24
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
25
+ "description": "The research summary, bound to /state/<id>/summary."
26
+ },
27
+ "bullets": {
28
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
29
+ "description": "The product-education bullets, bound to /state/<id>/bullets."
30
+ },
31
+ "state": {
32
+ "$ref": "#/$defs/ProductResearchCardState"
33
+ },
34
+ "actions": {
35
+ "type": "object",
36
+ "properties": {},
37
+ "additionalProperties": false
38
+ }
39
+ },
40
+ "additionalProperties": false,
41
+ "$defs": {
42
+ "ProductResearchCardState": {
43
+ "title": "ProductResearchCardState",
44
+ "description": "The researched product and its research content. Owned exclusively by the backend; the frontend must not mutate this directly.",
45
+ "$comment": "This schema validates the runtime state value the backend pushes to the frontend.",
46
+ "type": "object",
47
+ "required": ["product", "summary", "bullets"],
48
+ "properties": {
49
+ "product": {
50
+ "$ref": "https://schema.thermidor.coveo.com/definitions/product.schema.json"
51
+ },
52
+ "summary": {
53
+ "type": "string",
54
+ "minLength": 1,
55
+ "description": "Short research paragraph about the product."
56
+ },
57
+ "bullets": {
58
+ "type": "array",
59
+ "minItems": 1,
60
+ "description": "Concise product-education bullets, in display order. Producers currently emit at most 5 bullets.",
61
+ "items": {
62
+ "type": "string",
63
+ "minLength": 1
64
+ }
65
+ }
66
+ },
67
+ "additionalProperties": false
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,64 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/components/product-summary.schema.json",
4
+ "title": "ProductSummary",
5
+ "description": "Renders a single commerce product as a compact summary row (thumbnail, name, short description, price) for a category slot. Read-only from the frontend.",
6
+ "$comment": "Compact-row presentation is expressed by this component type on the A2-UI plane, never as data in AG-UI state.",
7
+ "allOf": [
8
+ {
9
+ "$ref": "https://schema.thermidor.coveo.com/base/component.schema.json"
10
+ }
11
+ ],
12
+ "properties": {
13
+ "id": {
14
+ "type": "string"
15
+ },
16
+ "component": {
17
+ "type": "string",
18
+ "const": "ProductSummary"
19
+ },
20
+ "categoryLabel": {
21
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
22
+ "description": "The product category label, bound to /state/<id>/categoryLabel."
23
+ },
24
+ "product": {
25
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
26
+ "description": "The single summarized product, bound to /state/<id>/product."
27
+ },
28
+ "state": {
29
+ "$ref": "#/$defs/ProductSummaryState"
30
+ },
31
+ "actions": {
32
+ "type": "object",
33
+ "properties": {},
34
+ "additionalProperties": false
35
+ }
36
+ },
37
+ "additionalProperties": false,
38
+ "$defs": {
39
+ "ProductSummaryState": {
40
+ "title": "ProductSummaryState",
41
+ "description": "The single product to summarize for a category slot. Owned exclusively by the backend; the frontend must not mutate this directly.",
42
+ "type": "object",
43
+ "required": ["categoryLabel", "product"],
44
+ "properties": {
45
+ "categoryLabel": {
46
+ "type": "string",
47
+ "description": "Display label of the product category this summary represents (e.g. 'Surfboard')."
48
+ },
49
+ "product": {
50
+ "description": "The single product to summarize, or null when no product is available for this slot.",
51
+ "oneOf": [
52
+ {
53
+ "$ref": "https://schema.thermidor.coveo.com/definitions/product.schema.json"
54
+ },
55
+ {
56
+ "type": "null"
57
+ }
58
+ ]
59
+ }
60
+ },
61
+ "additionalProperties": false
62
+ }
63
+ }
64
+ }
@@ -0,0 +1,113 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/components/query-suggestions.schema.json",
4
+ "title": "QuerySuggestions",
5
+ "description": "Requests and renders backend-provided query completions and product suggestions for the active search input.",
6
+ "allOf": [
7
+ {
8
+ "$ref": "https://schema.thermidor.coveo.com/base/component.schema.json"
9
+ }
10
+ ],
11
+ "properties": {
12
+ "id": {
13
+ "type": "string"
14
+ },
15
+ "component": {
16
+ "type": "string",
17
+ "const": "QuerySuggestions"
18
+ },
19
+ "query": {
20
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
21
+ "description": "The input query these suggestions were requested for, bound to /state/<id>/query."
22
+ },
23
+ "completions": {
24
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
25
+ "description": "The query completions, bound to /state/<id>/completions."
26
+ },
27
+ "products": {
28
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
29
+ "description": "The product suggestions, bound to /state/<id>/products."
30
+ },
31
+ "state": {
32
+ "$ref": "#/$defs/QuerySuggestionsState"
33
+ },
34
+ "actions": {
35
+ "type": "object",
36
+ "required": ["fetchSuggestions"],
37
+ "properties": {
38
+ "fetchSuggestions": {
39
+ "$ref": "#/$defs/FetchSuggestionsAction"
40
+ }
41
+ },
42
+ "additionalProperties": false
43
+ }
44
+ },
45
+ "additionalProperties": false,
46
+ "$defs": {
47
+ "QuerySuggestionsState": {
48
+ "title": "QuerySuggestionsState",
49
+ "description": "The suggestion result for one query. Owned exclusively by the backend.",
50
+ "type": "object",
51
+ "required": ["query", "completions", "products"],
52
+ "properties": {
53
+ "query": {
54
+ "type": "string",
55
+ "description": "The input query for which these suggestions were requested."
56
+ },
57
+ "completions": {
58
+ "type": "array",
59
+ "description": "Query completions returned by the commerce service.",
60
+ "items": {
61
+ "$ref": "#/$defs/QueryCompletion"
62
+ }
63
+ },
64
+ "products": {
65
+ "type": "array",
66
+ "description": "Product suggestions returned by the commerce service.",
67
+ "items": {
68
+ "$ref": "https://schema.thermidor.coveo.com/definitions/product.schema.json"
69
+ }
70
+ }
71
+ },
72
+ "additionalProperties": false
73
+ },
74
+ "FetchSuggestionsAction": {
75
+ "title": "fetchSuggestions",
76
+ "description": "Fetches query completions and product suggestions for the current input.",
77
+ "allOf": [
78
+ {
79
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
80
+ }
81
+ ],
82
+ "properties": {
83
+ "payload": {
84
+ "type": "object",
85
+ "required": ["query"],
86
+ "properties": {
87
+ "query": {
88
+ "type": "string"
89
+ }
90
+ },
91
+ "additionalProperties": false
92
+ }
93
+ }
94
+ },
95
+ "QueryCompletion": {
96
+ "title": "QueryCompletion",
97
+ "description": "One query completion returned by the commerce service.",
98
+ "type": "object",
99
+ "required": ["expression"],
100
+ "properties": {
101
+ "expression": {
102
+ "type": "string",
103
+ "description": "The suggested query text."
104
+ },
105
+ "score": {
106
+ "type": "number",
107
+ "description": "The relevance score returned by the commerce service, when available."
108
+ }
109
+ },
110
+ "additionalProperties": false
111
+ }
112
+ }
113
+ }
@@ -0,0 +1,76 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/components/query-summary.schema.json",
4
+ "title": "QuerySummary",
5
+ "description": "Summarizes the current result window for a search surface (e.g. 'Products 1-12 of 43 for Water Sports'). Read-only from the frontend.",
6
+ "$comment": "Carries its own backend-computed aggregate instead of reading sibling state (search box, pagination, product-list), so it has no cross-component coupling.",
7
+ "allOf": [
8
+ {
9
+ "$ref": "https://schema.thermidor.coveo.com/base/component.schema.json"
10
+ }
11
+ ],
12
+ "properties": {
13
+ "id": {
14
+ "type": "string"
15
+ },
16
+ "component": {
17
+ "type": "string",
18
+ "const": "QuerySummary"
19
+ },
20
+ "query": {
21
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
22
+ "description": "The current query string, bound to /state/<id>/query."
23
+ },
24
+ "firstIndex": {
25
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
26
+ "description": "The 1-based index of the first result on the page, bound to /state/<id>/firstIndex."
27
+ },
28
+ "lastIndex": {
29
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
30
+ "description": "The 1-based index of the last result on the page, bound to /state/<id>/lastIndex."
31
+ },
32
+ "totalEntries": {
33
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
34
+ "description": "The total number of results, bound to /state/<id>/totalEntries."
35
+ },
36
+ "state": {
37
+ "$ref": "#/$defs/QuerySummaryState"
38
+ },
39
+ "actions": {
40
+ "type": "object",
41
+ "properties": {},
42
+ "additionalProperties": false
43
+ }
44
+ },
45
+ "additionalProperties": false,
46
+ "$defs": {
47
+ "QuerySummaryState": {
48
+ "title": "QuerySummaryState",
49
+ "description": "The backend-computed aggregate for the current result window. Owned exclusively by the backend; the frontend must not mutate this directly.",
50
+ "type": "object",
51
+ "required": ["query", "firstIndex", "lastIndex", "totalEntries"],
52
+ "properties": {
53
+ "query": {
54
+ "type": "string",
55
+ "description": "The current query string. May be empty when the surface has no active query."
56
+ },
57
+ "firstIndex": {
58
+ "type": "integer",
59
+ "minimum": 0,
60
+ "description": "The 1-based index of the first result on the current page."
61
+ },
62
+ "lastIndex": {
63
+ "type": "integer",
64
+ "minimum": 0,
65
+ "description": "The 1-based index of the last result on the current page."
66
+ },
67
+ "totalEntries": {
68
+ "type": "integer",
69
+ "minimum": 0,
70
+ "description": "The total number of results across all pages."
71
+ }
72
+ },
73
+ "additionalProperties": false
74
+ }
75
+ }
76
+ }
@@ -9,9 +9,40 @@
9
9
  }
10
10
  ],
11
11
  "properties": {
12
- "componentType": {
12
+ "component": {
13
13
  "type": "string",
14
- "const": "regular-facet"
14
+ "const": "RegularFacet"
15
+ },
16
+ "id": {
17
+ "type": "string"
18
+ },
19
+ "field": {
20
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
21
+ "description": "The index field the facet is built on, bound to /state/<id>/field."
22
+ },
23
+ "displayName": {
24
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
25
+ "description": "The facet's human-readable label, bound to /state/<id>/displayName."
26
+ },
27
+ "values": {
28
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
29
+ "description": "The facet values, bound to /state/<id>/values."
30
+ },
31
+ "hasActiveValues": {
32
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
33
+ "description": "Whether at least one facet value is active, bound to /state/<id>/hasActiveValues."
34
+ },
35
+ "canShowMoreValues": {
36
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
37
+ "description": "Whether more facet values can be shown, bound to /state/<id>/canShowMoreValues."
38
+ },
39
+ "canShowLessValues": {
40
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
41
+ "description": "Whether fewer facet values can be shown, bound to /state/<id>/canShowLessValues."
42
+ },
43
+ "facetSearch": {
44
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
45
+ "description": "The facet search state, bound to /state/<id>/facetSearch."
15
46
  },
16
47
  "state": {
17
48
  "$ref": "#/$defs/RegularFacetState"
@@ -125,11 +156,7 @@
125
156
  "title": "RegularFacetValue",
126
157
  "description": "A single selectable value within a regular facet.",
127
158
  "type": "object",
128
- "required": [
129
- "value",
130
- "numberOfResults",
131
- "state"
132
- ],
159
+ "required": ["value", "numberOfResults", "state"],
133
160
  "properties": {
134
161
  "value": {
135
162
  "type": "string",
@@ -154,11 +181,7 @@
154
181
  "title": "RegularFacetSearch",
155
182
  "description": "The facet search state for a regular facet.",
156
183
  "type": "object",
157
- "required": [
158
- "query",
159
- "canShowMoreResults",
160
- "results"
161
- ],
184
+ "required": ["query", "canShowMoreResults", "results"],
162
185
  "properties": {
163
186
  "query": {
164
187
  "type": "string",
@@ -186,10 +209,7 @@
186
209
  "title": "RegularFacetSearchResult",
187
210
  "description": "A single result returned by a regular facet search. Facet search only returns idle (unselected) values, so it carries no selection state.",
188
211
  "type": "object",
189
- "required": [
190
- "value",
191
- "numberOfResults"
192
- ],
212
+ "required": ["value", "numberOfResults"],
193
213
  "properties": {
194
214
  "value": {
195
215
  "type": "string",
@@ -217,9 +237,7 @@
217
237
  "properties": {
218
238
  "payload": {
219
239
  "type": "object",
220
- "required": [
221
- "value"
222
- ],
240
+ "required": ["value"],
223
241
  "properties": {
224
242
  "value": {
225
243
  "type": "string",
@@ -243,9 +261,7 @@
243
261
  "properties": {
244
262
  "payload": {
245
263
  "type": "object",
246
- "required": [
247
- "value"
248
- ],
264
+ "required": ["value"],
249
265
  "properties": {
250
266
  "value": {
251
267
  "type": "string",
@@ -269,9 +285,7 @@
269
285
  "properties": {
270
286
  "payload": {
271
287
  "type": "object",
272
- "required": [
273
- "value"
274
- ],
288
+ "required": ["value"],
275
289
  "properties": {
276
290
  "value": {
277
291
  "type": "string",
@@ -295,9 +309,7 @@
295
309
  "properties": {
296
310
  "payload": {
297
311
  "type": "object",
298
- "required": [
299
- "value"
300
- ],
312
+ "required": ["value"],
301
313
  "properties": {
302
314
  "value": {
303
315
  "type": "string",
@@ -330,9 +342,7 @@
330
342
  "properties": {
331
343
  "payload": {
332
344
  "type": "object",
333
- "required": [
334
- "query"
335
- ],
345
+ "required": ["query"],
336
346
  "properties": {
337
347
  "query": {
338
348
  "type": "string",
@@ -382,4 +392,4 @@
382
392
  ]
383
393
  }
384
394
  }
385
- }
395
+ }
@@ -9,18 +9,27 @@
9
9
  }
10
10
  ],
11
11
  "properties": {
12
- "componentType": {
12
+ "id": {
13
+ "type": "string"
14
+ },
15
+ "component": {
13
16
  "type": "string",
14
- "const": "sort"
17
+ "const": "Sort"
18
+ },
19
+ "appliedSort": {
20
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
21
+ "description": "The currently applied sort criterion, bound to /state/<id>/appliedSort."
22
+ },
23
+ "availableSorts": {
24
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
25
+ "description": "The available sort options, bound to /state/<id>/availableSorts."
15
26
  },
16
27
  "state": {
17
28
  "$ref": "#/$defs/SortState"
18
29
  },
19
30
  "actions": {
20
31
  "type": "object",
21
- "required": [
22
- "selectSort"
23
- ],
32
+ "required": ["selectSort"],
24
33
  "properties": {
25
34
  "selectSort": {
26
35
  "$ref": "#/$defs/SelectSortAction"
@@ -35,10 +44,7 @@
35
44
  "title": "SortState",
36
45
  "description": "The current sort state. Owned exclusively by the backend.",
37
46
  "type": "object",
38
- "required": [
39
- "appliedSort",
40
- "availableSorts"
41
- ],
47
+ "required": ["appliedSort", "availableSorts"],
42
48
  "properties": {
43
49
  "appliedSort": {
44
50
  "$ref": "#/$defs/SortCriterion",
@@ -58,10 +64,7 @@
58
64
  "title": "SortCriterion",
59
65
  "description": "A sort criterion consisting of a named criteria and field definitions.",
60
66
  "type": "object",
61
- "required": [
62
- "sortCriteria",
63
- "fields"
64
- ],
67
+ "required": ["sortCriteria", "fields"],
65
68
  "properties": {
66
69
  "sortCriteria": {
67
70
  "type": "string",
@@ -85,10 +88,7 @@
85
88
  "properties": {
86
89
  "payload": {
87
90
  "type": "object",
88
- "required": [
89
- "sortCriteria",
90
- "fields"
91
- ],
91
+ "required": ["sortCriteria", "fields"],
92
92
  "properties": {
93
93
  "sortCriteria": {
94
94
  "type": "string",
@@ -104,4 +104,4 @@
104
104
  }
105
105
  }
106
106
  }
107
- }
107
+ }
@@ -4,7 +4,7 @@
4
4
  "title": "BundleTier",
5
5
  "description": "A tier in a product bundle, grouping product slots by price/quality level.",
6
6
  "type": "object",
7
- "required": ["label", "description", "slots"],
7
+ "required": ["label", "description", "total", "slots"],
8
8
  "properties": {
9
9
  "label": {
10
10
  "type": "string",
@@ -14,6 +14,11 @@
14
14
  "type": "string",
15
15
  "description": "Brief description of what the tier includes."
16
16
  },
17
+ "total": {
18
+ "type": "number",
19
+ "minimum": 0,
20
+ "description": "Backend-computed total price for this tier's slots, in the request currency."
21
+ },
17
22
  "slots": {
18
23
  "type": "array",
19
24
  "description": "Product category slots within this tier.",
@@ -27,15 +32,15 @@
27
32
  "BundleSlot": {
28
33
  "title": "BundleSlot",
29
34
  "type": "object",
30
- "required": ["categoryLabel", "surfaceRef"],
35
+ "required": ["categoryLabel", "childId"],
31
36
  "properties": {
32
37
  "categoryLabel": {
33
38
  "type": "string",
34
39
  "description": "Display name of the product category for this slot."
35
40
  },
36
- "surfaceRef": {
41
+ "childId": {
37
42
  "type": "string",
38
- "description": "Surface ID where this slot's products are rendered via a ProductCarousel."
43
+ "description": "Id of the bundle-display child product-list node that renders this slot's products. Associates the slot with its child on the A2-UI composition plane; the renderer mounts the child via children(id)."
39
44
  }
40
45
  },
41
46
  "additionalProperties": false
@@ -0,0 +1,32 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/definitions/child-list.schema.json",
4
+ "title": "ChildList",
5
+ "description": "The A2-UI ChildList type: how a container holds its ordered children, as a static array of ComponentId references or a template binding children to a data-model list.",
6
+ "$comment": "A2-UI common_types.json#/$defs/ChildList. Any child-list property MUST use this type so validators treat it as a structural link. Thermidor emits only the static array form.",
7
+ "oneOf": [
8
+ {
9
+ "type": "array",
10
+ "description": "A static, ordered list of child component ids. Order is backend-owned and meaningful for container components (e.g. facet order); referential integrity and uniqueness are owned by the backend and not enforced at parse time.",
11
+ "items": {
12
+ "$ref": "https://schema.thermidor.coveo.com/definitions/component-id.schema.json"
13
+ },
14
+ "maxItems": 1000
15
+ },
16
+ {
17
+ "type": "object",
18
+ "description": "A template for generating a dynamic list of children from a data-model list. The componentId is the component used as the template; path is the JSON Pointer to the list of component property objects in the data model.",
19
+ "required": ["componentId", "path"],
20
+ "properties": {
21
+ "componentId": {
22
+ "$ref": "https://schema.thermidor.coveo.com/definitions/component-id.schema.json"
23
+ },
24
+ "path": {
25
+ "type": "string",
26
+ "description": "An RFC 6901 JSON Pointer to the list of component property objects in the A2-UI data model."
27
+ }
28
+ },
29
+ "additionalProperties": false
30
+ }
31
+ ]
32
+ }
@@ -2,13 +2,13 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://schema.thermidor.coveo.com/definitions/comparison-attribute.schema.json",
4
4
  "title": "ComparisonAttribute",
5
- "description": "Defines an attribute (column) used in a ComparisonTable. The key is the programmatic identifier that maps to values in ComparisonProduct.values, and label is the human-readable column heading.",
5
+ "description": "Defines an attribute (row) used in a ComparisonTable. The key is the programmatic identifier that maps to values in each compared product's values record, and label is the human-readable row heading.",
6
6
  "type": "object",
7
7
  "required": ["key", "label"],
8
8
  "properties": {
9
9
  "key": {
10
10
  "type": "string",
11
- "description": "The programmatic identifier for this attribute, used as a key in ComparisonProduct.values."
11
+ "description": "The programmatic identifier for this attribute, used as a key in each compared product's values record."
12
12
  },
13
13
  "label": {
14
14
  "type": "string",
@@ -2,9 +2,9 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://schema.thermidor.coveo.com/definitions/comparison-product.schema.json",
4
4
  "title": "ComparisonProduct",
5
- "description": "A product entry in a comparison table, containing required identifiers and a values record mapping attribute keys to display strings.",
5
+ "description": "A product entry (column) in a ComparisonTable, containing required identifiers and a values record mapping attribute keys to display strings.",
6
6
  "type": "object",
7
- "required": ["productId", "name", "values"],
7
+ "required": ["productId", "name"],
8
8
  "properties": {
9
9
  "productId": {
10
10
  "type": "string",
@@ -0,0 +1,9 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/definitions/component-id.schema.json",
4
+ "title": "ComponentId",
5
+ "type": "string",
6
+ "pattern": "^[a-z][a-z0-9-]*$",
7
+ "description": "A reference to the unique id of another component within the same surface. Thermidor node ids are kebab-case; the pattern narrows the A2-UI string type to that convention.",
8
+ "$comment": "A2-UI common_types.json#/$defs/ComponentId. Any property holding another component's id MUST use this type so validators treat it as a structural link rather than free text."
9
+ }