@coveo/thermidor-schema 1.0.0-beta.3 → 1.0.0-beta.30

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 (59) hide show
  1. package/README.md +32 -5
  2. package/dist/generated/schemas.d.ts +3346 -400
  3. package/dist/generated/schemas.js +843 -238
  4. package/dist/generated/zod3/index.d.ts +3 -0
  5. package/dist/generated/zod3/index.js +5 -0
  6. package/dist/generated/zod3/schemas.d.ts +31378 -0
  7. package/dist/generated/zod3/schemas.js +1252 -0
  8. package/dist/index.d.ts +2 -2
  9. package/dist/index.js +1 -1
  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 +5 -4
  14. package/schema/base/component.schema.json +22 -33
  15. package/schema/{components/component-contracts.schema.json → component-contracts.schema.json} +14 -2
  16. package/schema/components/breadbox.schema.json +82 -0
  17. package/schema/components/bundle-display.schema.json +17 -13
  18. package/schema/components/cart.schema.json +147 -0
  19. package/schema/components/category-facet.schema.json +29 -15
  20. package/schema/components/commerce-search.schema.json +156 -15
  21. package/schema/components/comparison-table.schema.json +21 -13
  22. package/schema/components/date-facet.schema.json +33 -13
  23. package/schema/components/facet-manager.schema.json +12 -14
  24. package/schema/components/layout-stack.schema.json +18 -15
  25. package/schema/components/next-actions-bar.schema.json +40 -17
  26. package/schema/components/numeric-facet.schema.json +37 -15
  27. package/schema/components/page-size.schema.json +13 -15
  28. package/schema/components/pagination.schema.json +41 -14
  29. package/schema/components/product-carousel.schema.json +13 -13
  30. package/schema/components/product-list.schema.json +75 -14
  31. package/schema/components/product-research-card.schema.json +107 -0
  32. package/schema/components/product-summary.schema.json +15 -14
  33. package/schema/components/query-suggestions.schema.json +113 -0
  34. package/schema/components/query-summary.schema.json +23 -14
  35. package/schema/components/regular-facet.schema.json +33 -32
  36. package/schema/components/sort.schema.json +13 -13
  37. package/schema/definitions/action-item.schema.json +10 -13
  38. package/schema/definitions/badge-placement.schema.json +22 -0
  39. package/schema/definitions/badge.schema.json +27 -0
  40. package/schema/definitions/breadbox-date-range-facet.schema.json +56 -0
  41. package/schema/definitions/breadbox-deselect-date-range.schema.json +28 -0
  42. package/schema/definitions/breadbox-deselect-hierarchical-path.schema.json +28 -0
  43. package/schema/definitions/breadbox-deselect-numerical-range.schema.json +28 -0
  44. package/schema/definitions/breadbox-deselect-payload.schema.json +20 -0
  45. package/schema/definitions/breadbox-deselect-regular-value.schema.json +25 -0
  46. package/schema/definitions/breadbox-facet.schema.json +20 -0
  47. package/schema/definitions/breadbox-hierarchical-facet.schema.json +37 -0
  48. package/schema/definitions/breadbox-numerical-range-facet.schema.json +56 -0
  49. package/schema/definitions/breadbox-regular-facet.schema.json +59 -0
  50. package/schema/definitions/bundle-tier.schema.json +6 -1
  51. package/schema/definitions/child-list.schema.json +31 -0
  52. package/schema/definitions/comparison-product.schema.json +7 -2
  53. package/schema/definitions/component-id.schema.json +9 -0
  54. package/schema/definitions/data-binding.schema.json +16 -0
  55. package/schema/definitions/followup-action-item.schema.json +20 -0
  56. package/schema/definitions/product.schema.json +10 -6
  57. package/schema/definitions/search-action-item.schema.json +20 -0
  58. package/schema/definitions/search-option-action-item.schema.json +25 -0
  59. package/schema/definitions/child-ref.schema.json +0 -8
