@times-components/ts-components 1.98.2-alpha.9 → 1.98.2
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/CHANGELOG.md +11 -0
- package/dist/components/opta/football/fixtures-ticker/OptaFootballFixturesTicker.d.ts +1 -0
- package/dist/components/opta/football/fixtures-ticker/OptaFootballFixturesTicker.js +3 -3
- package/dist/components/opta/football/fixtures-ticker/OptaFootballFixturesTicker.stories.js +3 -3
- package/dist/components/opta/football/fixtures-ticker/styles.d.ts +1 -0
- package/dist/components/opta/football/fixtures-ticker/styles.js +14 -8
- package/dist/index.d.ts +0 -1
- package/dist/index.js +3 -4
- package/package.json +16 -17
- package/rnw.js +1 -1
- package/src/components/opta/football/fixtures-ticker/OptaFootballFixturesTicker.stories.tsx +2 -1
- package/src/components/opta/football/fixtures-ticker/OptaFootballFixturesTicker.tsx +3 -1
- package/src/components/opta/football/fixtures-ticker/__tests__/__snapshots__/OptaFootballFixturesTicker.test.tsx.snap +8 -8
- package/src/components/opta/football/fixtures-ticker/styles.ts +16 -7
- package/src/index.ts +2 -3
- package/tsconfig.json +0 -1
- package/dist/assets/BreadcrumbIcon.d.ts +0 -2
- package/dist/assets/BreadcrumbIcon.js +0 -5
- package/dist/assets/index.d.ts +0 -1
- package/dist/assets/index.js +0 -2
- package/dist/components/breadcrumb/__tests__/index.test.d.ts +0 -1
- package/dist/components/breadcrumb/__tests__/index.test.js +0 -40
- package/dist/components/breadcrumb/fixtures/breadcrumbs.json +0 -27
- package/dist/components/breadcrumb/index.d.ts +0 -9
- package/dist/components/breadcrumb/index.js +0 -28
- package/dist/components/breadcrumb/styles.d.ts +0 -13
- package/dist/components/breadcrumb/styles.js +0 -39
- package/src/assets/BreadcrumbIcon.tsx +0 -16
- package/src/assets/icons.stories.mdx +0 -1
- package/src/assets/index.tsx +0 -1
- package/src/components/breadcrumb/__tests__/__snapshots__/index.test.tsx.snap +0 -64
- package/src/components/breadcrumb/__tests__/index.test.tsx +0 -51
- package/src/components/breadcrumb/breadcrumb.stories.mdx +0 -47
- package/src/components/breadcrumb/fixtures/breadcrumbs.json +0 -27
- package/src/components/breadcrumb/index.tsx +0 -84
- package/src/components/breadcrumb/styles.ts +0 -43
|
@@ -38,7 +38,7 @@ storiesOf('Typescript Component/In Article/Football/Fixtures', module)
|
|
|
38
38
|
|
|
39
39
|
storiesOf('Typescript Component/In Article/Football/Fixtures', module)
|
|
40
40
|
.addDecorator(withKnobs)
|
|
41
|
-
.add('Fixtures Ticker
|
|
41
|
+
.add('Fixtures Ticker buttons and link', () => {
|
|
42
42
|
const selComp = select('Competition', competitons, '8');
|
|
43
43
|
return (
|
|
44
44
|
<OptaFootballFixturesTicker
|
|
@@ -50,6 +50,7 @@ storiesOf('Typescript Component/In Article/Football/Fixtures', module)
|
|
|
50
50
|
days_before={number('days before (of current day)', 100)}
|
|
51
51
|
round={text('round(s)', '')}
|
|
52
52
|
fixturesPageUrl="https://www.thetimes.co.uk/sport/football/euro-2024"
|
|
53
|
+
showButtons
|
|
53
54
|
/>
|
|
54
55
|
);
|
|
55
56
|
});
|
|
@@ -25,6 +25,7 @@ export const OptaFootballFixturesTicker: React.FC<{
|
|
|
25
25
|
days_before?: number;
|
|
26
26
|
round?: string;
|
|
27
27
|
isApp?: boolean;
|
|
28
|
+
showButtons?: boolean;
|
|
28
29
|
fixturesPageUrl?: string;
|
|
29
30
|
}> = React.memo(
|
|
30
31
|
({
|
|
@@ -36,6 +37,7 @@ export const OptaFootballFixturesTicker: React.FC<{
|
|
|
36
37
|
days_before,
|
|
37
38
|
round,
|
|
38
39
|
isApp,
|
|
40
|
+
showButtons,
|
|
39
41
|
fixturesPageUrl
|
|
40
42
|
}) => {
|
|
41
43
|
const ref = React.createRef<HTMLDivElement>();
|
|
@@ -93,7 +95,7 @@ export const OptaFootballFixturesTicker: React.FC<{
|
|
|
93
95
|
|
|
94
96
|
return (
|
|
95
97
|
<>
|
|
96
|
-
<WidgetContainer isApp={isApp} ref={ref} />
|
|
98
|
+
<WidgetContainer isApp={isApp} showButtons={showButtons} ref={ref} />
|
|
97
99
|
|
|
98
100
|
{!isReady && (
|
|
99
101
|
<PlaceholderContainer height={80}>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
exports[`OptaFootballFixturesTicker with flags should render correctly 1`] = `
|
|
4
4
|
<DocumentFragment>
|
|
5
5
|
<div
|
|
6
|
-
class="sc-htpNat sc-ifAKCX
|
|
6
|
+
class="sc-htpNat sc-ifAKCX brWdln"
|
|
7
7
|
/>
|
|
8
8
|
<div
|
|
9
9
|
class="sc-bwzfXH uxFfR"
|
|
@@ -17,7 +17,7 @@ exports[`OptaFootballFixturesTicker with flags should render correctly 1`] = `
|
|
|
17
17
|
exports[`OptaFootballFixturesTicker with flags should render correctly 2`] = `
|
|
18
18
|
<DocumentFragment>
|
|
19
19
|
<div
|
|
20
|
-
class="sc-htpNat sc-ifAKCX
|
|
20
|
+
class="sc-htpNat sc-ifAKCX brWdln"
|
|
21
21
|
>
|
|
22
22
|
<div>
|
|
23
23
|
Widget
|
|
@@ -29,7 +29,7 @@ exports[`OptaFootballFixturesTicker with flags should render correctly 2`] = `
|
|
|
29
29
|
exports[`OptaFootballFixturesTicker without flags should render correctly 1`] = `
|
|
30
30
|
<DocumentFragment>
|
|
31
31
|
<div
|
|
32
|
-
class="sc-htpNat sc-ifAKCX
|
|
32
|
+
class="sc-htpNat sc-ifAKCX brWdln"
|
|
33
33
|
/>
|
|
34
34
|
<div
|
|
35
35
|
class="sc-bwzfXH uxFfR"
|
|
@@ -43,7 +43,7 @@ exports[`OptaFootballFixturesTicker without flags should render correctly 1`] =
|
|
|
43
43
|
exports[`OptaFootballFixturesTicker without flags should render correctly 2`] = `
|
|
44
44
|
<DocumentFragment>
|
|
45
45
|
<div
|
|
46
|
-
class="sc-htpNat sc-ifAKCX
|
|
46
|
+
class="sc-htpNat sc-ifAKCX brWdln"
|
|
47
47
|
>
|
|
48
48
|
<div>
|
|
49
49
|
Widget
|
|
@@ -55,7 +55,7 @@ exports[`OptaFootballFixturesTicker without flags should render correctly 2`] =
|
|
|
55
55
|
exports[`OptaFootballFixturesTicker without flags should render correctly with fixturesPageUrl 1`] = `
|
|
56
56
|
<DocumentFragment>
|
|
57
57
|
<div
|
|
58
|
-
class="sc-htpNat sc-ifAKCX
|
|
58
|
+
class="sc-htpNat sc-ifAKCX brWdln"
|
|
59
59
|
/>
|
|
60
60
|
<div
|
|
61
61
|
class="sc-bwzfXH uxFfR"
|
|
@@ -69,7 +69,7 @@ exports[`OptaFootballFixturesTicker without flags should render correctly with f
|
|
|
69
69
|
exports[`OptaFootballFixturesTicker without flags should render correctly with fixturesPageUrl 2`] = `
|
|
70
70
|
<DocumentFragment>
|
|
71
71
|
<div
|
|
72
|
-
class="sc-htpNat sc-ifAKCX
|
|
72
|
+
class="sc-htpNat sc-ifAKCX brWdln"
|
|
73
73
|
>
|
|
74
74
|
<div>
|
|
75
75
|
Widget
|
|
@@ -81,7 +81,7 @@ exports[`OptaFootballFixturesTicker without flags should render correctly with f
|
|
|
81
81
|
exports[`OptaFootballFixturesTicker without flags should render correctly with isApp property 1`] = `
|
|
82
82
|
<DocumentFragment>
|
|
83
83
|
<div
|
|
84
|
-
class="sc-htpNat sc-ifAKCX
|
|
84
|
+
class="sc-htpNat sc-ifAKCX eAWYad"
|
|
85
85
|
/>
|
|
86
86
|
<div
|
|
87
87
|
class="sc-bwzfXH uxFfR"
|
|
@@ -95,7 +95,7 @@ exports[`OptaFootballFixturesTicker without flags should render correctly with i
|
|
|
95
95
|
exports[`OptaFootballFixturesTicker without flags should render correctly with isApp property 2`] = `
|
|
96
96
|
<DocumentFragment>
|
|
97
97
|
<div
|
|
98
|
-
class="sc-htpNat sc-ifAKCX
|
|
98
|
+
class="sc-htpNat sc-ifAKCX eAWYad"
|
|
99
99
|
>
|
|
100
100
|
<div>
|
|
101
101
|
Widget
|
|
@@ -41,6 +41,7 @@ export const WidgetContainerOverride = styled(WidgetContainerBase)`
|
|
|
41
41
|
|
|
42
42
|
export const WidgetContainer = styled(WidgetContainerBase)<{
|
|
43
43
|
isApp?: boolean;
|
|
44
|
+
showButtons?: boolean;
|
|
44
45
|
}>`
|
|
45
46
|
.Opta {
|
|
46
47
|
font-family: Roboto !important;
|
|
@@ -52,18 +53,26 @@ export const WidgetContainer = styled(WidgetContainerBase)<{
|
|
|
52
53
|
height: 80px !important;
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
${({ showButtons }) =>
|
|
57
|
+
!showButtons &&
|
|
58
|
+
`
|
|
59
|
+
@media (max-width: ${breakpoints.small}px) {
|
|
60
|
+
.Opta-Scroller {
|
|
61
|
+
display: none !important;
|
|
62
|
+
}
|
|
58
63
|
}
|
|
59
|
-
}
|
|
64
|
+
`}
|
|
60
65
|
|
|
61
66
|
@media (max-width: ${breakpoints.small}px) {
|
|
62
67
|
.Opta-Window {
|
|
63
|
-
left: 0 !important;
|
|
68
|
+
left: ${({ showButtons }) => (showButtons ? '30px' : '0')} !important;
|
|
64
69
|
right: 0 !important;
|
|
65
|
-
|
|
66
|
-
|
|
70
|
+
${({ showButtons }) =>
|
|
71
|
+
showButtons
|
|
72
|
+
? 'width: calc(100% - 60px) !important;'
|
|
73
|
+
: `
|
|
74
|
+
overflow-x: auto !important;
|
|
75
|
+
position: relative !important;`}
|
|
67
76
|
}
|
|
68
77
|
}
|
|
69
78
|
|
package/src/index.ts
CHANGED
|
@@ -21,9 +21,8 @@ export {
|
|
|
21
21
|
} from './components/article-flag/ArticleFlag';
|
|
22
22
|
export { Timelines } from './components/in-article-timelines/Timelines';
|
|
23
23
|
export { SaveStar } from './components/save-star/SaveStar';
|
|
24
|
-
export { Breadcrumb } from './components/breadcrumb';
|
|
25
24
|
|
|
26
|
-
// Newsletter Components
|
|
25
|
+
// Newsletter Components
|
|
27
26
|
export {
|
|
28
27
|
AutoNewsletterPuff
|
|
29
28
|
} from './components/newsletter-puff/AutoNewsletterPuff';
|
|
@@ -34,7 +33,7 @@ export {
|
|
|
34
33
|
PreviewNewsletterPuff
|
|
35
34
|
} from './components/newsletter-puff/preview-newsletter-puff/PreviewNewsletterPuff';
|
|
36
35
|
|
|
37
|
-
// Sport Components
|
|
36
|
+
// Sport Components
|
|
38
37
|
export {
|
|
39
38
|
OptaCricketScorecard
|
|
40
39
|
} from './components/opta/cricket/scorecard/OptaCricketScorecard';
|
package/tsconfig.json
CHANGED
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
"declaration": true,
|
|
10
10
|
"inlineSourceMap": true,
|
|
11
11
|
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
|
|
12
|
-
"resolveJsonModule": true /* Import JSON files */ ,
|
|
13
12
|
|
|
14
13
|
"strict": true /* Enable all strict type-checking options. */,
|
|
15
14
|
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
const BreadcrumbIcon = (props) => (React.createElement("svg", Object.assign({ xmlns: "http://www.w3.org/2000/svg", width: 16, height: 16, fill: "none" }, props),
|
|
3
|
-
React.createElement("path", { fill: props.color, d: "m6.667 4-.94.94L8.78 8l-3.053 3.06.94.94 4-4-4-4Z" })));
|
|
4
|
-
export default BreadcrumbIcon;
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnJlYWRjcnVtYkljb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXRzL0JyZWFkY3J1bWJJY29uLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsQ0FDckMsMkNBQ0UsS0FBSyxFQUFDLDRCQUE0QixFQUNsQyxLQUFLLEVBQUUsRUFBRSxFQUNULE1BQU0sRUFBRSxFQUFFLEVBQ1YsSUFBSSxFQUFDLE1BQU0sSUFDUCxLQUFLO0lBRVQsOEJBQ0UsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQ2pCLENBQUMsRUFBQyxtREFBbUQsR0FDckQsQ0FDRSxDQUNQLENBQUM7QUFDRixlQUFlLGNBQWMsQ0FBQyJ9
|
package/dist/assets/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { default as BreadcrumbIcon } from './BreadcrumbIcon';
|
package/dist/assets/index.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export { default as BreadcrumbIcon } from './BreadcrumbIcon';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXRzL2luZGV4LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxJQUFJLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDIn0=
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import '@testing-library/jest-dom';
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import '@testing-library/jest-dom';
|
|
3
|
-
import { render, fireEvent } from '@testing-library/react';
|
|
4
|
-
import { Breadcrumb } from '../index';
|
|
5
|
-
import { breadcrumbItems } from '../fixtures/breadcrumbs.json';
|
|
6
|
-
import { TrackingContextProvider } from '../../../helpers/tracking/TrackingContextProvider';
|
|
7
|
-
describe('Render Breadcrumbs', () => {
|
|
8
|
-
const renderBreadcrumb = (analyticsStream) => render(React.createElement(TrackingContextProvider, { context: {
|
|
9
|
-
component: 'breadcrumb',
|
|
10
|
-
attrs: {}
|
|
11
|
-
}, analyticsStream: analyticsStream },
|
|
12
|
-
React.createElement(Breadcrumb, { data: breadcrumbItems })));
|
|
13
|
-
it('should render a snapshot', () => {
|
|
14
|
-
const { asFragment } = renderBreadcrumb();
|
|
15
|
-
expect(asFragment()).toMatchSnapshot();
|
|
16
|
-
});
|
|
17
|
-
it('should render the component', () => {
|
|
18
|
-
const { getByText } = renderBreadcrumb();
|
|
19
|
-
const getBreadcrumb = getByText('Tennis');
|
|
20
|
-
expect(getBreadcrumb).toBeInTheDocument();
|
|
21
|
-
});
|
|
22
|
-
it('items should have link with href', () => {
|
|
23
|
-
const { getAllByRole } = renderBreadcrumb();
|
|
24
|
-
const title = getAllByRole('link')[0];
|
|
25
|
-
expect(title).toHaveAttribute('href', '/sport');
|
|
26
|
-
});
|
|
27
|
-
it('last breadcrumb should be selected', () => {
|
|
28
|
-
const { getAllByRole } = renderBreadcrumb();
|
|
29
|
-
const title = getAllByRole('link')[2];
|
|
30
|
-
expect(title).toHaveAttribute('aria-current', 'page');
|
|
31
|
-
});
|
|
32
|
-
it('calls analyticsStream when you click', () => {
|
|
33
|
-
const analyticsStream = jest.fn();
|
|
34
|
-
const { getByText } = renderBreadcrumb(analyticsStream);
|
|
35
|
-
const breadcrumb = getByText('Tennis');
|
|
36
|
-
fireEvent.click(breadcrumb);
|
|
37
|
-
expect(analyticsStream).toHaveBeenCalledTimes(1);
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2JyZWFkY3J1bWIvX190ZXN0c19fL2luZGV4LnRlc3QudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFFNUYsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtJQUNsQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsZUFBc0MsRUFBRSxFQUFFLENBQ2xFLE1BQU0sQ0FDSixvQkFBQyx1QkFBdUIsSUFDdEIsT0FBTyxFQUFFO1lBQ1AsU0FBUyxFQUFFLFlBQVk7WUFDdkIsS0FBSyxFQUFFLEVBQUU7U0FDVixFQUNELGVBQWUsRUFBRSxlQUFlO1FBRWhDLG9CQUFDLFVBQVUsSUFBQyxJQUFJLEVBQUUsZUFBZSxHQUFJLENBQ2IsQ0FDM0IsQ0FBQztJQUNKLEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7UUFDbEMsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDMUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO1FBQ3JDLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM1QyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7UUFDMUMsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsRUFBRTtRQUM1QyxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUM1QyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUUsR0FBRyxFQUFFO1FBQzlDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNsQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDeEQsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUIsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMifQ==
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"breadcrumbItems": [
|
|
3
|
-
{
|
|
4
|
-
"title": "Sport",
|
|
5
|
-
"url": "/sport"
|
|
6
|
-
},
|
|
7
|
-
{
|
|
8
|
-
"title": "Tennis",
|
|
9
|
-
"url": "/sport/tennis"
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"title": "Australian Open",
|
|
13
|
-
"url": "/australian open"
|
|
14
|
-
}
|
|
15
|
-
],
|
|
16
|
-
"breadcrumbItemsForTrackingDemo": [
|
|
17
|
-
{
|
|
18
|
-
"title": "Sport"
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"title": "Tennis"
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
"title": "Australian Open"
|
|
25
|
-
}
|
|
26
|
-
]
|
|
27
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Breadcrumbs, BreadcrumbItem, IconContainer, styleMap } from './styles';
|
|
3
|
-
import { BreadcrumbIcon } from '../../assets';
|
|
4
|
-
import { TrackingContextProvider } from '../../helpers/tracking/TrackingContextProvider';
|
|
5
|
-
export const Breadcrumb = ({ data }) => {
|
|
6
|
-
const clickEvent = (title) => ({
|
|
7
|
-
object: 'Breadcrumb',
|
|
8
|
-
action: 'Clicked',
|
|
9
|
-
attrs: {
|
|
10
|
-
event_navigation_action: 'navigation',
|
|
11
|
-
event_navigation_name: 'header:selection',
|
|
12
|
-
event_navigation_browsing_method: 'click',
|
|
13
|
-
article_parent_name: `breadcrumb : ${title}`
|
|
14
|
-
}
|
|
15
|
-
});
|
|
16
|
-
const handleClick = (fireAnalyticsEvent, title) => {
|
|
17
|
-
fireAnalyticsEvent && fireAnalyticsEvent(clickEvent(title));
|
|
18
|
-
};
|
|
19
|
-
const getBreadcrumbSeparator = (index, arr) => index < arr.length - 1;
|
|
20
|
-
return (React.createElement(TrackingContextProvider, null, ({ fireAnalyticsEvent }) => (React.createElement(Breadcrumbs, { "aria-label": "breadcrumbs" }, data.map((breadcrumbItem, breadcrumbIndex, breadcrumbArr) => {
|
|
21
|
-
const showSeparator = getBreadcrumbSeparator(breadcrumbIndex, breadcrumbArr);
|
|
22
|
-
return showSeparator ? (React.createElement(React.Fragment, null,
|
|
23
|
-
React.createElement(BreadcrumbItem, { key: breadcrumbItem.title, "aria-current": "false", href: breadcrumbItem.url, selected: false, onClick: () => handleClick(fireAnalyticsEvent, breadcrumbItem.title) }, breadcrumbItem.title),
|
|
24
|
-
React.createElement(IconContainer, null,
|
|
25
|
-
React.createElement(BreadcrumbIcon, { color: styleMap.colors.inkNonEssential })))) : (React.createElement(BreadcrumbItem, { "aria-current": "page", key: breadcrumbItem.title, href: breadcrumbItem.url, selected: true, onClick: () => handleClick(fireAnalyticsEvent, breadcrumbItem.title) }, breadcrumbItem.title));
|
|
26
|
-
})))));
|
|
27
|
-
};
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9icmVhZGNydW1iL2luZGV4LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNoRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFFTCx1QkFBdUIsRUFDeEIsTUFBTSxnREFBZ0QsQ0FBQztBQVd4RCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBbUIsRUFBRSxFQUFFO0lBQ3RELE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sRUFBRSxZQUFZO1FBQ3BCLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLEtBQUssRUFBRTtZQUNMLHVCQUF1QixFQUFFLFlBQVk7WUFDckMscUJBQXFCLEVBQUUsa0JBQWtCO1lBQ3pDLGdDQUFnQyxFQUFFLE9BQU87WUFDekMsbUJBQW1CLEVBQUUsZ0JBQWdCLEtBQUssRUFBRTtTQUM3QztLQUNGLENBQUMsQ0FBQztJQUVILE1BQU0sV0FBVyxHQUFHLENBQ2xCLGtCQUFrRCxFQUNsRCxLQUFhLEVBQ2IsRUFBRTtRQUNGLGtCQUFrQixJQUFJLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUMsQ0FBQztJQUVGLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxLQUFhLEVBQUUsR0FBVSxFQUFFLEVBQUUsQ0FDM0QsS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRXpCLE9BQU8sQ0FDTCxvQkFBQyx1QkFBdUIsUUFDckIsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLEVBQUUsRUFBRSxDQUFDLENBQzNCLG9CQUFDLFdBQVcsa0JBQVksYUFBYSxJQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsY0FBYyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsRUFBRTtRQUMzRCxNQUFNLGFBQWEsR0FBRyxzQkFBc0IsQ0FDMUMsZUFBZSxFQUNmLGFBQWEsQ0FDZCxDQUFDO1FBQ0YsT0FBTyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQ3JCO1lBQ0Usb0JBQUMsY0FBYyxJQUNiLEdBQUcsRUFBRSxjQUFjLENBQUMsS0FBSyxrQkFDWixPQUFPLEVBQ3BCLElBQUksRUFBRSxjQUFjLENBQUMsR0FBRyxFQUN4QixRQUFRLEVBQUUsS0FBSyxFQUNmLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FDWixXQUFXLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUd0RCxjQUFjLENBQUMsS0FBSyxDQUNOO1lBQ2pCLG9CQUFDLGFBQWE7Z0JBQ1osb0JBQUMsY0FBYyxJQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLGVBQWUsR0FBSSxDQUM1QyxDQUNmLENBQ0osQ0FBQyxDQUFDLENBQUMsQ0FDRixvQkFBQyxjQUFjLG9CQUNBLE1BQU0sRUFDbkIsR0FBRyxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQ3pCLElBQUksRUFBRSxjQUFjLENBQUMsR0FBRyxFQUN4QixRQUFRLEVBQUUsSUFBSSxFQUNkLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FDWixXQUFXLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUd0RCxjQUFjLENBQUMsS0FBSyxDQUNOLENBQ2xCLENBQUM7SUFDSixDQUFDLENBQUMsQ0FDVSxDQUNmLENBQ3VCLENBQzNCLENBQUM7QUFDSixDQUFDLENBQUMifQ==
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export declare const styleMap: {
|
|
2
|
-
colors: {
|
|
3
|
-
blue070: string;
|
|
4
|
-
inkContrast: string;
|
|
5
|
-
inkSubtle: string;
|
|
6
|
-
inkNonEssential: string;
|
|
7
|
-
};
|
|
8
|
-
};
|
|
9
|
-
export declare const BreadcrumbItem: import("styled-components").StyledComponent<"a", any, {
|
|
10
|
-
selected: boolean;
|
|
11
|
-
}, never>;
|
|
12
|
-
export declare const Breadcrumbs: import("styled-components").StyledComponent<"nav", any, {}, never>;
|
|
13
|
-
export declare const IconContainer: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import styled from 'styled-components';
|
|
2
|
-
export const styleMap = {
|
|
3
|
-
colors: {
|
|
4
|
-
blue070: '#006699',
|
|
5
|
-
inkContrast: '#01000d',
|
|
6
|
-
inkSubtle: '#696969',
|
|
7
|
-
inkNonEssential: '#aaaaaa'
|
|
8
|
-
}
|
|
9
|
-
};
|
|
10
|
-
export const BreadcrumbItem = styled.a `
|
|
11
|
-
color: inherit;
|
|
12
|
-
text-decoration: none;
|
|
13
|
-
display: inline-grid;
|
|
14
|
-
font-family: Roboto-Regular;
|
|
15
|
-
font-size: 12px;
|
|
16
|
-
font-weight: 500;
|
|
17
|
-
line-height: 1.250;
|
|
18
|
-
letter-spacing: 0%;
|
|
19
|
-
font-stretch: normal
|
|
20
|
-
display: inline-grid;
|
|
21
|
-
background-color: transparent;
|
|
22
|
-
min-height: 32px;
|
|
23
|
-
border: none;
|
|
24
|
-
place-content: center;
|
|
25
|
-
color: ${({ selected }) => selected ? styleMap.colors.inkContrast : styleMap.colors.inkSubtle};
|
|
26
|
-
&:hover {
|
|
27
|
-
color: ${styleMap.colors.blue070}
|
|
28
|
-
};
|
|
29
|
-
`;
|
|
30
|
-
export const Breadcrumbs = styled.nav `
|
|
31
|
-
display: flex;
|
|
32
|
-
`;
|
|
33
|
-
export const IconContainer = styled.div `
|
|
34
|
-
height: 32px;
|
|
35
|
-
display: flex;
|
|
36
|
-
align-items: center;
|
|
37
|
-
padding-inline: 8px;
|
|
38
|
-
`;
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R5bGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYnJlYWRjcnVtYi9zdHlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sbUJBQW1CLENBQUM7QUFFdkMsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHO0lBQ3RCLE1BQU0sRUFBRTtRQUNOLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLGVBQWUsRUFBRSxTQUFTO0tBQzNCO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUF1Qjs7Ozs7Ozs7Ozs7Ozs7O1NBZXBELENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQ3hCLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUzs7V0FFekQsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPOztDQUVqQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUE7O0NBRXBDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQTs7Ozs7Q0FLdEMsQ0FBQyJ9
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
2
|
-
const BreadcrumbIcon = (props: any) => (
|
|
3
|
-
<svg
|
|
4
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
-
width={16}
|
|
6
|
-
height={16}
|
|
7
|
-
fill="none"
|
|
8
|
-
{...props}
|
|
9
|
-
>
|
|
10
|
-
<path
|
|
11
|
-
fill={props.color}
|
|
12
|
-
d="m6.667 4-.94.94L8.78 8l-3.053 3.06.94.94 4-4-4-4Z"
|
|
13
|
-
/>
|
|
14
|
-
</svg>
|
|
15
|
-
);
|
|
16
|
-
export default BreadcrumbIcon;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
overrides={{size: "sizing050"}}
|
package/src/assets/index.tsx
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { default as BreadcrumbIcon } from './BreadcrumbIcon';
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
-
|
|
3
|
-
exports[`Render Breadcrumbs should render a snapshot 1`] = `
|
|
4
|
-
<DocumentFragment>
|
|
5
|
-
<nav
|
|
6
|
-
aria-label="breadcrumbs"
|
|
7
|
-
class="sc-bwzfXH jIEWCi"
|
|
8
|
-
>
|
|
9
|
-
<a
|
|
10
|
-
aria-current="false"
|
|
11
|
-
class="sc-bdVaJa gZsChJ"
|
|
12
|
-
href="/sport"
|
|
13
|
-
>
|
|
14
|
-
Sport
|
|
15
|
-
</a>
|
|
16
|
-
<div
|
|
17
|
-
class="sc-htpNat jVxkgC"
|
|
18
|
-
>
|
|
19
|
-
<svg
|
|
20
|
-
color="#aaaaaa"
|
|
21
|
-
fill="none"
|
|
22
|
-
height="16"
|
|
23
|
-
width="16"
|
|
24
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
25
|
-
>
|
|
26
|
-
<path
|
|
27
|
-
d="m6.667 4-.94.94L8.78 8l-3.053 3.06.94.94 4-4-4-4Z"
|
|
28
|
-
fill="#aaaaaa"
|
|
29
|
-
/>
|
|
30
|
-
</svg>
|
|
31
|
-
</div>
|
|
32
|
-
<a
|
|
33
|
-
aria-current="false"
|
|
34
|
-
class="sc-bdVaJa gZsChJ"
|
|
35
|
-
href="/sport/tennis"
|
|
36
|
-
>
|
|
37
|
-
Tennis
|
|
38
|
-
</a>
|
|
39
|
-
<div
|
|
40
|
-
class="sc-htpNat jVxkgC"
|
|
41
|
-
>
|
|
42
|
-
<svg
|
|
43
|
-
color="#aaaaaa"
|
|
44
|
-
fill="none"
|
|
45
|
-
height="16"
|
|
46
|
-
width="16"
|
|
47
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
48
|
-
>
|
|
49
|
-
<path
|
|
50
|
-
d="m6.667 4-.94.94L8.78 8l-3.053 3.06.94.94 4-4-4-4Z"
|
|
51
|
-
fill="#aaaaaa"
|
|
52
|
-
/>
|
|
53
|
-
</svg>
|
|
54
|
-
</div>
|
|
55
|
-
<a
|
|
56
|
-
aria-current="page"
|
|
57
|
-
class="sc-bdVaJa gItCja"
|
|
58
|
-
href="/australian open"
|
|
59
|
-
>
|
|
60
|
-
Australian Open
|
|
61
|
-
</a>
|
|
62
|
-
</nav>
|
|
63
|
-
</DocumentFragment>
|
|
64
|
-
`;
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import '@testing-library/jest-dom';
|
|
3
|
-
import { render, fireEvent } from '@testing-library/react';
|
|
4
|
-
import { Breadcrumb } from '../index';
|
|
5
|
-
import { breadcrumbItems } from '../fixtures/breadcrumbs.json';
|
|
6
|
-
import { TrackingContextProvider } from '../../../helpers/tracking/TrackingContextProvider';
|
|
7
|
-
|
|
8
|
-
describe('Render Breadcrumbs', () => {
|
|
9
|
-
const renderBreadcrumb = (analyticsStream?: (event: any) => void) =>
|
|
10
|
-
render(
|
|
11
|
-
<TrackingContextProvider
|
|
12
|
-
context={{
|
|
13
|
-
component: 'breadcrumb',
|
|
14
|
-
attrs: {}
|
|
15
|
-
}}
|
|
16
|
-
analyticsStream={analyticsStream}
|
|
17
|
-
>
|
|
18
|
-
<Breadcrumb data={breadcrumbItems} />
|
|
19
|
-
</TrackingContextProvider>
|
|
20
|
-
);
|
|
21
|
-
it('should render a snapshot', () => {
|
|
22
|
-
const { asFragment } = renderBreadcrumb();
|
|
23
|
-
expect(asFragment()).toMatchSnapshot();
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it('should render the component', () => {
|
|
27
|
-
const { getByText } = renderBreadcrumb();
|
|
28
|
-
const getBreadcrumb = getByText('Tennis');
|
|
29
|
-
expect(getBreadcrumb).toBeInTheDocument();
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('items should have link with href', () => {
|
|
33
|
-
const { getAllByRole } = renderBreadcrumb();
|
|
34
|
-
const title = getAllByRole('link')[0];
|
|
35
|
-
expect(title).toHaveAttribute('href', '/sport');
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('last breadcrumb should be selected', () => {
|
|
39
|
-
const { getAllByRole } = renderBreadcrumb();
|
|
40
|
-
const title = getAllByRole('link')[2];
|
|
41
|
-
expect(title).toHaveAttribute('aria-current', 'page');
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('calls analyticsStream when you click', () => {
|
|
45
|
-
const analyticsStream = jest.fn();
|
|
46
|
-
const { getByText } = renderBreadcrumb(analyticsStream);
|
|
47
|
-
const breadcrumb = getByText('Tennis');
|
|
48
|
-
fireEvent.click(breadcrumb);
|
|
49
|
-
expect(analyticsStream).toHaveBeenCalledTimes(1);
|
|
50
|
-
});
|
|
51
|
-
});
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { Meta, Story, Props } from '@storybook/addon-docs'
|
|
2
|
-
import { Breadcrumb } from './index.tsx';
|
|
3
|
-
import { breadcrumbItems, breadcrumbItemsForTrackingDemo } from './fixtures/breadcrumbs.json';
|
|
4
|
-
import { TrackingContextProvider } from '@times-components/ts-newskit/src';
|
|
5
|
-
import analyticsStream from "../../fixtures/analytics-actions/analytics-actions";
|
|
6
|
-
|
|
7
|
-
<Meta
|
|
8
|
-
title="Components/Navigation/Breadcrumb"
|
|
9
|
-
component={Breadcrumb}
|
|
10
|
-
/>
|
|
11
|
-
|
|
12
|
-
# Breadcrumb component
|
|
13
|
-
The `Breadcrumb` component displays your hierarchical position on the website.
|
|
14
|
-
|
|
15
|
-
This takes in a `data` prop, as below, to display the links in their order within the data object.
|
|
16
|
-
|
|
17
|
-
## Props
|
|
18
|
-
<Props of={Breadcrumb} />
|
|
19
|
-
|
|
20
|
-
## Code Example
|
|
21
|
-
`<Breadcrumb data={data} />`
|
|
22
|
-
|
|
23
|
-
An example of the `data` structure can be found in the 'Controls' section on the 'Canvas' tab, where you can customise the data being fed to the Breadcrumb component.
|
|
24
|
-
|
|
25
|
-
## View Component
|
|
26
|
-
Please click the 'Canvas' tab for a better viewing experience, where you can update the props and review at the different breakpoints by clicking the preview icon and selecting from our list of pre-defined breakpoints (XS, SM, MD, LG and XL).
|
|
27
|
-
|
|
28
|
-
export const BreadcrumbStory = ({ data }) => (
|
|
29
|
-
<TrackingContextProvider
|
|
30
|
-
analyticsStream={analyticsStream}
|
|
31
|
-
context={{
|
|
32
|
-
component: 'breadcrumb',
|
|
33
|
-
attrs: {
|
|
34
|
-
}
|
|
35
|
-
}}
|
|
36
|
-
>
|
|
37
|
-
<Breadcrumb {...{ data }} />
|
|
38
|
-
</TrackingContextProvider>
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
<Story name="Breadcrumb" args={{ data: breadcrumbItems }}>
|
|
42
|
-
{BreadcrumbStory.bind({})}
|
|
43
|
-
</Story>
|
|
44
|
-
|
|
45
|
-
<Story name="Breadcrumb - tracking demo" args={{ data: breadcrumbItemsForTrackingDemo }}>
|
|
46
|
-
{BreadcrumbStory.bind({})}
|
|
47
|
-
</Story>
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"breadcrumbItems": [
|
|
3
|
-
{
|
|
4
|
-
"title": "Sport",
|
|
5
|
-
"url": "/sport"
|
|
6
|
-
},
|
|
7
|
-
{
|
|
8
|
-
"title": "Tennis",
|
|
9
|
-
"url": "/sport/tennis"
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"title": "Australian Open",
|
|
13
|
-
"url": "/australian open"
|
|
14
|
-
}
|
|
15
|
-
],
|
|
16
|
-
"breadcrumbItemsForTrackingDemo" : [
|
|
17
|
-
{
|
|
18
|
-
"title": "Sport"
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"title": "Tennis"
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
"title": "Australian Open"
|
|
25
|
-
}
|
|
26
|
-
]
|
|
27
|
-
}
|