@financial-times/content-tree 0.11.0 → 0.12.0-beta.3

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/README.md CHANGED
@@ -198,6 +198,21 @@ A single semantic change to the content tree is usually split across multiple pu
198
198
 
199
199
  Before making a release you will also need to raise a pull request to increment the package.json version number, this should be made in its own PR so that at least one member of each team can approve it. Please get sign-off in the [#dynamic-storytelling-team](https://financialtimes.enterprise.slack.com/archives/C035P5DCHMH) slack channel and share this PR there. Releases are then made via GitHub Releases: they must include a SemVer tag `vX.Y.Z` which matches the one within the package json. The release notes should be completed to communicate what changed in the release. Cutting a release will trigger CI to publish to npm for JS consumers. Go consumers can depend on the new git tag as the module version.
200
200
 
201
+ ### Beta releases
202
+
203
+ If you want to make a beta release from a branch before you merge into main, you can do this with the following steps:
204
+
205
+ * set your release as `v0.0.0-beta.0` where `0` is whatever version number you are setting
206
+ * in Github, go into https://github.com/Financial-Times/content-tree/releases and press the Draft a new release button
207
+ * when drafting the new release
208
+ * set the tag to the same as you have for your beta
209
+ * set the target to the branch that you want to release from
210
+ * set the Release title to the version number
211
+ * fill in release notes as normal
212
+ * check the Pre-release option under Release label
213
+ * Press the Publish release button
214
+
215
+
201
216
  ## License
202
217
 
203
218
  This software is published by the Financial Times under the [MIT licence](mit).
package/SPEC.md CHANGED
@@ -343,28 +343,29 @@ interface Blockquote extends Parent {
343
343
 
344
344
  ```ts
345
345
  type StoryBlock =
346
- | ImageSet
347
- | Flourish
346
+ | AcastPodcast
348
347
  | BigNumber
348
+ | Carousel
349
+ | ClipSet
349
350
  | CustomCodeComponent
351
+ | Definition
352
+ | Flourish
353
+ | ImagePair
354
+ | ImageSet
355
+ | InfoBox
356
+ | InfoPair
357
+ | InNumbers
350
358
  | Layout
351
359
  | Pullquote
352
- | ScrollyBlock
353
- | ClipSet
354
- | Table
355
360
  | Recommended
356
361
  | RecommendedList
362
+ | ScrollyBlock
363
+ | Table
364
+ | Timeline
357
365
  | Tweet
358
366
  | Video
359
- | YoutubeVideo
360
367
  | VimeoVideo
361
- | AcastPodcast
362
- | Timeline
363
- | ImagePair
364
- | InNumbers
365
- | Definition
366
- | InfoBox
367
- | InfoPair
368
+ | YoutubeVideo
368
369
  ```
369
370
 
370
371
  `StoryBlock` nodes are things that can be inserted into an article body.
@@ -867,7 +868,7 @@ interface Table extends Parent {
867
868
 
868
869
  **Table** represents 2d data.
869
870
 
870
- ### CustomCodeComponent
871
+ ### `CustomCodeComponent`
871
872
 
872
873
  ```ts
873
874
  type CustomCodeComponentAttributes = {
@@ -897,7 +898,7 @@ interface CustomCodeComponent extends Node {
897
898
  - The basic interface in Spark to make reference to this system above (eg. the git repo URL or a public S3 bucket), and provide some data for it if necessary. This will be the Custom Component storyblock.
898
899
  - The data Spark receives from entering a specific ID will be used to render dynamic fields (the `attributes`).
899
900
 
900
- ### ImagePair
901
+ ### `ImagePair`
901
902
 
902
903
  ```ts
903
904
  interface ImagePair extends Parent {
@@ -908,7 +909,7 @@ interface ImagePair extends Parent {
908
909
 
909
910
  **ImagePair** is a set of two images
910
911
 
911
- ### Timeline
912
+ ### `Timeline`
912
913
 
913
914
  ```ts
914
915
  /**
@@ -933,7 +934,7 @@ interface TimelineEvent extends Parent {
933
934
  }
934
935
  ```
935
936
 
936
- ### InNumbers
937
+ ### `InNumbers`
937
938
 
938
939
  ```ts
939
940
  /**
@@ -956,7 +957,7 @@ interface InNumbers extends Parent {
956
957
  }
957
958
  ```
958
959
 
959
- ### Card
960
+ ### `Card`
960
961
 
961
962
  ```ts
962
963
  /** Allowed children for a card
@@ -973,7 +974,7 @@ interface Card extends Parent {
973
974
  }
974
975
  ```
975
976
 
976
- ### InfoBox
977
+ ### `InfoBox`
977
978
 
978
979
  ```ts
979
980
  /**
@@ -991,7 +992,7 @@ interface InfoBox extends Parent {
991
992
  }
992
993
  ```
993
994
 
994
- ### InfoPair
995
+ ### `InfoPair`
995
996
 
996
997
  ```ts
997
998
  /**
@@ -1005,9 +1006,50 @@ interface InfoPair extends Parent {
1005
1006
  }
1006
1007
  ```
1007
1008
 
1009
+ ### Carousels
1008
1010
 
1011
+ #### `CarouselCard`
1012
+ ```ts
1013
+ interface CarouselCard extends Node {
1014
+ type: "carousel-card"
1015
+ image: ImageSet
1016
+ title?: string
1017
+ copy: Paragraph[]
1018
+ additionalInfo?: string
1019
+ }
1020
+ ```
1021
+ **CarouselCard** is a single item in a carousel
1009
1022
 
1023
+ #### `CarouselChildren`
1024
+ ```ts
1025
+ /**
1026
+ * @maxItems 10
1027
+ * @minItems 4
1028
+ * @sparkRepeater true
1029
+ */
1030
+ type CarouselChildren = CarouselCard[]
1031
+ ```
1032
+ **CarouselChildren** the array of carousel cards that make up a carousel
1010
1033
 
1034
+ #### `CarouselHeading`
1035
+ ```ts
1036
+ interface CarouselHeading extends Node {
1037
+ type: "carousel-heading"
1038
+ title: string
1039
+ standfirst?: string
1040
+ }
1041
+ ```
1042
+ **CarouselHeading** is the main header for a carousel component
1011
1043
 
1012
-
1013
-
1044
+ #### `Carousel`
1045
+ ```ts
1046
+ /**
1047
+ * @sparkGenerateStoryBlock true
1048
+ */
1049
+ interface Carousel extends Parent {
1050
+ type: "carousel"
1051
+ heading?: CarouselHeading
1052
+ children: CarouselChildren
1053
+ }
1054
+ ```
1055
+ **Carousel** is the main container for a carousel component
package/content-tree.d.ts CHANGED
@@ -95,7 +95,7 @@ export declare namespace ContentTree {
95
95
  type: "blockquote";
96
96
  children: (Paragraph | Phrasing)[];
97
97
  }
98
- type StoryBlock = ImageSet | Flourish | BigNumber | CustomCodeComponent | Layout | Pullquote | ScrollyBlock | ClipSet | Table | Recommended | RecommendedList | Tweet | Video | YoutubeVideo | VimeoVideo | AcastPodcast | Timeline | ImagePair | InNumbers | Definition | InfoBox | InfoPair;
98
+ type StoryBlock = AcastPodcast | BigNumber | Carousel | ClipSet | CustomCodeComponent | Definition | Flourish | ImagePair | ImageSet | InfoBox | InfoPair | InNumbers | Layout | Pullquote | Recommended | RecommendedList | ScrollyBlock | Table | Timeline | Tweet | Video | VimeoVideo | YoutubeVideo;
99
99
  interface Pullquote extends Node {
100
100
  type: "pullquote";
101
101
  text: string;
@@ -439,6 +439,32 @@ export declare namespace ContentTree {
439
439
  title?: string;
440
440
  children: [Card, Card];
441
441
  }
442
+ interface CarouselCard extends Node {
443
+ type: "carousel-card";
444
+ image: ImageSet;
445
+ title?: string;
446
+ copy: Paragraph[];
447
+ additionalInfo?: string;
448
+ }
449
+ /**
450
+ * @maxItems 10
451
+ * @minItems 4
452
+ * @sparkRepeater true
453
+ */
454
+ type CarouselChildren = CarouselCard[];
455
+ interface CarouselHeading extends Node {
456
+ type: "carousel-heading";
457
+ title: string;
458
+ standfirst?: string;
459
+ }
460
+ /**
461
+ * @sparkGenerateStoryBlock true
462
+ */
463
+ interface Carousel extends Parent {
464
+ type: "carousel";
465
+ heading?: CarouselHeading;
466
+ children: CarouselChildren;
467
+ }
442
468
  namespace full {
443
469
  type AssetFormat = "desktop" | "mobile" | "square" | "square-ftedit" | "standard" | "wide" | "standard-inline";
444
470
  type LayoutWidth = "auto" | "in-line" | "inset-left" | "inset-right" | "full-bleed" | "full-grid" | "mid-grid" | "full-width";
@@ -536,7 +562,7 @@ export declare namespace ContentTree {
536
562
  type: "blockquote";
537
563
  children: (Paragraph | Phrasing)[];
538
564
  }
539
- type StoryBlock = ImageSet | Flourish | BigNumber | CustomCodeComponent | Layout | Pullquote | ScrollyBlock | ClipSet | Table | Recommended | RecommendedList | Tweet | Video | YoutubeVideo | VimeoVideo | AcastPodcast | Timeline | ImagePair | InNumbers | Definition | InfoBox | InfoPair;
565
+ type StoryBlock = AcastPodcast | BigNumber | Carousel | ClipSet | CustomCodeComponent | Definition | Flourish | ImagePair | ImageSet | InfoBox | InfoPair | InNumbers | Layout | Pullquote | Recommended | RecommendedList | ScrollyBlock | Table | Timeline | Tweet | Video | VimeoVideo | YoutubeVideo;
540
566
  interface Pullquote extends Node {
541
567
  type: "pullquote";
542
568
  text: string;
@@ -880,6 +906,32 @@ export declare namespace ContentTree {
880
906
  title?: string;
881
907
  children: [Card, Card];
882
908
  }
909
+ interface CarouselCard extends Node {
910
+ type: "carousel-card";
911
+ image: ImageSet;
912
+ title?: string;
913
+ copy: Paragraph[];
914
+ additionalInfo?: string;
915
+ }
916
+ /**
917
+ * @maxItems 10
918
+ * @minItems 4
919
+ * @sparkRepeater true
920
+ */
921
+ type CarouselChildren = CarouselCard[];
922
+ interface CarouselHeading extends Node {
923
+ type: "carousel-heading";
924
+ title: string;
925
+ standfirst?: string;
926
+ }
927
+ /**
928
+ * @sparkGenerateStoryBlock true
929
+ */
930
+ interface Carousel extends Parent {
931
+ type: "carousel";
932
+ heading?: CarouselHeading;
933
+ children: CarouselChildren;
934
+ }
883
935
  }
884
936
  namespace transit {
885
937
  type AssetFormat = "desktop" | "mobile" | "square" | "square-ftedit" | "standard" | "wide" | "standard-inline";
@@ -978,7 +1030,7 @@ export declare namespace ContentTree {
978
1030
  type: "blockquote";
979
1031
  children: (Paragraph | Phrasing)[];
980
1032
  }
981
- type StoryBlock = ImageSet | Flourish | BigNumber | CustomCodeComponent | Layout | Pullquote | ScrollyBlock | ClipSet | Table | Recommended | RecommendedList | Tweet | Video | YoutubeVideo | VimeoVideo | AcastPodcast | Timeline | ImagePair | InNumbers | Definition | InfoBox | InfoPair;
1033
+ type StoryBlock = AcastPodcast | BigNumber | Carousel | ClipSet | CustomCodeComponent | Definition | Flourish | ImagePair | ImageSet | InfoBox | InfoPair | InNumbers | Layout | Pullquote | Recommended | RecommendedList | ScrollyBlock | Table | Timeline | Tweet | Video | VimeoVideo | YoutubeVideo;
982
1034
  interface Pullquote extends Node {
983
1035
  type: "pullquote";
984
1036
  text: string;
@@ -1295,6 +1347,32 @@ export declare namespace ContentTree {
1295
1347
  title?: string;
1296
1348
  children: [Card, Card];
1297
1349
  }
1350
+ interface CarouselCard extends Node {
1351
+ type: "carousel-card";
1352
+ image: ImageSet;
1353
+ title?: string;
1354
+ copy: Paragraph[];
1355
+ additionalInfo?: string;
1356
+ }
1357
+ /**
1358
+ * @maxItems 10
1359
+ * @minItems 4
1360
+ * @sparkRepeater true
1361
+ */
1362
+ type CarouselChildren = CarouselCard[];
1363
+ interface CarouselHeading extends Node {
1364
+ type: "carousel-heading";
1365
+ title: string;
1366
+ standfirst?: string;
1367
+ }
1368
+ /**
1369
+ * @sparkGenerateStoryBlock true
1370
+ */
1371
+ interface Carousel extends Parent {
1372
+ type: "carousel";
1373
+ heading?: CarouselHeading;
1374
+ children: CarouselChildren;
1375
+ }
1298
1376
  }
1299
1377
  namespace loose {
1300
1378
  type AssetFormat = "desktop" | "mobile" | "square" | "square-ftedit" | "standard" | "wide" | "standard-inline";
@@ -1393,7 +1471,7 @@ export declare namespace ContentTree {
1393
1471
  type: "blockquote";
1394
1472
  children: (Paragraph | Phrasing)[];
1395
1473
  }
1396
- type StoryBlock = ImageSet | Flourish | BigNumber | CustomCodeComponent | Layout | Pullquote | ScrollyBlock | ClipSet | Table | Recommended | RecommendedList | Tweet | Video | YoutubeVideo | VimeoVideo | AcastPodcast | Timeline | ImagePair | InNumbers | Definition | InfoBox | InfoPair;
1474
+ type StoryBlock = AcastPodcast | BigNumber | Carousel | ClipSet | CustomCodeComponent | Definition | Flourish | ImagePair | ImageSet | InfoBox | InfoPair | InNumbers | Layout | Pullquote | Recommended | RecommendedList | ScrollyBlock | Table | Timeline | Tweet | Video | VimeoVideo | YoutubeVideo;
1397
1475
  interface Pullquote extends Node {
1398
1476
  type: "pullquote";
1399
1477
  text: string;
@@ -1737,5 +1815,31 @@ export declare namespace ContentTree {
1737
1815
  title?: string;
1738
1816
  children: [Card, Card];
1739
1817
  }
1818
+ interface CarouselCard extends Node {
1819
+ type: "carousel-card";
1820
+ image: ImageSet;
1821
+ title?: string;
1822
+ copy: Paragraph[];
1823
+ additionalInfo?: string;
1824
+ }
1825
+ /**
1826
+ * @maxItems 10
1827
+ * @minItems 4
1828
+ * @sparkRepeater true
1829
+ */
1830
+ type CarouselChildren = CarouselCard[];
1831
+ interface CarouselHeading extends Node {
1832
+ type: "carousel-heading";
1833
+ title: string;
1834
+ standfirst?: string;
1835
+ }
1836
+ /**
1837
+ * @sparkGenerateStoryBlock true
1838
+ */
1839
+ interface Carousel extends Parent {
1840
+ type: "carousel";
1841
+ heading?: CarouselHeading;
1842
+ children: CarouselChildren;
1843
+ }
1740
1844
  }
1741
1845
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@financial-times/content-tree",
3
3
  "description": "content tree format",
4
- "version": "0.11.0",
4
+ "version": "0.12.0-beta.3",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -116,70 +116,73 @@
116
116
  "$ref": "#/definitions/ContentTree.transit.Text"
117
117
  },
118
118
  {
119
- "$ref": "#/definitions/ContentTree.transit.ImageSet"
119
+ "$ref": "#/definitions/ContentTree.transit.AcastPodcast"
120
120
  },
121
121
  {
122
- "$ref": "#/definitions/ContentTree.transit.Flourish"
122
+ "$ref": "#/definitions/ContentTree.transit.BigNumber"
123
123
  },
124
124
  {
125
- "$ref": "#/definitions/ContentTree.transit.BigNumber"
125
+ "$ref": "#/definitions/ContentTree.transit.Carousel"
126
+ },
127
+ {
128
+ "$ref": "#/definitions/ContentTree.transit.ClipSet"
126
129
  },
127
130
  {
128
131
  "$ref": "#/definitions/ContentTree.transit.CustomCodeComponent"
129
132
  },
130
133
  {
131
- "$ref": "#/definitions/ContentTree.transit.Layout"
134
+ "$ref": "#/definitions/ContentTree.transit.Definition"
132
135
  },
133
136
  {
134
- "$ref": "#/definitions/ContentTree.transit.Pullquote"
137
+ "$ref": "#/definitions/ContentTree.transit.Flourish"
135
138
  },
136
139
  {
137
- "$ref": "#/definitions/ContentTree.transit.ScrollyBlock"
140
+ "$ref": "#/definitions/ContentTree.transit.ImagePair"
138
141
  },
139
142
  {
140
- "$ref": "#/definitions/ContentTree.transit.ClipSet"
143
+ "$ref": "#/definitions/ContentTree.transit.ImageSet"
141
144
  },
142
145
  {
143
- "$ref": "#/definitions/ContentTree.transit.Table"
146
+ "$ref": "#/definitions/ContentTree.transit.InfoBox"
144
147
  },
145
148
  {
146
- "$ref": "#/definitions/ContentTree.transit.Recommended"
149
+ "$ref": "#/definitions/ContentTree.transit.InfoPair"
147
150
  },
148
151
  {
149
- "$ref": "#/definitions/ContentTree.transit.RecommendedList"
152
+ "$ref": "#/definitions/ContentTree.transit.InNumbers"
150
153
  },
151
154
  {
152
- "$ref": "#/definitions/ContentTree.transit.Tweet"
155
+ "$ref": "#/definitions/ContentTree.transit.Layout"
153
156
  },
154
157
  {
155
- "$ref": "#/definitions/ContentTree.transit.Video"
158
+ "$ref": "#/definitions/ContentTree.transit.Pullquote"
156
159
  },
157
160
  {
158
- "$ref": "#/definitions/ContentTree.transit.YoutubeVideo"
161
+ "$ref": "#/definitions/ContentTree.transit.Recommended"
159
162
  },
160
163
  {
161
- "$ref": "#/definitions/ContentTree.transit.VimeoVideo"
164
+ "$ref": "#/definitions/ContentTree.transit.RecommendedList"
162
165
  },
163
166
  {
164
- "$ref": "#/definitions/ContentTree.transit.AcastPodcast"
167
+ "$ref": "#/definitions/ContentTree.transit.ScrollyBlock"
165
168
  },
166
169
  {
167
- "$ref": "#/definitions/ContentTree.transit.Timeline"
170
+ "$ref": "#/definitions/ContentTree.transit.Table"
168
171
  },
169
172
  {
170
- "$ref": "#/definitions/ContentTree.transit.ImagePair"
173
+ "$ref": "#/definitions/ContentTree.transit.Timeline"
171
174
  },
172
175
  {
173
- "$ref": "#/definitions/ContentTree.transit.InNumbers"
176
+ "$ref": "#/definitions/ContentTree.transit.Tweet"
174
177
  },
175
178
  {
176
- "$ref": "#/definitions/ContentTree.transit.Definition"
179
+ "$ref": "#/definitions/ContentTree.transit.Video"
177
180
  },
178
181
  {
179
- "$ref": "#/definitions/ContentTree.transit.InfoBox"
182
+ "$ref": "#/definitions/ContentTree.transit.VimeoVideo"
180
183
  },
181
184
  {
182
- "$ref": "#/definitions/ContentTree.transit.InfoPair"
185
+ "$ref": "#/definitions/ContentTree.transit.YoutubeVideo"
183
186
  }
184
187
  ]
185
188
  },
@@ -246,6 +249,85 @@
246
249
  ],
247
250
  "description": "Allowed children for a card"
248
251
  },
252
+ "ContentTree.transit.Carousel": {
253
+ "additionalProperties": false,
254
+ "properties": {
255
+ "children": {
256
+ "items": {
257
+ "$ref": "#/definitions/ContentTree.transit.CarouselCard"
258
+ },
259
+ "maxItems": 10,
260
+ "minItems": 4,
261
+ "sparkRepeater": true,
262
+ "type": "array"
263
+ },
264
+ "data": {},
265
+ "heading": {
266
+ "$ref": "#/definitions/ContentTree.transit.CarouselHeading"
267
+ },
268
+ "type": {
269
+ "const": "carousel",
270
+ "type": "string"
271
+ }
272
+ },
273
+ "required": [
274
+ "children",
275
+ "type"
276
+ ],
277
+ "type": "object"
278
+ },
279
+ "ContentTree.transit.CarouselCard": {
280
+ "additionalProperties": false,
281
+ "properties": {
282
+ "additionalInfo": {
283
+ "type": "string"
284
+ },
285
+ "copy": {
286
+ "items": {
287
+ "$ref": "#/definitions/ContentTree.transit.Paragraph"
288
+ },
289
+ "type": "array"
290
+ },
291
+ "data": {},
292
+ "image": {
293
+ "$ref": "#/definitions/ContentTree.transit.ImageSet"
294
+ },
295
+ "title": {
296
+ "type": "string"
297
+ },
298
+ "type": {
299
+ "const": "carousel-card",
300
+ "type": "string"
301
+ }
302
+ },
303
+ "required": [
304
+ "copy",
305
+ "image",
306
+ "type"
307
+ ],
308
+ "type": "object"
309
+ },
310
+ "ContentTree.transit.CarouselHeading": {
311
+ "additionalProperties": false,
312
+ "properties": {
313
+ "data": {},
314
+ "standfirst": {
315
+ "type": "string"
316
+ },
317
+ "title": {
318
+ "type": "string"
319
+ },
320
+ "type": {
321
+ "const": "carousel-heading",
322
+ "type": "string"
323
+ }
324
+ },
325
+ "required": [
326
+ "title",
327
+ "type"
328
+ ],
329
+ "type": "object"
330
+ },
249
331
  "ContentTree.transit.ClipSet": {
250
332
  "additionalProperties": false,
251
333
  "properties": {
@@ -153,70 +153,73 @@
153
153
  "$ref": "#/definitions/ContentTree.full.Text"
154
154
  },
155
155
  {
156
- "$ref": "#/definitions/ContentTree.full.ImageSet"
156
+ "$ref": "#/definitions/ContentTree.full.AcastPodcast"
157
157
  },
158
158
  {
159
- "$ref": "#/definitions/ContentTree.full.Flourish"
159
+ "$ref": "#/definitions/ContentTree.full.BigNumber"
160
160
  },
161
161
  {
162
- "$ref": "#/definitions/ContentTree.full.BigNumber"
162
+ "$ref": "#/definitions/ContentTree.full.Carousel"
163
+ },
164
+ {
165
+ "$ref": "#/definitions/ContentTree.full.ClipSet"
163
166
  },
164
167
  {
165
168
  "$ref": "#/definitions/ContentTree.full.CustomCodeComponent"
166
169
  },
167
170
  {
168
- "$ref": "#/definitions/ContentTree.full.Layout"
171
+ "$ref": "#/definitions/ContentTree.full.Definition"
169
172
  },
170
173
  {
171
- "$ref": "#/definitions/ContentTree.full.Pullquote"
174
+ "$ref": "#/definitions/ContentTree.full.Flourish"
172
175
  },
173
176
  {
174
- "$ref": "#/definitions/ContentTree.full.ScrollyBlock"
177
+ "$ref": "#/definitions/ContentTree.full.ImagePair"
175
178
  },
176
179
  {
177
- "$ref": "#/definitions/ContentTree.full.ClipSet"
180
+ "$ref": "#/definitions/ContentTree.full.ImageSet"
178
181
  },
179
182
  {
180
- "$ref": "#/definitions/ContentTree.full.Table"
183
+ "$ref": "#/definitions/ContentTree.full.InfoBox"
181
184
  },
182
185
  {
183
- "$ref": "#/definitions/ContentTree.full.Recommended"
186
+ "$ref": "#/definitions/ContentTree.full.InfoPair"
184
187
  },
185
188
  {
186
- "$ref": "#/definitions/ContentTree.full.RecommendedList"
189
+ "$ref": "#/definitions/ContentTree.full.InNumbers"
187
190
  },
188
191
  {
189
- "$ref": "#/definitions/ContentTree.full.Tweet"
192
+ "$ref": "#/definitions/ContentTree.full.Layout"
190
193
  },
191
194
  {
192
- "$ref": "#/definitions/ContentTree.full.Video"
195
+ "$ref": "#/definitions/ContentTree.full.Pullquote"
193
196
  },
194
197
  {
195
- "$ref": "#/definitions/ContentTree.full.YoutubeVideo"
198
+ "$ref": "#/definitions/ContentTree.full.Recommended"
196
199
  },
197
200
  {
198
- "$ref": "#/definitions/ContentTree.full.VimeoVideo"
201
+ "$ref": "#/definitions/ContentTree.full.RecommendedList"
199
202
  },
200
203
  {
201
- "$ref": "#/definitions/ContentTree.full.AcastPodcast"
204
+ "$ref": "#/definitions/ContentTree.full.ScrollyBlock"
202
205
  },
203
206
  {
204
- "$ref": "#/definitions/ContentTree.full.Timeline"
207
+ "$ref": "#/definitions/ContentTree.full.Table"
205
208
  },
206
209
  {
207
- "$ref": "#/definitions/ContentTree.full.ImagePair"
210
+ "$ref": "#/definitions/ContentTree.full.Timeline"
208
211
  },
209
212
  {
210
- "$ref": "#/definitions/ContentTree.full.InNumbers"
213
+ "$ref": "#/definitions/ContentTree.full.Tweet"
211
214
  },
212
215
  {
213
- "$ref": "#/definitions/ContentTree.full.Definition"
216
+ "$ref": "#/definitions/ContentTree.full.Video"
214
217
  },
215
218
  {
216
- "$ref": "#/definitions/ContentTree.full.InfoBox"
219
+ "$ref": "#/definitions/ContentTree.full.VimeoVideo"
217
220
  },
218
221
  {
219
- "$ref": "#/definitions/ContentTree.full.InfoPair"
222
+ "$ref": "#/definitions/ContentTree.full.YoutubeVideo"
220
223
  }
221
224
  ]
222
225
  },
@@ -283,6 +286,84 @@
283
286
  ],
284
287
  "description": "Allowed children for a card"
285
288
  },
289
+ "ContentTree.full.Carousel": {
290
+ "additionalProperties": false,
291
+ "properties": {
292
+ "children": {
293
+ "items": {
294
+ "$ref": "#/definitions/ContentTree.full.CarouselCard"
295
+ },
296
+ "maxItems": 10,
297
+ "minItems": 4,
298
+ "type": "array"
299
+ },
300
+ "data": {},
301
+ "heading": {
302
+ "$ref": "#/definitions/ContentTree.full.CarouselHeading"
303
+ },
304
+ "type": {
305
+ "const": "carousel",
306
+ "type": "string"
307
+ }
308
+ },
309
+ "required": [
310
+ "children",
311
+ "type"
312
+ ],
313
+ "type": "object"
314
+ },
315
+ "ContentTree.full.CarouselCard": {
316
+ "additionalProperties": false,
317
+ "properties": {
318
+ "additionalInfo": {
319
+ "type": "string"
320
+ },
321
+ "copy": {
322
+ "items": {
323
+ "$ref": "#/definitions/ContentTree.full.Paragraph"
324
+ },
325
+ "type": "array"
326
+ },
327
+ "data": {},
328
+ "image": {
329
+ "$ref": "#/definitions/ContentTree.full.ImageSet"
330
+ },
331
+ "title": {
332
+ "type": "string"
333
+ },
334
+ "type": {
335
+ "const": "carousel-card",
336
+ "type": "string"
337
+ }
338
+ },
339
+ "required": [
340
+ "copy",
341
+ "image",
342
+ "type"
343
+ ],
344
+ "type": "object"
345
+ },
346
+ "ContentTree.full.CarouselHeading": {
347
+ "additionalProperties": false,
348
+ "properties": {
349
+ "data": {},
350
+ "standfirst": {
351
+ "type": "string"
352
+ },
353
+ "title": {
354
+ "type": "string"
355
+ },
356
+ "type": {
357
+ "const": "carousel-heading",
358
+ "type": "string"
359
+ }
360
+ },
361
+ "required": [
362
+ "title",
363
+ "type"
364
+ ],
365
+ "type": "object"
366
+ },
286
367
  "ContentTree.full.ClipSet": {
287
368
  "additionalProperties": false,
288
369
  "properties": {
@@ -141,70 +141,73 @@
141
141
  "$ref": "#/definitions/ContentTree.transit.Text"
142
142
  },
143
143
  {
144
- "$ref": "#/definitions/ContentTree.transit.ImageSet"
144
+ "$ref": "#/definitions/ContentTree.transit.AcastPodcast"
145
145
  },
146
146
  {
147
- "$ref": "#/definitions/ContentTree.transit.Flourish"
147
+ "$ref": "#/definitions/ContentTree.transit.BigNumber"
148
148
  },
149
149
  {
150
- "$ref": "#/definitions/ContentTree.transit.BigNumber"
150
+ "$ref": "#/definitions/ContentTree.transit.Carousel"
151
+ },
152
+ {
153
+ "$ref": "#/definitions/ContentTree.transit.ClipSet"
151
154
  },
152
155
  {
153
156
  "$ref": "#/definitions/ContentTree.transit.CustomCodeComponent"
154
157
  },
155
158
  {
156
- "$ref": "#/definitions/ContentTree.transit.Layout"
159
+ "$ref": "#/definitions/ContentTree.transit.Definition"
157
160
  },
158
161
  {
159
- "$ref": "#/definitions/ContentTree.transit.Pullquote"
162
+ "$ref": "#/definitions/ContentTree.transit.Flourish"
160
163
  },
161
164
  {
162
- "$ref": "#/definitions/ContentTree.transit.ScrollyBlock"
165
+ "$ref": "#/definitions/ContentTree.transit.ImagePair"
163
166
  },
164
167
  {
165
- "$ref": "#/definitions/ContentTree.transit.ClipSet"
168
+ "$ref": "#/definitions/ContentTree.transit.ImageSet"
166
169
  },
167
170
  {
168
- "$ref": "#/definitions/ContentTree.transit.Table"
171
+ "$ref": "#/definitions/ContentTree.transit.InfoBox"
169
172
  },
170
173
  {
171
- "$ref": "#/definitions/ContentTree.transit.Recommended"
174
+ "$ref": "#/definitions/ContentTree.transit.InfoPair"
172
175
  },
173
176
  {
174
- "$ref": "#/definitions/ContentTree.transit.RecommendedList"
177
+ "$ref": "#/definitions/ContentTree.transit.InNumbers"
175
178
  },
176
179
  {
177
- "$ref": "#/definitions/ContentTree.transit.Tweet"
180
+ "$ref": "#/definitions/ContentTree.transit.Layout"
178
181
  },
179
182
  {
180
- "$ref": "#/definitions/ContentTree.transit.Video"
183
+ "$ref": "#/definitions/ContentTree.transit.Pullquote"
181
184
  },
182
185
  {
183
- "$ref": "#/definitions/ContentTree.transit.YoutubeVideo"
186
+ "$ref": "#/definitions/ContentTree.transit.Recommended"
184
187
  },
185
188
  {
186
- "$ref": "#/definitions/ContentTree.transit.VimeoVideo"
189
+ "$ref": "#/definitions/ContentTree.transit.RecommendedList"
187
190
  },
188
191
  {
189
- "$ref": "#/definitions/ContentTree.transit.AcastPodcast"
192
+ "$ref": "#/definitions/ContentTree.transit.ScrollyBlock"
190
193
  },
191
194
  {
192
- "$ref": "#/definitions/ContentTree.transit.Timeline"
195
+ "$ref": "#/definitions/ContentTree.transit.Table"
193
196
  },
194
197
  {
195
- "$ref": "#/definitions/ContentTree.transit.ImagePair"
198
+ "$ref": "#/definitions/ContentTree.transit.Timeline"
196
199
  },
197
200
  {
198
- "$ref": "#/definitions/ContentTree.transit.InNumbers"
201
+ "$ref": "#/definitions/ContentTree.transit.Tweet"
199
202
  },
200
203
  {
201
- "$ref": "#/definitions/ContentTree.transit.Definition"
204
+ "$ref": "#/definitions/ContentTree.transit.Video"
202
205
  },
203
206
  {
204
- "$ref": "#/definitions/ContentTree.transit.InfoBox"
207
+ "$ref": "#/definitions/ContentTree.transit.VimeoVideo"
205
208
  },
206
209
  {
207
- "$ref": "#/definitions/ContentTree.transit.InfoPair"
210
+ "$ref": "#/definitions/ContentTree.transit.YoutubeVideo"
208
211
  }
209
212
  ]
210
213
  },