@@ -0,0 +1,147 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/components/cart.schema.json",
4
+ "title": "Cart",
5
+ "description": "Represents a commerce cart or checkout surface. The backend owns cart state; semantic cart mutations and purchase completion are dispatched through this component.",
6
+ "allOf": [
7
+ {
8
+ "$ref": "https://schema.thermidor.coveo.com/base/component.schema.json"
9
+ }
10
+ ],
11
+ "properties": {
12
+ "component": {
13
+ "type": "string",
14
+ "const": "Cart"
15
+ },
16
+ "id": {
17
+ "type": "string"
18
+ },
19
+ "state": {
20
+ "$ref": "#/$defs/CartState"
21
+ },
22
+ "actions": {
23
+ "type": "object",
24
+ "required": ["updateCart", "purchase"],
25
+ "properties": {
26
+ "updateCart": {
27
+ "$ref": "#/$defs/UpdateCartAction"
28
+ },
29
+ "purchase": {
30
+ "$ref": "#/$defs/PurchaseAction"
31
+ }
32
+ },
33
+ "additionalProperties": false
34
+ }
35
+ },
36
+ "additionalProperties": false,
37
+ "$defs": {
38
+ "CartState": {
39
+ "title": "CartState",
40
+ "description": "Cart state is backend-owned. This initial contract intentionally carries no presentation fields; it provides the canonical action anchor for cart mutations and checkout completion.",
41
+ "type": "object",
42
+ "properties": {},
43
+ "additionalProperties": false
44
+ },
45
+ "UpdateCartAction": {
46
+ "title": "updateCart",
47
+ "description": "Applies a semantic item update to the cart and records the corresponding commerce cart event.",
48
+ "allOf": [
49
+ {
50
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
51
+ }
52
+ ],
53
+ "properties": {
54
+ "payload": {
55
+ "type": "object",
56
+ "required": ["productId", "quantity", "operation"],
57
+ "properties": {
58
+ "productId": {
59
+ "type": "string",
60
+ "minLength": 1
61
+ },
62
+ "name": {
63
+ "type": "string"
64
+ },
65
+ "price": {
66
+ "type": ["number", "null"]
67
+ },
68
+ "quantity": {
69
+ "type": "integer",
70
+ "minimum": 1
71
+ },
72
+ "operation": {
73
+ "title": "CartUpdateOperation",
74
+ "type": "string",
75
+ "enum": ["add", "remove", "setQuantity"]
76
+ }
77
+ },
78
+ "additionalProperties": false
79
+ }
80
+ }
81
+ },
82
+ "PurchaseAction": {
83
+ "title": "purchase",
84
+ "description": "Records a completed commerce transaction.",
85
+ "allOf": [
86
+ {
87
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
88
+ }
89
+ ],
90
+ "properties": {
91
+ "payload": {
92
+ "type": "object",
93
+ "required": ["products", "transaction"],
94
+ "properties": {
95
+ "products": {
96
+ "type": "array",
97
+ "items": {
98
+ "$ref": "#/$defs/PurchaseProduct"
99
+ }
100
+ },
101
+ "transaction": {
102
+ "$ref": "#/$defs/Transaction"
103
+ }
104
+ },
105
+ "additionalProperties": false
106
+ }
107
+ }
108
+ },
109
+ "PurchaseProduct": {
110
+ "title": "PurchaseProduct",
111
+ "type": "object",
112
+ "required": ["productId", "quantity"],
113
+ "properties": {
114
+ "productId": {
115
+ "type": "string",
116
+ "minLength": 1
117
+ },
118
+ "name": {
119
+ "type": "string"
120
+ },
121
+ "price": {
122
+ "type": ["number", "null"]
123
+ },
124
+ "quantity": {
125
+ "type": "integer",
126
+ "minimum": 1
127
+ }
128
+ },
129
+ "additionalProperties": false
130
+ },
131
+ "Transaction": {
132
+ "title": "Transaction",
133
+ "type": "object",
134
+ "required": ["id", "revenue"],
135
+ "properties": {
136
+ "id": {
137
+ "type": "string",
138
+ "minLength": 1
139
+ },
140
+ "revenue": {
141
+ "type": "number"
142
+ }
143
+ },
144
+ "additionalProperties": false
145
+ }
146
+ }
147
+ }
@@ -9,9 +9,36 @@
9
9
  }
