@financial-times/cp-content-pipeline-ui 9.13.0 → 9.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/lib/components/ContentLayout/index.d.ts +2 -1
  3. package/lib/components/ContentLayout/index.js +1 -1
  4. package/lib/components/ContentLayout/index.js.map +1 -1
  5. package/lib/components/ContentLayout/test/snapshot.spec.d.ts +1 -0
  6. package/lib/components/ContentLayout/test/snapshot.spec.js +33 -0
  7. package/lib/components/ContentLayout/test/snapshot.spec.js.map +1 -0
  8. package/lib/components/RichText/index.js +4 -0
  9. package/lib/components/RichText/index.js.map +1 -1
  10. package/lib/components/content-tree/Clip/template/component.js +1 -1
  11. package/lib/components/content-tree/Clip/template/component.js.map +1 -1
  12. package/lib/components/content-tree/Timeline/TimelineEvent.d.ts +7 -0
  13. package/lib/components/content-tree/Timeline/TimelineEvent.js +17 -0
  14. package/lib/components/content-tree/Timeline/TimelineEvent.js.map +1 -0
  15. package/lib/components/content-tree/Timeline/index.d.ts +6 -0
  16. package/lib/components/content-tree/Timeline/index.js +17 -0
  17. package/lib/components/content-tree/Timeline/index.js.map +1 -0
  18. package/lib/components/content-tree/Timeline/test/TimelineEvent.spec.d.ts +1 -0
  19. package/lib/components/content-tree/Timeline/test/TimelineEvent.spec.js +48 -0
  20. package/lib/components/content-tree/Timeline/test/TimelineEvent.spec.js.map +1 -0
  21. package/lib/components/content-tree/Timeline/test/snapshot.spec.d.ts +1 -0
  22. package/lib/components/content-tree/Timeline/test/snapshot.spec.js +17 -0
  23. package/lib/components/content-tree/Timeline/test/snapshot.spec.js.map +1 -0
  24. package/lib/index.d.ts +2 -0
  25. package/lib/index.js +5 -1
  26. package/lib/index.js.map +1 -1
  27. package/lib/main.scss +1 -0
  28. package/package.json +5 -5
  29. package/src/components/ContentLayout/index.tsx +3 -7
  30. package/src/components/ContentLayout/test/__snapshots__/snapshot.spec.tsx.snap +80 -0
  31. package/src/components/ContentLayout/test/snapshot.spec.tsx +47 -0
  32. package/src/components/RichText/index.tsx +4 -0
  33. package/src/components/content-tree/Clip/template/component.tsx +1 -1
  34. package/src/components/content-tree/Timeline/TimelineEvent.tsx +25 -0
  35. package/src/components/content-tree/Timeline/client/main.scss +55 -0
  36. package/src/components/content-tree/Timeline/index.tsx +19 -0
  37. package/src/components/content-tree/Timeline/test/TimelineEvent.spec.tsx +66 -0
  38. package/src/components/content-tree/Timeline/test/__snapshots__/TimelineEvent.spec.tsx.snap +94 -0
  39. package/src/components/content-tree/Timeline/test/__snapshots__/snapshot.spec.tsx.snap +20 -0
  40. package/src/components/content-tree/Timeline/test/snapshot.spec.tsx +15 -0
  41. package/src/index.ts +2 -0
  42. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -574,6 +574,22 @@
574
574
  * @financial-times/cp-content-pipeline-client bumped from ^3.7.2 to ^3.7.3
575
575
  * @financial-times/cp-content-pipeline-schema bumped from ^2.10.1 to ^2.10.2
576
576
 