@@ -271,6 +274,84 @@
271
274
  ],
272
275
  "description": "Allowed children for a card"
273
276
  },
277
+ "ContentTree.transit.Carousel": {
278
+ "additionalProperties": false,
279
+ "properties": {
280
+ "children": {
281
+ "items": {
282
+ "$ref": "#/definitions/ContentTree.transit.CarouselCard"
283
+ },
284
+ "maxItems": 10,
285
+ "minItems": 4,
286
+ "type": "array"
287
+ },
288
+ "data": {},
289
+ "heading": {
290
+ "$ref": "#/definitions/ContentTree.transit.CarouselHeading"
291
+ },
292
+ "type": {
293
+ "const": "carousel",
294
+ "type": "string"
295
+ }
296
+ },
297
+ "required": [
298
+ "children",
299
+ "type"
300
+ ],
301
+ "type": "object"
302
+ },
303
+ "ContentTree.transit.CarouselCard": {
304
+ "additionalProperties": false,
305
+ "properties": {
306
+ "additionalInfo": {
307
+ "type": "string"
308
+ },
309
+ "copy": {
310
+ "items": {
311
+ "$ref": "#/definitions/ContentTree.transit.Paragraph"
312
+ },
313
+ "type": "array"
314
+ },
315
+ "data": {},
316
+ "image": {
317
+ "$ref": "#/definitions/ContentTree.transit.ImageSet"
318
+ },
319
+ "title": {
320
+ "type": "string"
321
+ },
322
+ "type": {
323
+ "const": "carousel-card",
324
+ "type": "string"
325
+ }
326
+ },
327
+ "required": [
328
+ "copy",
329
+ "image",
330
+ "type"
331
+ ],
332
+ "type": "object"
333
+ },
334
+ "ContentTree.transit.CarouselHeading": {
335
+ "additionalProperties": false,
336
+ "properties": {
337
+ "data": {},
338
+ "standfirst": {
339
+ "type": "string"
340
+ },
341
+ "title": {
342
+ "type": "string"
343
+ },
344
+ "type": {
345
+ "const": "carousel-heading",
346
+ "type": "string"
347
+ }
348
+ },
349
+ "required": [
350
+ "title",
351
+ "type"
352
+ ],
353
+ "type": "object"
354
+ },
274
355
  "ContentTree.transit.ClipSet": {
275
356
  "additionalProperties": false,
276
357
  "properties": {