10
10
  ],
11
11
  "properties": {
12
- "componentType": {
12
+ "component": {
13
13
  "type": "string",
14
- "const": "category-facet"
14
+ "const": "CategoryFacet"
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 operates 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 category facet values, bound to /state/<id>/values."
30
+ },
31
+ "canShowMoreValues": {
32
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
33
+ "description": "Whether more facet values can be shown, bound to /state/<id>/canShowMoreValues."
34
+ },
35
+ "canShowLessValues": {
36
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
37
+ "description": "Whether fewer facet values can be shown, bound to /state/<id>/canShowLessValues."
38
+ },
39
+ "facetSearch": {
40
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
41
+ "description": "The facet search state, bound to /state/<id>/facetSearch."
15
42
  },
16
43
  "state": {
17
44
  "$ref": "#/$defs/CategoryFacetState"
@@ -51,17 +78,6 @@
51
78
  }
52
79
  },
53
80
  "additionalProperties": false
54
- },
55
- "children": {
56
- "type": "array",
57
- "items": {
58
- "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
59
- },
60
- "maxItems": 1000,
61
- "default": []
62
- },
63
- "child": {
64
- "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
65
81
  }
66
82
  },
67
83
  "additionalProperties": false,
@@ -148,7 +164,6 @@
148
164
  "properties": {
149
165
  "query": {
150
166
  "type": "string",
151
- "maxLength": 256,
152
167
  "description": "The current facet search query."
153
168
  },
154
169
  "canShowMoreResults": {
@@ -214,7 +229,6 @@
214
229
  "properties": {
215
230
  "query": {
216
231
  "type": "string",
217
- "maxLength": 256,
218
232
  "description": "The facet search query string."
219
233
  }
220
234
  },
@@ -2,35 +2,47 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://schema.thermidor.coveo.com/components/commerce-search.schema.json",
4
4
  "title": "CommerceSearch",
5
- "description": "Surface-root component for a commerce search surface. Its componentType carries the surface intent; it owns the surface's top-level components via children.",
5
+ "description": "Surface-root component for a commerce search surface. Its component discriminant carries the surface intent; it owns the surface's top-level components via named child slots and dispatches search lifecycle actions (submitQuery, restoreState, overrideCorrection).",
6
6
  "allOf": [
7
7
  {
8
8
  "$ref": "https://schema.thermidor.coveo.com/base/component.schema.json"
9
9
  }
10
10
  ],
11
11
  "properties": {
12
- "componentType": {
12
+ "id": {
13
+ "type": "string"
14
+ },
15
+ "component": {
13
16
  "type": "string",
14
- "const": "commerce-search"
17
+ "const": "CommerceSearch"
18
+ },
19
+ "sidebarChild": {
20
+ "$ref": "https://schema.thermidor.coveo.com/definitions/component-id.schema.json",
21
+ "description": "The sidebar named slot: a static ComponentId the renderer mounts by name via children(sidebarChild).",
22
+ "$comment": "Heterogeneous named-slot composition: CommerceSearch uses named ComponentId slots (sidebar, main) rather than a positional children[] array."
23
+ },
24
+ "mainChild": {
25
+ "$ref": "https://schema.thermidor.coveo.com/definitions/component-id.schema.json",
26
+ "description": "The main-area named slot: a static ComponentId the renderer mounts by name via children(mainChild)."
15
27
  },
16
28
  "state": {
17
29
  "$ref": "#/$defs/CommerceSearchState"
18
30
  },
19
31
  "actions": {
20
32
  "type": "object",
21
- "properties": {},
22
- "additionalProperties": false
23
- },
24
- "children": {
25
- "type": "array",
26
- "items": {
27
- "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
33
+ "required": ["submitQuery", "restoreState", "overrideCorrection"],
34
+ "properties": {
35
+ "submitQuery": {
36
+ "$ref": "#/$defs/SubmitQueryAction"
37
+ },
38
+ "restoreState": {
39
+ "$ref": "#/$defs/RestoreStateAction"
40
+ },
41
+ "overrideCorrection": {
42
+ "$ref": "#/$defs/OverrideCorrectionAction"
43
+ }
28
44
  },
29
- "maxItems": 1000,
30
- "default": []
31
- },
32
- "child": {
33
- "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
45
+ "additionalProperties": false
34
46
  }
35
47
  },
36
48
  "additionalProperties": false,
@@ -40,6 +52,135 @@
40
52
  "description": "The commerce search surface state. Owned exclusively by the backend.",
41
53
  "type": "object",
42
54
  "additionalProperties": false
55
+ },
56
+ "SubmitQueryAction": {
57
+ "title": "submitQuery",
58
+ "description": "Submits a new search query.",
59
+ "allOf": [
60
+ {
61
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
62
+ }
63
+ ],
64
+ "properties": {
65
+ "payload": {
66
+ "type": "object",
67
+ "required": ["query"],
68
+ "properties": {
69
+ "query": {
70
+ "type": "string",
71
+ "description": "The query string to submit."
72
+ }
73
+ },
74
+ "additionalProperties": false
75
+ }
76
+ }
77
+ },
78
+ "RestoreStateAction": {
79
+ "title": "restoreState",
80
+ "description": "Restores a commerce-search surface from externally persisted search state.",
81
+ "allOf": [
82
+ {
83
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
84
+ }
85
+ ],
86
+ "properties": {
87
+ "payload": {
88
+ "type": "object",
89
+ "required": ["query", "page", "pageSize"],
90
+ "properties": {
91
+ "query": {
92
+ "type": "string"
93
+ },
94
+ "page": {
95
+ "type": "integer",
96
+ "minimum": 0
97
+ },
98
+ "pageSize": {
99
+ "type": "integer",
100
+ "minimum": 1
101
+ },
102
+ "sortCriteria": {
103
+ "type": "string"
104
+ },
105
+ "facets": {
106
+ "type": "array",
107
+ "items": {
108
+ "$ref": "#/$defs/FacetRestore"
109
+ }
110
+ },
111
+ "pinnedProducts": {
112
+ "type": "array",
113
+ "items": {
114
+ "type": "string"
115
+ }
116
+ }
117
+ },
118
+ "additionalProperties": false
119
+ }
120
+ }
121
+ },
122
+ "OverrideCorrectionAction": {
123
+ "title": "overrideCorrection",
124
+ "description": "Re-runs a search with the shopper's original query instead of an automatic correction.",
125
+ "allOf": [
126
+ {
127
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
128
+ }
129
+ ],
130
+ "properties": {
131
+ "payload": {
132
+ "type": "object",
133
+ "required": ["originalQuery"],
134
+ "properties": {
135
+ "originalQuery": {
136
+ "type": "string",
137
+ "minLength": 1
138
+ }
139
+ },
140
+ "additionalProperties": false
141
+ }
142
+ }
143
+ },
144
+ "FacetRestore": {
145
+ "title": "FacetRestore",
146
+ "type": "object",
147
+ "required": ["facetId"],
148
+ "properties": {
149
+ "facetId": {
150
+ "type": "string",
151
+ "minLength": 1
152
+ },
153
+ "values": {
154
+ "type": "array",
155
+ "items": {
156
+ "type": "string"
157
+ }
158
+ },
159
+ "numericRanges": {
160
+ "type": "array",
161
+ "items": {
162
+ "$ref": "#/$defs/NumericRangeRestore"
163
+ }
164
+ }
165
+ },
166
+ "additionalProperties": false
167
+ },
168
+ "NumericRangeRestore": {
169
+ "title": "NumericRangeRestore",
170
+ "type": "object",
171
+ "required": ["start", "end"],
172
+ "properties": {
173
+ "start": {
174
+ "type": "number"
175
+ },
176
+ "end": {
177
+ "type": "number"
178
+ },
179
+ "endInclusive": {
180
+ "type": "boolean"
181
+ }
182
+ },
183
+ "additionalProperties": false
43
184
  }
44
185
  }
45
186
  }
@@ -9,9 +9,28 @@
9
9
  }