577
+ ## [9.14.0](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-ui-v9.13.0...cp-content-pipeline-ui-v9.14.0) (2025-12-16)
578
+
579
+
580
+ ### Features
581
+
582
+ * timeline component ([e1e8e60](https://github.com/Financial-Times/cp-content-pipeline/commit/e1e8e60dcd6aba2527b8b4a64d144cc7c6180b93))
583
+
584
+
585
+ ### Dependencies
586
+
587
+ * The following workspace dependencies were updated
588
+ * devDependencies
589
+ * @financial-times/cp-content-pipeline-client bumped from ^4.20.2 to ^4.21.0
590
+ * @financial-times/cp-content-pipeline-schema bumped from ^3.21.0 to ^3.22.0
591
+ * @financial-times/cp-content-pipeline-styles bumped from ^4.5.0 to ^4.6.0
592
+
577
593
  ## [9.13.0](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-ui-v9.12.1...cp-content-pipeline-ui-v9.13.0) (2025-12-11)
578
594
 
579
595
 
@@ -16,9 +16,10 @@ import React from 'react';
16
16
  */
17
17
  type LayoutWidth = 'in-line' | 'mid-grid' | 'full-grid';
18
18
  interface ContentLayoutProps {
19
- dataLayout: LayoutWidth;
19
+ dataLayout?: LayoutWidth;
20
20
  dataComponent?: string;
21
21
  className?: string;
22
+ children: React.ReactNode;
22
23
  }
23
24
  export declare const ContentLayout: React.FC<React.PropsWithChildren<ContentLayoutProps>>;
24
25
  export {};
@@ -17,7 +17,7 @@ const OverflowingLayout = ({ children, }) => (react_1.default.createElement("div
17
17
  * @param dataLayout - The layout type of the content (e.g., 'full-grid', 'mid-grid', etc.).
18
18
  * @param dataComponent - The component type used as data-component attribute for client-side targeting.
19
19
  */
20
- const ContentLayout = ({ dataLayout = 'in-line', children, dataComponent = '', className = '', }) => {
20
+ const ContentLayout = ({ dataLayout = 'in-line', children, dataComponent, className = '' }) => {
21
21
  const ContainerClassNames = (0, classnames_1.default)('n-content-layout__container', className);
22
22
  if (dataLayout === 'full-grid') {
23
23
  return (react_1.default.createElement(OverflowingLayout, null,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ContentLayout/index.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAAyB;AACzB,4DAAmC;AAyBnC;;;;GAIG;AACH,MAAM,iBAAiB,GAA4C,CAAC,EAClE,QAAQ,GACT,EAAE,EAAE,CAAC,CACJ,uCAAK,SAAS,EAAC,kBAAkB,uBAAmB,WAAW,IAC5D,QAAQ,CACL,CACP,CAAA;AAED;;;;GAIG;AACI,MAAM,aAAa,GAEtB,CAAC,EACH,UAAU,GAAG,SAAS,EACtB,QAAQ,EACR,aAAa,GAAG,EAAE,EAClB,SAAS,GAAG,EAAE,GACf,EAAE,EAAE;IACH,MAAM,mBAAmB,GAAG,IAAA,oBAAU,EACpC,6BAA6B,EAC7B,SAAS,CACV,CAAA;IAED,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QAC/B,OAAO,CACL,8BAAC,iBAAiB;YAChB,uCAAK,SAAS,EAAE,mBAAmB,oBAAkB,aAAa,IAC/D,QAAQ,CACL,CACY,CACrB,CAAA;IACH,CAAC;IAED,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,CACL,8BAAC,iBAAiB;YAChB,uCAAK,SAAS,EAAE,mBAAmB,oBAAkB,aAAa;gBAChE,8DACsB,qBAAqB,EACzC,SAAS,EAAC,uCAAuC,IAEhD,QAAQ,CACL,CACF,CACY,CACrB,CAAA;IACH,CAAC;IAED,OAAO,CACL,uCACE,SAAS,EAAC,sCAAsC,oBAChC,aAAa,IAE5B,QAAQ,CACL,CACP,CAAA;AACH,CAAC,CAAA;AA9CY,QAAA,aAAa,iBA8CzB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ContentLayout/index.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAAyB;AACzB,4DAAmC;AA0BnC;;;;GAIG;AACH,MAAM,iBAAiB,GAA4C,CAAC,EAClE,QAAQ,GACT,EAAE,EAAE,CAAC,CACJ,uCAAK,SAAS,EAAC,kBAAkB,uBAAmB,WAAW,IAC5D,QAAQ,CACL,CACP,CAAA;AAED;;;;GAIG;AACI,MAAM,aAAa,GAEtB,CAAC,EAAE,UAAU,GAAG,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE;IAC1E,MAAM,mBAAmB,GAAG,IAAA,oBAAU,EACpC,6BAA6B,EAC7B,SAAS,CACV,CAAA;IAED,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QAC/B,OAAO,CACL,8BAAC,iBAAiB;YAChB,uCAAK,SAAS,EAAE,mBAAmB,oBAAkB,aAAa,IAC/D,QAAQ,CACL,CACY,CACrB,CAAA;IACH,CAAC;IAED,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,CACL,8BAAC,iBAAiB;YAChB,uCAAK,SAAS,EAAE,mBAAmB,oBAAkB,aAAa;gBAChE,8DACsB,qBAAqB,EACzC,SAAS,EAAC,uCAAuC,IAEhD,QAAQ,CACL,CACF,CACY,CACrB,CAAA;IACH,CAAC;IAED,OAAO,CACL,uCACE,SAAS,EAAC,sCAAsC,oBAChC,aAAa,IAE5B,QAAQ,CACL,CACP,CAAA;AACH,CAAC,CAAA;AAzCY,QAAA,aAAa,iBAyCzB"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const react_2 = require("@testing-library/react");
8
+ const index_1 = require("../index");
9
+ describe('ContentLayout', () => {
10
+ it('renders with full-grid layout', () => {
11
+ const { container } = (0, react_2.render)(react_1.default.createElement(index_1.ContentLayout, { dataLayout: "full-grid" },
12
+ react_1.default.createElement("div", null, "Test content")));
13
+ expect(container).toMatchSnapshot();
14
+ });
15
+ it('renders with any accepted layout', () => {
16
+ const { container } = (0, react_2.render)(react_1.default.createElement(index_1.ContentLayout, { dataLayout: "mid-grid" },
17
+ react_1.default.createElement("span", null, "Inline content")));
18
+ expect(container).toMatchSnapshot();
19
+ });
20
+ it('renders with multiple children', () => {
21
+ const { container } = (0, react_2.render)(react_1.default.createElement(index_1.ContentLayout, { dataLayout: "mid-grid" },
22
+ react_1.default.createElement("h1", null, "Title"),
23
+ react_1.default.createElement("p", null, "Paragraph content"),
24
+ react_1.default.createElement("div", null, "Additional content")));
25
+ expect(container).toMatchSnapshot();
26
+ });
27
+ it('renders treating no dataLayout as default inline)', () => {
28
+ const { container } = (0, react_2.render)(react_1.default.createElement(index_1.ContentLayout, null,
29
+ react_1.default.createElement("div", null, "Empty layout content")));
30
+ expect(container).toMatchSnapshot();
31
+ });
32
+ });
33
+ //# sourceMappingURL=snapshot.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.spec.js","sourceRoot":"","sources":["../../../../src/components/ContentLayout/test/snapshot.spec.tsx"],"names":[],"mappings":";;;;;AAAA,kDAAyB;AACzB,kDAA+C;AAC/C,oCAAwC;AAExC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,cAAM,EAC1B,8BAAC,qBAAa,IAAC,UAAU,EAAC,WAAW;YACnC,0DAAuB,CACT,CACjB,CAAA;QAED,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,EAAE,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,cAAM,EAC1B,8BAAC,qBAAa,IAAC,UAAU,EAAC,UAAU;YAClC,6DAA2B,CACb,CACjB,CAAA;QAED,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,EAAE,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,cAAM,EAC1B,8BAAC,qBAAa,IAAC,UAAU,EAAC,UAAU;YAClC,kDAAc;YACd,6DAAwB;YACxB,gEAA6B,CACf,CACjB,CAAA;QAED,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,EAAE,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,cAAM,EAC1B,8BAAC,qBAAa;YACZ,kEAA+B,CACjB,CACjB,CAAA;QAED,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,EAAE,CAAA;IACrC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -47,6 +47,8 @@ const Scrollytelling_1 = require("../content-tree/Scrollytelling");
47
47
  const ScrollyImage_1 = require("../content-tree/Scrollytelling/ScrollyImage");
48
48
  const YoutubeVideo_1 = __importDefault(require("../content-tree/YoutubeVideo"));
49
49
  const CustomCodeComponent_1 = __importDefault(require("../content-tree/CustomCodeComponent"));
50
+ const Timeline_1 = __importDefault(require("../content-tree/Timeline"));
51
+ const TimelineEvent_1 = __importDefault(require("../content-tree/Timeline/TimelineEvent"));
50
52
  const BasicComponents_1 = require("./BasicComponents");
51
53
  const context_1 = __importDefault(require("./context"));
52
54
  exports.ComponentsContext = (0, react_1.createContext)({});
@@ -95,6 +97,8 @@ const componentMap = {
95
97
  tweet: Tweet_1.default,
96
98
  video: Video_1.default,
97
99
  'youtube-video': YoutubeVideo_1.default,
100
+ timeline: Timeline_1.default,
101
+ 'timeline-event': TimelineEvent_1.default,
98
102
  };
99
103
  function isParentNode(node) {
100
104
  return 'children' in node;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/RichText/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAKc;AAGd,8EAAqD;AACrD,sFAA6D;AAC7D,qEAAkE;AAClE,mDAA2D;AAC3D,0EAAiD;AACjD,kEAAyC;AACzC,wEAA+C;AAC/C,sEAA6C;AAC7C,0EAAiD;AACjD,kEAAyC;AACzC,kEAAyC;AACzC,gEAAuC;AACvC,0EAAiD;AACjD,gFAAuD;AACvD,+DAA2D;AAC3D,mEAKuC;AACvC,8EAA0E;AAC1E,gFAAuD;AACvD,8FAAqE;AAErE,uDAe0B;AAU1B,wDAAuC;AA0B1B,QAAA,iBAAiB,GAAG,IAAA,qBAAa,EAE5C,EAAE,CAAC,CAAA;AAcL;;GAEG;AAEH,MAAM,YAAY,GAA+B;IAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ;IACnC,YAAY,EAAE,mBAAS;IACvB,IAAI,EAAE,sBAAI;IACV,UAAU,EAAE,4BAAU;IACtB,KAAK,EAAE,2BAAS;IAChB,mBAAmB,EAAE,iCAAe;IACpC,UAAU,EAAE,cAAI;IAChB,IAAI,EAAE,cAAI;IACV,uBAAuB,EAAE,6BAAmB;IAC5C,QAAQ,EAAE,0BAAQ;IAClB,QAAQ,EAAE,kBAAQ;IAClB,OAAO,EAAE,iBAAO;IAChB,WAAW,EAAE,kBAAQ;IACrB,cAAc,EAAE,kBAAQ;IACxB,aAAa,EAAE,mBAAU;IACzB,MAAM,EAAE,eAAM;IACd,IAAI,EAAE,sBAAI;IACV,WAAW,EAAE,0BAAQ;IACrB,IAAI,EAAE,sBAAI;IACV,SAAS,EAAE,mBAAS;IACpB,SAAS,EAAE,mBAAS;IACpB,WAAW,EAAE,wBAAa;IAC1B,WAAW,EAAE,qBAAW;IACxB,kBAAkB,EAAE,yBAAe;IACnC,eAAe,EAAE,6BAAY;IAC7B,cAAc,EAAE,4BAAW;IAC3B,iBAAiB,EAAE,+BAAc;IACjC,eAAe,EAAE,2BAAY;IAC7B,iBAAiB,EAAE,+BAAc;IACjC,aAAa,EAAE,+BAAa;IAC5B,MAAM,EAAE,wBAAM;IACd,YAAY,EAAE,mBAAS;IACvB,eAAe,EAAE,8BAAY;IAC7B,YAAY,EAAE,qBAAS;IACvB,cAAc,EAAE,6BAAW;IAC3B,WAAW,EAAE,0BAAQ;IACrB,KAAK,EAAE,eAAK;IACZ,gBAAgB,EAAE,gCAAc;IAChC,KAAK,EAAE,eAAK;IACZ,KAAK,EAAE,eAAK;IACZ,eAAe,EAAE,sBAAY;CAC9B,CAAA;AAED,SAAS,YAAY,CACnB,IAAuD;IAEvD,OAAO,UAAU,IAAI,IAAI,CAAA;AAC3B,CAAC;AASD,MAAM,aAAa,GAAiC,CAAC,EACnD,IAAI,EACJ,UAAU,EACV,UAAU,EACV,WAAW,GACZ,EAAE,EAAE;IACH,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,8DAAG,IAAI,CAAC,KAAK,CAAI,CAAA;IAC1B,CAAC;IAED,IAAI,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CACV,iDAAiD,IAAI,CAAC,IAAI,iFAAiF,CAC5I,CAAA;QACD,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAA;IACjC,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,QAAQ,GAAgB,YAAY,CAAC,IAAI,CAAC;YAC9C,CAAC,CAAC,IAAI,CAAC,QAAQ;iBACV,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CACrB,8BAAC,aAAa,IACZ,IAAI,EAAE,KAAuC,EAC7C,GAAG,EAAE,KAAK,EACV,WAAW,EAAE,KAAK,EAClB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,GACtB,CACH,CAAC;iBACD,MAAM,CAAC,OAAO,CAAC;YACpB,CAAC,CAAC,EAAE,CAAA;QAEN,MAAM,SAAS,GAGb,OAAO,IAAI,CAAC,IAAI,EAAE,cAAc,KAAK,QAAQ;YAC3C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE;YAC7C,CAAC,CAAC,EAAE,CAAA;QAER,OAAO,CACL,8BAAC,iBAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ;YACvC,8BAAC,SAAS;YACR,oEAAoE;YACpE,0BAA0B;;gBAD1B,oEAAoE;gBACpE,0BAA0B;gBAC1B,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,EAAW,EAC3C,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,WAAW,IAEvB,QAAQ,CACC,CACa,CAC5B,CAAA;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,QAAQ,GAA4B,CAAC,EACzC,iBAAiB,EACjB,UAAU,GACX,EAAE,EAAE;IACH,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,uBAAuB,GAAG;QAC9B,GAAG,YAAY;QACf,GAAG,IAAA,kBAAU,EAAC,yBAAiB,CAAC;QAChC,GAAG,UAAU;KACd,CAAA;IAED,MAAM,IAAI,GAAqB,iBAAiB,CAAC,IAAI,CAAA;IAErD,OAAO,CACL,8DACG,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CACpC,8BAAC,aAAa,IACZ,IAAI,EAAE,IAAsC,EAC5C,WAAW,EAAE,KAAK,EAClB,GAAG,EAAE,KAAK,EACV,UAAU,EAAE,uBAAuB,EACnC,UAAU,EAAE,iBAAiB,CAAC,UAAU,IAAI,EAAE,GAC9C,CACH,CAAC,CACD,CACJ,CAAA;AACH,CAAC,CAAA;AAED,kBAAe,QAAQ,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/RichText/index.tsx"],"names":[],"mappings":"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"}
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
- const ContentLayout_1 = require("../../../ContentLayout");
8
7
  const components_1 = require("../components");
8
+ const ContentLayout_1 = require("../../../ContentLayout");
9
9
  const ClipComponent = ({ content, preset = 'full-player', preload = 'auto', maxClipWidth = 0, }) => {
10
10
  let poster = 'poster' in content ? content.poster : '';
11
11
  let id;
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sourceRoot":"","sources":["../../../../../src/components/content-tree/Clip/template/component.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../../../../../src/components/content-tree/Clip/template/component.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { ContentTree } from '@financial-times/content-tree';
2
+ import React from 'react';
3
+ import { ContentProps } from '../../types';
4
+ interface TimelineEventProps extends ContentProps<Omit<ContentTree.TimelineEvent, 'children'>> {
5
+ }
6
+ declare const TimelineEvent: React.FC<React.PropsWithChildren<TimelineEventProps>>;
7
+ export default TimelineEvent;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ /*
8
+ * @description Event component is used to render a single event.
9
+ */
10
+ const TimelineEvent = ({ content: { title }, children, }) => {
11
+ return (react_1.default.createElement("div", { className: "cp-timeline-event" },
12
+ react_1.default.createElement("h5", { className: "cp-timeline-event__heading o3-type-label" },
13
+ react_1.default.createElement("span", { className: "cp-timeline-event__heading-title" }, title)),
14
+ children));
15
+ };
16
+ exports.default = TimelineEvent;
17
+ //# sourceMappingURL=TimelineEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelineEvent.js","sourceRoot":"","sources":["../../../../src/components/content-tree/Timeline/TimelineEvent.tsx"],"names":[],"mappings":";;;;;AACA,kDAAyB;AAMzB;;GAEG;AACH,MAAM,aAAa,GAA0D,CAAC,EAC5E,OAAO,EAAE,EAAE,KAAK,EAAE,EAClB,QAAQ,GACT,EAAE,EAAE;IACH,OAAO,CACL,uCAAK,SAAS,EAAC,mBAAmB;QAChC,sCAAI,SAAS,EAAC,0CAA0C;YACtD,wCAAM,SAAS,EAAC,kCAAkC,IAAE,KAAK,CAAQ,CAC9D;QACJ,QAAQ,CACL,CACP,CAAA;AACH,CAAC,CAAA;AAED,kBAAe,aAAa,CAAA"}
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ interface TimelineProps {
3
+ children?: React.ReactNode;
4
+ }
5
+ declare const Timeline: React.FC<TimelineProps>;
6
+ export default Timeline;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const ContentLayout_1 = require("../../ContentLayout");
8
+ /*
9
+ * @description Timeline component is used to render a simple timeline of events.
10
+ * @param children - The content to be displayed in the layout.
11
+ */
12
+ const Timeline = ({ children }) => {
13
+ return (react_1.default.createElement(ContentLayout_1.ContentLayout, null,
14
+ react_1.default.createElement("div", { className: "cp-timeline" }, children)));
15
+ };
16
+ exports.default = Timeline;
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/content-tree/Timeline/index.tsx"],"names":[],"mappings":";;;;;AAAA,kDAAyB;AACzB,uDAAmD;AAKnD;;;GAGG;AACH,MAAM,QAAQ,GAA4B,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IACzD,OAAO,CACL,8BAAC,6BAAa;QACZ,uCAAK,SAAS,EAAC,aAAa,IAAE,QAAQ,CAAO,CAC/B,CACjB,CAAA;AACH,CAAC,CAAA;AAED,kBAAe,QAAQ,CAAA"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const react_2 = require("@testing-library/react");
8
+ const TimelineEvent_1 = __importDefault(require("../TimelineEvent"));
9
+ describe('TimelineEvent', () => {
10
+ it('renders with date label and children', () => {
11
+ const { container } = (0, react_2.render)(react_1.default.createElement(TimelineEvent_1.default, { content: {
12
+ type: 'timeline-event',
13
+ title: 'Significant Event',
14
+ } },
15
+ react_1.default.createElement("p", null, "This is the event content")));
16
+ expect(container).toMatchSnapshot();
17
+ });
18
+ it('renders with minimal children content', () => {
19
+ const { container } = (0, react_2.render)(react_1.default.createElement(TimelineEvent_1.default, { content: {
20
+ type: 'timeline-event',
21
+ title: 'Short Event',
22
+ } },
23
+ react_1.default.createElement("p", null, "Brief event description")));
24
+ expect(container).toMatchSnapshot();
25
+ });
26
+ it('renders with long date label', () => {
27
+ const { container } = (0, react_2.render)(react_1.default.createElement(TimelineEvent_1.default, { content: {
28
+ type: 'timeline-event',
29
+ title: 'Wednesday, December 25, 2024 - Christmas Day',
30
+ } },
31
+ react_1.default.createElement("p", null, "Christmas celebration details")));
32
+ expect(container).toMatchSnapshot();
33
+ });
34
+ it('renders with complex nested children', () => {
35
+ const { container } = (0, react_2.render)(react_1.default.createElement(TimelineEvent_1.default, { content: {
36
+ type: 'timeline-event',
37
+ title: 'Q4 2024',
38
+ } },
39
+ react_1.default.createElement("div", null,
40
+ react_1.default.createElement("h3", null, "Quarterly Results"),
41
+ react_1.default.createElement("p", null,
42
+ "The company announced ",
43
+ react_1.default.createElement("strong", null, "strong"),
44
+ " Q4 results."))));
45
+ expect(container).toMatchSnapshot();
46
+ });
47
+ });
48
+ //# sourceMappingURL=TimelineEvent.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelineEvent.spec.js","sourceRoot":"","sources":["../../../../../src/components/content-tree/Timeline/test/TimelineEvent.spec.tsx"],"names":[],"mappings":";;;;;AAAA,kDAAyB;AACzB,kDAA+C;AAC/C,qEAA4C;AAE5C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,cAAM,EAC1B,8BAAC,uBAAa,IACZ,OAAO,EAAE;gBACP,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,mBAAmB;aAC3B;YAED,qEAAgC,CAClB,CACjB,CAAA;QACD,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,EAAE,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,cAAM,EAC1B,8BAAC,uBAAa,IACZ,OAAO,EAAE;gBACP,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,aAAa;aACrB;YAED,mEAA8B,CAChB,CACjB,CAAA;QACD,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,EAAE,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,cAAM,EAC1B,8BAAC,uBAAa,IACZ,OAAO,EAAE;gBACP,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,8CAA8C;aACtD;YAED,yEAAoC,CACtB,CACjB,CAAA;QACD,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,EAAE,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,cAAM,EAC1B,8BAAC,uBAAa,IACZ,OAAO,EAAE;gBACP,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,SAAS;aACjB;YAED;gBACE,8DAA0B;gBAC1B;;oBACwB,uDAAuB;mCAC3C,CACA,CACQ,CACjB,CAAA;QACD,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,EAAE,CAAA;IACrC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const react_2 = require("@testing-library/react");
8
+ const __1 = __importDefault(require("../"));
9
+ describe('Timeline component', () => {
10
+ it('renders with full-width layout and children', () => {
11
+ const { container } = (0, react_2.render)(react_1.default.createElement(__1.default, null,
12
+ react_1.default.createElement("div", null, "Event 1"),
13
+ react_1.default.createElement("div", null, "Event 2")));
14
+ expect(container).toMatchSnapshot();
15
+ });
16
+ });
17
+ //# sourceMappingURL=snapshot.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.spec.js","sourceRoot":"","sources":["../../../../../src/components/content-tree/Timeline/test/snapshot.spec.tsx"],"names":[],"mappings":";;;;;AAAA,kDAAyB;AACzB,kDAA+C;AAC/C,4CAA0B;AAE1B,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,cAAM,EAC1B,8BAAC,WAAQ;YACP,qDAAkB;YAClB,qDAAkB,CACT,CACZ,CAAA;QACD,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,EAAE,CAAA;IACrC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
package/lib/index.d.ts CHANGED
@@ -24,5 +24,7 @@ export { default as Table } from './components/content-tree/Table';
24
24
  export { default as Tweet } from './components/content-tree/Tweet';
25
25
  export { default as Video } from './components/content-tree/Video';
26
26
  export { default as YoutubeVideo } from './components/content-tree/YoutubeVideo';
27
+ export { default as Timeline } from './components/content-tree/Timeline';
28
+ export { default as TimelineEvent } from './components/content-tree/Timeline/TimelineEvent';
27
29
  export { List, ListItem, Link, Blockquote, LineBreak, HorizontalRule, Emphasis, Strong, Strikethrough, Cite, CccFallbackText, } from './components/RichText/BasicComponents';
28
30
  export { PresentationFlagsContext, PresentationOverridesContext, } from './context';
package/lib/index.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.PresentationOverridesContext = exports.PresentationFlagsContext = exports.CccFallbackText = exports.Cite = exports.Strikethrough = exports.Strong = exports.Emphasis = exports.HorizontalRule = exports.LineBreak = exports.Blockquote = exports.Link = exports.ListItem = exports.List = exports.YoutubeVideo = exports.Video = exports.Tweet = exports.Table = exports.ScrollyBlock = exports.RecommendedList = exports.Recommended = exports.Pullquote = exports.Paragraph = exports.LayoutSlot = exports.LayoutContainer = exports.Layout = exports.Clip = exports.ImageSet = exports.Heading = exports.Flourish = exports.CustomCodeComponent = exports.BigNumber = exports.RichText = exports.PodcastBody = exports.LiveBlogBody = exports.ArticleBody = exports.Body = exports.Topper = exports.MainImage = exports.LiveBlogWrapper = exports.Byline = exports.ArticleInfo = void 0;
6
+ exports.PresentationOverridesContext = exports.PresentationFlagsContext = exports.CccFallbackText = exports.Cite = exports.Strikethrough = exports.Strong = exports.Emphasis = exports.HorizontalRule = exports.LineBreak = exports.Blockquote = exports.Link = exports.ListItem = exports.List = exports.TimelineEvent = exports.Timeline = exports.YoutubeVideo = exports.Video = exports.Tweet = exports.Table = exports.ScrollyBlock = exports.RecommendedList = exports.Recommended = exports.Pullquote = exports.Paragraph = exports.LayoutSlot = exports.LayoutContainer = exports.Layout = exports.Clip = exports.ImageSet = exports.Heading = exports.Flourish = exports.CustomCodeComponent = exports.BigNumber = exports.RichText = exports.PodcastBody = exports.LiveBlogBody = exports.ArticleBody = exports.Body = exports.Topper = exports.MainImage = exports.LiveBlogWrapper = exports.Byline = exports.ArticleInfo = void 0;
7
7
  var ArticleInfo_1 = require("./components/ArticleInfo");
8
8
  Object.defineProperty(exports, "ArticleInfo", { enumerable: true, get: function () { return __importDefault(ArticleInfo_1).default; } });
9
9
  var Byline_1 = require("./components/Byline");
@@ -58,6 +58,10 @@ var Video_1 = require("./components/content-tree/Video");
58
58
  Object.defineProperty(exports, "Video", { enumerable: true, get: function () { return __importDefault(Video_1).default; } });
59
59
  var YoutubeVideo_1 = require("./components/content-tree/YoutubeVideo");
60
60
  Object.defineProperty(exports, "YoutubeVideo", { enumerable: true, get: function () { return __importDefault(YoutubeVideo_1).default; } });
61
+ var Timeline_1 = require("./components/content-tree/Timeline");
62
+ Object.defineProperty(exports, "Timeline", { enumerable: true, get: function () { return __importDefault(Timeline_1).default; } });
63
+ var TimelineEvent_1 = require("./components/content-tree/Timeline/TimelineEvent");
64
+ Object.defineProperty(exports, "TimelineEvent", { enumerable: true, get: function () { return __importDefault(TimelineEvent_1).default; } });
61
65
  var BasicComponents_1 = require("./components/RichText/BasicComponents");
62
66
  Object.defineProperty(exports, "List", { enumerable: true, get: function () { return BasicComponents_1.List; } });
63
67
  Object.defineProperty(exports, "ListItem", { enumerable: true, get: function () { return BasicComponents_1.ListItem; } });
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAiE;AAAxD,2HAAA,OAAO,OAAe;AAC/B,8CAAuD;AAA9C,iHAAA,OAAO,OAAU;AAC1B,gEAA8D;AAArD,kHAAA,eAAe,OAAA;AACxB,oDAA6D;AAApD,uHAAA,OAAO,OAAa;AAC7B,8CAAuD;AAA9C,iHAAA,OAAO,OAAU;AAE1B,0CAAmD;AAA1C,6GAAA,OAAO,OAAQ;AACxB,wEAAiF;AAAxE,2HAAA,OAAO,OAAe;AAC/B,0EAAmF;AAA1E,6HAAA,OAAO,OAAgB;AAChC,wEAAiF;AAAxE,2HAAA,OAAO,OAAe;AAE/B,kDAA2D;AAAlD,qHAAA,OAAO,OAAY;AAC5B,iEAA0E;AAAjE,uHAAA,OAAO,OAAa;AAC7B,qFAA8F;AAArF,2IAAA,OAAO,OAAuB;AACvC,+DAAwE;AAA/D,qHAAA,OAAO,OAAY;AAC5B,6DAAsE;AAA7D,mHAAA,OAAO,OAAW;AAC3B,+DAAwE;AAA/D,qHAAA,OAAO,OAAY;AAC5B,+EAAmF;AAA1E,kHAAA,OAAO,OAAQ;AACxB,2DAIyC;AAHvC,gGAAA,MAAM,OAAA;AACN,yGAAA,eAAe,OAAA;AACf,oGAAA,UAAU,OAAA;AAEZ,iEAA0E;AAAjE,uHAAA,OAAO,OAAa;AAC7B,mEAAgF;AAAvE,mHAAA,OAAO,OAAa;AAC7B,qEAA8E;AAArE,2HAAA,OAAO,OAAe;AAC/B,6EAAsF;AAA7E,mIAAA,OAAO,OAAmB;AACnC,2EAAuE;AAA9D,8GAAA,YAAY,OAAA;AACrB,yDAAkE;AAAzD,+GAAA,OAAO,OAAS;AACzB,yDAAkE;AAAzD,+GAAA,OAAO,OAAS;AACzB,yDAAkE;AAAzD,+GAAA,OAAO,OAAS;AACzB,uEAAgF;AAAvE,6HAAA,OAAO,OAAgB;AAChC,yEAY8C;AAX5C,uGAAA,IAAI,OAAA;AACJ,2GAAA,QAAQ,OAAA;AACR,uGAAA,IAAI,OAAA;AACJ,6GAAA,UAAU,OAAA;AACV,4GAAA,SAAS,OAAA;AACT,iHAAA,cAAc,OAAA;AACd,2GAAA,QAAQ,OAAA;AACR,yGAAA,MAAM,OAAA;AACN,gHAAA,aAAa,OAAA;AACb,uGAAA,IAAI,OAAA;AACJ,kHAAA,eAAe,OAAA;AAGjB,qCAGkB;AAFhB,mHAAA,wBAAwB,OAAA;AACxB,uHAAA,4BAA4B,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAiE;AAAxD,2HAAA,OAAO,OAAe;AAC/B,8CAAuD;AAA9C,iHAAA,OAAO,OAAU;AAC1B,gEAA8D;AAArD,kHAAA,eAAe,OAAA;AACxB,oDAA6D;AAApD,uHAAA,OAAO,OAAa;AAC7B,8CAAuD;AAA9C,iHAAA,OAAO,OAAU;AAE1B,0CAAmD;AAA1C,6GAAA,OAAO,OAAQ;AACxB,wEAAiF;AAAxE,2HAAA,OAAO,OAAe;AAC/B,0EAAmF;AAA1E,6HAAA,OAAO,OAAgB;AAChC,wEAAiF;AAAxE,2HAAA,OAAO,OAAe;AAE/B,kDAA2D;AAAlD,qHAAA,OAAO,OAAY;AAC5B,iEAA0E;AAAjE,uHAAA,OAAO,OAAa;AAC7B,qFAA8F;AAArF,2IAAA,OAAO,OAAuB;AACvC,+DAAwE;AAA/D,qHAAA,OAAO,OAAY;AAC5B,6DAAsE;AAA7D,mHAAA,OAAO,OAAW;AAC3B,+DAAwE;AAA/D,qHAAA,OAAO,OAAY;AAC5B,+EAAmF;AAA1E,kHAAA,OAAO,OAAQ;AACxB,2DAIyC;AAHvC,gGAAA,MAAM,OAAA;AACN,yGAAA,eAAe,OAAA;AACf,oGAAA,UAAU,OAAA;AAEZ,iEAA0E;AAAjE,uHAAA,OAAO,OAAa;AAC7B,mEAAgF;AAAvE,mHAAA,OAAO,OAAa;AAC7B,qEAA8E;AAArE,2HAAA,OAAO,OAAe;AAC/B,6EAAsF;AAA7E,mIAAA,OAAO,OAAmB;AACnC,2EAAuE;AAA9D,8GAAA,YAAY,OAAA;AACrB,yDAAkE;AAAzD,+GAAA,OAAO,OAAS;AACzB,yDAAkE;AAAzD,+GAAA,OAAO,OAAS;AACzB,yDAAkE;AAAzD,+GAAA,OAAO,OAAS;AACzB,uEAAgF;AAAvE,6HAAA,OAAO,OAAgB;AAChC,+DAAwE;AAA/D,qHAAA,OAAO,OAAY;AAC5B,kFAA2F;AAAlF,+HAAA,OAAO,OAAiB;AACjC,yEAY8C;AAX5C,uGAAA,IAAI,OAAA;AACJ,2GAAA,QAAQ,OAAA;AACR,uGAAA,IAAI,OAAA;AACJ,6GAAA,UAAU,OAAA;AACV,4GAAA,SAAS,OAAA;AACT,iHAAA,cAAc,OAAA;AACd,2GAAA,QAAQ,OAAA;AACR,yGAAA,MAAM,OAAA;AACN,gHAAA,aAAa,OAAA;AACb,uGAAA,IAAI,OAAA;AACJ,kHAAA,eAAe,OAAA;AAGjB,qCAGkB;AAFhB,mHAAA,wBAAwB,OAAA;AACxB,uHAAA,4BAA4B,OAAA"}
package/lib/main.scss CHANGED
@@ -4,3 +4,4 @@
4
4
  @import '../src/components/Topper/client/main.scss';
5
5
  @import '../src/components/content-tree/Clip/client/main.scss';
6
6
  @import '../src/components/content-tree/Flourish/client/main.scss';
7
+ @import '../src/components/content-tree/Timeline/client/main.scss';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@financial-times/cp-content-pipeline-ui",
3
- "version": "9.13.0",
3
+ "version": "9.14.0",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -16,10 +16,10 @@
16
16
  "@babel/preset-env": "^7.22.5",
17
17
  "@babel/preset-react": "^7.22.5",
18
18
  "@dotcom-tool-kit/npm": "^5.0.0",
19
- "@financial-times/content-tree": "github:financial-times/content-tree#3f77ec4",
20
- "@financial-times/cp-content-pipeline-client": "^4.20.2",
21
- "@financial-times/cp-content-pipeline-schema": "^3.21.0",
22
- "@financial-times/cp-content-pipeline-styles": "^4.5.0",
19
+ "@financial-times/content-tree": "github:financial-times/content-tree#aa5cf1",
20
+ "@financial-times/cp-content-pipeline-client": "^4.21.0",
21
+ "@financial-times/cp-content-pipeline-schema": "^3.22.0",
22
+ "@financial-times/cp-content-pipeline-styles": "^4.6.0",
23
23
  "@financial-times/n-scrollytelling-image": "^1.1.0",
24
24
  "@financial-times/o-grid": "^6.1.8",
25
25
  "@financial-times/o-share": "^11.0.0",
@@ -19,9 +19,10 @@ import classnames from 'classnames'
19
19
  type LayoutWidth = 'in-line' | 'mid-grid' | 'full-grid'
20
20
 
21
21
  interface ContentLayoutProps {
22
- dataLayout: LayoutWidth
22
+ dataLayout?: LayoutWidth
23
23
  dataComponent?: string
24
24
  className?: string
25
+ children: React.ReactNode
25
26
  }
26
27
 
27
28
  /*
@@ -44,12 +45,7 @@ const OverflowingLayout: React.FC<{ children: React.ReactNode }> = ({
44
45
  */
45
46
  export const ContentLayout: React.FC<
46
47
  React.PropsWithChildren<ContentLayoutProps>
47
- > = ({
48
- dataLayout = 'in-line',
49
- children,
50
- dataComponent = '',
51
- className = '',
52
- }) => {
48
+ > = ({ dataLayout = 'in-line', children, dataComponent, className = '' }) => {
53
49
  const ContainerClassNames = classnames(
54
50
  'n-content-layout__container',
55
51
  className
@@ -0,0 +1,80 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`ContentLayout renders treating no dataLayout as default inline) 1`] = `
4
+ <div>
5
+ <div
6
+ class="n-content-layout__container--in-line"
7
+ >
8
+ <div>
9
+ Empty layout content
10
+ </div>
11
+ </div>
12
+ </div>
13
+ `;
14
+
15
+ exports[`ContentLayout renders with any accepted layout 1`] = `
16
+ <div>
17
+ <div
18
+ class="n-content-layout"
19
+ data-layout-width="full-grid"
20
+ >
21
+ <div
22
+ class="n-content-layout__container"
23
+ >
24
+ <div
25
+ class="n-content-layout__container--mid-grid"
26
+ data-o-grid-colspan="12 S12 M12 L10 XL10"
27
+ >
28
+ <span>
29
+ Inline content
30
+ </span>
31
+ </div>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ `;
36
+
37
+ exports[`ContentLayout renders with full-grid layout 1`] = `
38
+ <div>
39
+ <div
40
+ class="n-content-layout"
41
+ data-layout-width="full-grid"
42
+ >
43
+ <div
44
+ class="n-content-layout__container"
45
+ >
46
+ <div>
47
+ Test content
48
+ </div>
49
+ </div>
50
+ </div>
51
+ </div>
52
+ `;
53
+
54
+ exports[`ContentLayout renders with multiple children 1`] = `
55
+ <div>
56
+ <div
57
+ class="n-content-layout"
58
+ data-layout-width="full-grid"
59
+ >
60
+ <div
61
+ class="n-content-layout__container"
62
+ >
63
+ <div
64
+ class="n-content-layout__container--mid-grid"
65
+ data-o-grid-colspan="12 S12 M12 L10 XL10"
66
+ >
67
+ <h1>
68
+ Title
69
+ </h1>
70
+ <p>
71
+ Paragraph content
72
+ </p>
73
+ <div>
74
+ Additional content
75
+ </div>
76
+ </div>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ `;
@@ -0,0 +1,47 @@
1
+ import React from 'react'
2
+ import { render } from '@testing-library/react'
3
+ import { ContentLayout } from '../index'
4
+
5
+ describe('ContentLayout', () => {
6
+ it('renders with full-grid layout', () => {
7
+ const { container } = render(
8
+ <ContentLayout dataLayout="full-grid">
9
+ <div>Test content</div>
10
+ </ContentLayout>
11
+ )
12
+
13
+ expect(container).toMatchSnapshot()
14
+ })
15
+
16
+ it('renders with any accepted layout', () => {
17
+ const { container } = render(
18
+ <ContentLayout dataLayout="mid-grid">
19
+ <span>Inline content</span>
20
+ </ContentLayout>
21
+ )
22
+
23
+ expect(container).toMatchSnapshot()
24
+ })
25
+
26
+ it('renders with multiple children', () => {
27
+ const { container } = render(
28
+ <ContentLayout dataLayout="mid-grid">
29
+ <h1>Title</h1>
30
+ <p>Paragraph content</p>
31
+ <div>Additional content</div>
32
+ </ContentLayout>
33
+ )
34
+
35
+ expect(container).toMatchSnapshot()
36
+ })
37
+
38
+ it('renders treating no dataLayout as default inline)', () => {
39
+ const { container } = render(
40
+ <ContentLayout>
41
+ <div>Empty layout content</div>
42
+ </ContentLayout>
43
+ )
44
+
45
+ expect(container).toMatchSnapshot()
46
+ })
47
+ })
@@ -30,6 +30,8 @@ import {
30
30
  import { ScrollyImage } from '../content-tree/Scrollytelling/ScrollyImage'
31
31
  import YoutubeVideo from '../content-tree/YoutubeVideo'
32
32
  import CustomCodeComponent from '../content-tree/CustomCodeComponent'
33
+ import Timeline from '../content-tree/Timeline'
34
+ import TimelineEvent from '../content-tree/Timeline/TimelineEvent'
33
35
 
34
36
  import {
35
37
  List,
@@ -144,6 +146,8 @@ const componentMap: RichTextComponentMapRecord = {
144
146
  tweet: Tweet,
145
147
  video: Video,
146
148
  'youtube-video': YoutubeVideo,
149
+ timeline: Timeline,
150
+ 'timeline-event': TimelineEvent,
147
151
  }
148
152
 
149
153
  function isParentNode(
@@ -1,7 +1,7 @@
1
1
  import React from 'react'
2
- import { ContentLayout } from '../../../ContentLayout'
3
2
  import { ClipTag } from '../components'
4
3
  import { ContentProps } from '../../../types'
4
+ import { ContentLayout } from '../../../ContentLayout'
5
5
  import type * as ComponentWorkarounds from '../../Workarounds'
6
6
 
7
7
  type Preset = 'full-player' | 'thumbnail'
@@ -0,0 +1,25 @@
1
+ import { ContentTree } from '@financial-times/content-tree'
2
+ import React from 'react'
3
+ import { ContentProps } from '../../types'
4
+
5
+ interface TimelineEventProps
6
+ extends ContentProps<Omit<ContentTree.TimelineEvent, 'children'>> {}
7
+
8
+ /*
9
+ * @description Event component is used to render a single event.
10
+ */
11
+ const TimelineEvent: React.FC<React.PropsWithChildren<TimelineEventProps>> = ({
12
+ content: { title },
13
+ children,
14
+ }) => {
15
+ return (
16
+ <div className="cp-timeline-event">
17
+ <h5 className="cp-timeline-event__heading o3-type-label">
18
+ <span className="cp-timeline-event__heading-title">{title}</span>
19
+ </h5>
20
+ {children}
21
+ </div>
22
+ )
23
+ }
24
+
25
+ export default TimelineEvent