10
10
  ],
11
11
  "properties": {
12
- "componentType": {
12
+ "id": {
13
+ "type": "string"
14
+ },
15
+ "component": {
13
16
  "type": "string",
14
- "const": "comparison-table"
17
+ "const": "ComparisonTable"
18
+ },
19
+ "heading": {
20
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
21
+ "description": "The table heading, bound to /state/<id>/heading."
22
+ },
23
+ "summary": {
24
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
25
+ "description": "The AI summary text, bound to /state/<id>/summary."
26
+ },
27
+ "products": {
28
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
29
+ "description": "The compared products, bound to /state/<id>/products."
30
+ },
31
+ "attributes": {
32
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
33
+ "description": "The ordered attribute descriptors, bound to /state/<id>/attributes."
15
34
  },
16
35
  "state": {
17
36
  "$ref": "#/$defs/ComparisonTableState"
@@ -20,17 +39,6 @@
20
39
  "type": "object",
21
40
  "properties": {},
22
41
  "additionalProperties": false
23
- },
24
- "children": {
25
- "type": "array",
26
- "items": {
27
- "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
28
- },
29
- "maxItems": 1000,
30
- "default": []
31
- },
32
- "child": {
33
- "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
34
42
  }
35
43
  },
36
44
  "additionalProperties": false,
@@ -9,9 +9,40 @@
9
9
  }
10
10
  ],
11
11
  "properties": {
12
- "componentType": {
12
+ "component": {
13
13
  "type": "string",
14
- "const": "date-facet"
14
+ "const": "DateFacet"
15
+ },
16
+ "id": {
17
+ "type": "string"
18
+ },
19
+ "field": {
20
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
21
+ "description": "The commerce index field the facet operates 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 date-range facet values, bound to /state/<id>/values."
30
+ },
31
+ "customRange": {
32
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
33
+ "description": "The custom range, bound to /state/<id>/customRange."
34
+ },
35
+ "hasActiveValues": {
36
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
37
+ "description": "Whether at least one facet value is active, bound to /state/<id>/hasActiveValues."
38
+ },
39
+ "canShowMoreValues": {
40
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
41
+ "description": "Whether more facet values can be shown, bound to /state/<id>/canShowMoreValues."
42
+ },
43
+ "canShowLessValues": {
44
+ "$ref": "https://schema.thermidor.coveo.com/definitions/data-binding.schema.json",
45
+ "description": "Whether fewer facet values can be shown, bound to /state/<id>/canShowLessValues."
15
46
  },
16
47
  "state": {
17
48
  "$ref": "#/$defs/DateFacetState"
@@ -47,17 +78,6 @@
47
78
  }
48
79
  },
49
80
  "additionalProperties": false
50
- },
51
- "children": {
52
- "type": "array",
53
- "items": {
54
- "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
55
- },
56
- "maxItems": 1000,
57
- "default": []
58
- },
59
- "child": {
60
- "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
61
81
  }
62
82
  },
63
83
  "additionalProperties": false,
@@ -2,16 +2,25 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://schema.thermidor.coveo.com/components/facet-manager.schema.json",
4
4
  "title": "FacetManager",
5
- "description": "Manages facet ordering and cross-facet concerns. Holds the backend-determined order of facet components as state. The position of each identifier (indexed from 0) determines the facet's rendering rank. Ready to gain cross-facet actions (e.g., clear all facets, reorder) as needs arise.",
5
+ "description": "Manages facet ordering and cross-facet concerns. Holds the backend-determined order of facet components as state; each identifier's position (from 0) is its rendering rank.",
6
+ "$comment": "Ready to gain cross-facet actions (e.g. clear all facets, reorder) as needs arise.",
6
7
  "allOf": [
7
8
  {
8
9
  "$ref": "https://schema.thermidor.coveo.com/base/component.schema.json"
9
10
  }
10
11
  ],
11
12
  "properties": {
12
- "componentType": {
13
+ "id": {
14
+ "type": "string"
15
+ },
16
+ "component": {
13
17
  "type": "string",
14
- "const": "facet-manager"
18
+ "const": "FacetManager"
19
+ },
20
+ "children": {
21
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-list.schema.json",
22
+ "description": "The backend-determined facet order: a ChildList of ComponentId references whose position (from 0) is each facet's rendering rank.",
23
+ "$comment": "Homogeneous ordered-list composition: child ids are static (binder passes through unresolved), mounted in order via children(id)."
15
24
  },
16
25
  "state": {
17
26
  "$ref": "#/$defs/FacetManagerState"
@@ -20,17 +29,6 @@
20
29
  "type": "object",
21
30
  "properties": {},
22
31
  "additionalProperties": false
23
- },
24
- "children": {
25
- "type": "array",
26
- "items": {
27
- "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
28
- },
29
- "maxItems": 1000,
30
- "default": []
31
- },
32
- "child": {
33
- "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
34
32
  }
35
33
  },
36
34
  "additionalProperties": false,
@@ -2,16 +2,30 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://schema.thermidor.coveo.com/components/layout-stack.schema.json",
4
4
  "title": "LayoutStack",
5
- "description": "Generic layout container that stacks its children along a single axis. It carries no business data: its AG-UI state is empty. Layout is a presentation concern and travels as an A2-UI node prop ('direction': 'column' | 'row'), never as AG-UI state. Reused across surfaces (commerce search, knowledge search) to compose columns and rows from the A2-UI composition plane rather than hardcoding layout per parent renderer.",
5
+ "description": "Generic layout container that stacks its children along a single axis. Carries no business data; its state is empty and the stacking direction travels as a presentation prop.",
6
+ "$comment": "Reused across surfaces to compose rows/columns from the A2-UI composition plane rather than hardcoding layout per parent renderer.",
6
7
  "allOf": [
7
8
  {
8
9
  "$ref": "https://schema.thermidor.coveo.com/base/component.schema.json"
9
10
  }
10
11
  ],
11
12
  "properties": {
12
- "componentType": {
13
+ "id": {
14
+ "type": "string"
15
+ },
16
+ "component": {
17
+ "type": "string",
18
+ "const": "LayoutStack"
19
+ },
20
+ "direction": {
13
21
  "type": "string",
14
- "const": "layout-stack"
22
+ "enum": ["column", "row"],
23
+ "description": "The axis along which children are stacked. A plain presentation value at the node top level, never server state."
24
+ },
25
+ "children": {
26
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-list.schema.json",
27
+ "description": "The ordered children, a ChildList of ComponentId references mounted in order via children(id).",
28
+ "$comment": "Homogeneous ordered-list composition: the ordered list is the semantics; child ids are static, passed through unresolved."
15
29
  },
16
30
  "state": {
17
31
  "$ref": "#/$defs/LayoutStackState"
@@ -20,24 +34,13 @@
20
34
  "type": "object",
21
35
  "properties": {},
22
36
  "additionalProperties": false
23
- },
24
- "children": {
25
- "type": "array",
26
- "items": {
27
- "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
28
- },
29
- "maxItems": 1000,
30
- "default": []
31
- },
32
- "child": {
33
- "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
34
37
  }
35
38
  },
36
39
  "additionalProperties": false,
37
40
  "$defs": {
38
41
  "LayoutStackState": {
39
42
  "title": "LayoutStackState",
40
- "description": "The layout-stack state. A layout container holds no business data, so its state is always the empty object. The stacking direction is presentation and travels as an A2-UI node prop, never as AG-UI state.",
43
+ "description": "Empty: a layout container holds no business data.",
41
44
  "type": "object",
42
45
  "required": [],
43
46
  "properties": {},