({
heading: text('Heading (heading):', 'Tutorials', groupId),
- items: items,
+ items,
}),
},
propsSet: {
diff --git a/packages/react/src/components/TableOfContents/__stories__/TableOfContents.stories.js b/packages/react/src/components/TableOfContents/__stories__/TableOfContents.stories.js
index 82b5fe2281f..a072a4135df 100644
--- a/packages/react/src/components/TableOfContents/__stories__/TableOfContents.stories.js
+++ b/packages/react/src/components/TableOfContents/__stories__/TableOfContents.stories.js
@@ -5,34 +5,53 @@
* LICENSE file in the root directory of this source tree.
*/
-import { text, boolean } from '@storybook/addon-knobs';
-import DataContent from './data/DataContent';
-import Image from '../../Image/Image';
-import imgLg1x1 from '../../../../../storybook-images/assets/720/fpo--1x1--720x720--004.jpg';
-import imgLg4x3 from '../../../../../storybook-images/assets/720/fpo--4x3--720x540--004.jpg';
+import { boolean, select, text } from '@storybook/addon-knobs';
+import DataContent, { headings, LOREM } from './data/DataContent';
+import LinkList from '../../LinkList/LinkList';
import React from 'react';
import readme from '../README.stories.mdx';
import styles from './TableOfContents.stories.scss';
import TableOfContents from '../TableOfContents';
-const sources = [
- {
- src: imgLg4x3,
- breakpoint: 400,
- },
- {
- src: imgLg4x3,
- breakpoint: 672,
- },
- {
- src: imgLg1x1,
- breakpoint: 1056,
- },
-];
-
-const defaultSrc = imgLg1x1;
-const alt = 'Lorem Ipsum';
-const longDescription = 'Lorem Ipsum Dolor';
+export const Default = ({ parameters }) => {
+ const { numberOfItems: menuItems, withHeadingContent } =
+ parameters?.props?.Other ?? {};
+ const headingItems = [
+ {
+ type: 'local',
+ copy: 'DevOps',
+ cta: {
+ href: 'https://github.com/carbon-design-system/carbon-web-components',
+ },
+ },
+ {
+ type: 'local',
+ copy: 'Automation',
+ cta: {
+ href: 'https://github.com/carbon-design-system/carbon-web-components',
+ },
+ },
+ {
+ type: 'local',
+ copy: 'Development',
+ cta: {
+ href: 'https://github.com/carbon-design-system/carbon-web-components',
+ },
+ },
+ ];
+ const headingContent = (
+
+ );
+ return (
+ <>
+
+
+
+ >
+ );
+};
export default {
title: 'Components|Table of contents',
@@ -46,83 +65,50 @@ export default {
],
parameters: {
...readme.parameters,
- },
-};
-
-export const ManuallyDefineMenuItems = ({ parameters }) => {
- const { menuItems, menuLabel, menuRule, headingContent } =
- parameters?.props?.TableOfContents ?? {};
- const params = new URLSearchParams(window.location.search);
- const themeParam = params.has('theme') ? params.get('theme') : null;
- const theme =
- themeParam ||
- document.documentElement.getAttribute('storybook-carbon-theme') ||
- 'white';
- return (
-
-
-
- );
-};
-
-ManuallyDefineMenuItems.story = {
- name: 'Manually define menu items',
- parameters: {
knobs: {
- TableOfContents: ({ groupId }) => ({
- menuLabel: text('Menu label (menuLabel)', 'Jump to', groupId),
- menuRule: boolean('Optional Rule (menuRule)', false, groupId),
+ Other: ({ groupId }) => ({
+ withHeadingContent: boolean('With heading content', false, groupId),
+ numberOfItems: Array.from({
+ length: select('Number of items', [5, 6, 7, 8], 5, groupId),
+ }).map((_, i) => ({
+ heading: text(
+ `Section ${i + 1} heading`,
+ headings[i % headings.length],
+ groupId
+ ),
+ copy: text(
+ `Section ${i + 1} copy`,
+ `${LOREM}\n`.repeat(3).trim(),
+ groupId
+ ),
+ })),
}),
},
},
};
-export const DynamicItems = ({ parameters }) => (
-
+export const Horizontal = () => (
+
+ This component is maintained in{' '}
+ @carbon/ibmdotcom-web-components
library with a{' '}
+
+ React wrapper
+
+ .
+
);
-DynamicItems.story = {
- name: 'Dynamic items',
+Horizontal.story = {
+ name: 'Horizontal',
parameters: {
- knobs: {
- TableOfContents: ({ groupId }) => ({
- menuLabel: text('Menu label (menuLabel)', 'Jump to', groupId),
- }),
- },
- },
-};
-
-export const WithHeadingContent = ({ parameters }) => (
-
-);
-
-WithHeadingContent.story = {
- name: 'With heading content',
- parameters: {
- knobs: {
- TableOfContents: ({ groupId }) => ({
- menuLabel: text('Menu label (menuLabel)', 'Jump to', groupId),
- menuRule: boolean('Optional Rule (menuRule)', false, groupId),
- headingContent: (
-
- ),
- }),
+ ...readme.parameters,
+ knobs: null,
+ percy: {
+ skip: true,
},
+ proxy: true,
},
};
diff --git a/packages/react/src/components/TableOfContents/__stories__/data/DataContent.js b/packages/react/src/components/TableOfContents/__stories__/data/DataContent.js
index 2b744e41b32..afd933b0222 100644
--- a/packages/react/src/components/TableOfContents/__stories__/data/DataContent.js
+++ b/packages/react/src/components/TableOfContents/__stories__/data/DataContent.js
@@ -1,210 +1,50 @@
/**
- * Copyright IBM Corp. 2016, 2020
+ * Copyright IBM Corp. 2016, 2021
*
* This source code is licensed under the Apache-2.0 license found in the
* LICENSE file in the root directory of this source tree.
*/
/* eslint-disable jsx-a11y/anchor-is-valid */
+import { PropTypes } from 'prop-types';
import React from 'react';
-const DataContent = () => (
+
+export const headings = [
+ 'Forward thinkers',
+ 'Innovation and transformation',
+ 'Client success stories',
+ 'Iconic moments in IBM history',
+ 'Trust and responsibility',
+ 'Connect with IBM',
+];
+
+// eslint-disable-next-line max-len
+export const LOREM = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis. Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
+nisl.`;
+
+const generateCopySections = n => [...Array(n)].map(() => {LOREM}
);
+
+const DataContent = ({ items }) => (
-
- Cras molestie condimentum
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie
- condimentum consectetur. Nulla tristique lacinia elit, at elementum dui
- gravida non. Mauris et nisl semper, elementum quam non, lacinia purus.
- Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque
- facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis
- scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et
- ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam
- vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien
- pellentesque tristique. Morbi id nibh metus. Integer non scelerisque nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie
- condimentum consectetur. Nulla tristique lacinia elit, at elementum dui
- gravida non. Mauris et nisl semper, elementum quam non, lacinia purus.
- Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque
- facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis
- scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et
- ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam
- vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien
- pellentesque tristique. Morbi id nibh metus. Integer non scelerisque nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie
- condimentum consectetur. Nulla tristique lacinia elit, at elementum dui
- gravida non. Mauris et nisl semper, elementum quam non, lacinia purus.
- Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque
- facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis
- scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et
- ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam
- vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien
- pellentesque tristique. Morbi id nibh metus. Integer non scelerisque nisl.
-
-
- Praesent fermentum sodales
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie
- condimentum consectetur. Nulla tristique lacinia elit, at elementum dui
- gravida non. Mauris et nisl semper, elementum quam non, lacinia purus.
- Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque
- facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis
- scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et
- ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam
- vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien
- pellentesque tristique. Morbi id nibh metus. Integer non scelerisque nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie
- condimentum consectetur. Nulla tristique lacinia elit, at elementum dui
- gravida non. Mauris et nisl semper, elementum quam non, lacinia purus.
- Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque
- facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis
- scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et
- ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam
- vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien
- pellentesque tristique. Morbi id nibh metus. Integer non scelerisque nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie
- condimentum consectetur. Nulla tristique lacinia elit, at elementum dui
- gravida non. Mauris et nisl semper, elementum quam non, lacinia purus.
- Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque
- facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis
- scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et
- ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam
- vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien
- pellentesque tristique. Morbi id nibh metus. Integer non scelerisque nisl.
-
-
- Nulla tristique lacinia
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie
- condimentum consectetur. Nulla tristique lacinia elit, at elementum dui
- gravida non. Mauris et nisl semper, elementum quam non, lacinia purus.
- Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque
- facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis
- scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et
- ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam
- vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien
- pellentesque tristique. Morbi id nibh metus. Integer non scelerisque nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie
- condimentum consectetur. Nulla tristique lacinia elit, at elementum dui
- gravida non. Mauris et nisl semper, elementum quam non, lacinia purus.
- Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque
- facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis
- scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et
- ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam
- vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien
- pellentesque tristique. Morbi id nibh metus. Integer non scelerisque nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie
- condimentum consectetur. Nulla tristique lacinia elit, at elementum dui
- gravida non. Mauris et nisl semper, elementum quam non, lacinia purus.
- Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque
- facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis
- scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et
- ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam
- vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien
- pellentesque tristique. Morbi id nibh metus. Integer non scelerisque nisl.
-
-
- Morbi id nibh metus
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie
- condimentum consectetur. Nulla tristique lacinia elit, at elementum dui
- gravida non. Mauris et nisl semper, elementum quam non, lacinia purus.
- Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque
- facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis
- scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et
- ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam
- vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien
- pellentesque tristique. Morbi id nibh metus. Integer non scelerisque nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie
- condimentum consectetur. Nulla tristique lacinia elit, at elementum dui
- gravida non. Mauris et nisl semper, elementum quam non, lacinia purus.
- Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque
- facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis
- scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et
- ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam
- vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien
- pellentesque tristique. Morbi id nibh metus. Integer non scelerisque nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie
- condimentum consectetur. Nulla tristique lacinia elit, at elementum dui
- gravida non. Mauris et nisl semper, elementum quam non, lacinia purus.
- Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque
- facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis
- scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et
- ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam
- vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien
- pellentesque tristique. Morbi id nibh metus. Integer non scelerisque nisl.
-
-
- Integer non scelerisque
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie
- condimentum consectetur. Nulla tristique lacinia elit, at elementum dui
- gravida non. Mauris et nisl semper, elementum quam non, lacinia purus.
- Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque
- facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis
- scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et
- ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam
- vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien
- pellentesque tristique. Morbi id nibh metus. Integer non scelerisque nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie
- condimentum consectetur. Nulla tristique lacinia elit, at elementum dui
- gravida non. Mauris et nisl semper, elementum quam non, lacinia purus.
- Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque
- facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis
- scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et
- ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam
- vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien
- pellentesque tristique. Morbi id nibh metus. Integer non scelerisque nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie
- condimentum consectetur. Nulla tristique lacinia elit, at elementum dui
- gravida non. Mauris et nisl semper, elementum quam non, lacinia purus.
- Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque
- facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis
- scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et
- ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam
- vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien
- pellentesque tristique. Morbi id nibh metus. Integer non scelerisque nisl.
-
+ {items?.map(({ heading, copy }, i) => (
+ <>
+ {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
+
+ {heading}
+
+ {copy
+ ? copy.split('\n').map(section =>
{section}
)
+ : generateCopySections(3)}
+ >
+ ))}
);
+DataContent.propTypes = {
+ /**
+ * Array of table of contents items
+ */
+ items: PropTypes.array,
+};
+
export default DataContent;
diff --git a/packages/react/tests/e2e-storybook/cypress/integration/TableOfContents/TableOfContents.e2e.js b/packages/react/tests/e2e-storybook/cypress/integration/TableOfContents/TableOfContents.e2e.js
index be3855ecee5..06ec08c6ad9 100644
--- a/packages/react/tests/e2e-storybook/cypress/integration/TableOfContents/TableOfContents.e2e.js
+++ b/packages/react/tests/e2e-storybook/cypress/integration/TableOfContents/TableOfContents.e2e.js
@@ -12,11 +12,7 @@
* @private
*/
const _paths = {
- manual_default:
- 'iframe.html?id=components-table-of-contents--manually-define-menu-items',
- dynamic_default: 'iframe.html?id=components-table-of-contents--dynamic-items',
- heading_content:
- 'iframe.html?id=components-table-of-contents--with-heading-content',
+ default: 'iframe.html?id=components-table-of-contents--default',
};
/**
@@ -234,10 +230,10 @@ const _tests = {
},
};
-describe('TableOfContents | manually defined (desktop)', () => {
+describe('TableOfContents | default (desktop)', () => {
beforeEach(() => {
cy.viewport(1280, 720);
- cy.visit(`/${_paths.manual_default}`);
+ cy.visit(`/${_paths.default}`);
});
it(
@@ -256,98 +252,10 @@ describe('TableOfContents | manually defined (desktop)', () => {
it('should render correctly in all themes', _tests.all.screenshotThemes);
});
-describe('TableOfContents | dynamically defined (desktop)', () => {
- beforeEach(() => {
- cy.viewport(1280, 720);
- cy.visit(`/${_paths.dynamic_default}`);
- });
-
- it(
- 'should load table of contents sidebar with links',
- _tests.desktop.checkRender
- );
- it(
- 'should navigate content to selected section',
- _tests.desktop.checkLinkFunctionality
- );
- xit('should update current section on scroll', _tests.desktop.checkScrollSpy);
- it(
- 'should remain visible on page throughout scroll',
- _tests.desktop.checkStickyNav
- );
- it('should render correctly in all themes', _tests.all.screenshotThemes);
-});
-
-describe('TableOfContents | with heading content (desktop)', () => {
- beforeEach(() => {
- cy.viewport(1280, 720);
- cy.visit(`/${_paths.heading_content}`);
- });
-
- it(
- 'should load table of contents horizontal bar with links',
- _tests.desktop.checkRender
- );
- it(
- 'should navigate content to selected section',
- _tests.desktop.checkLinkFunctionality
- );
- xit('should update current section on scroll', _tests.desktop.checkScrollSpy);
- it(
- 'should remain visible on page throughout scroll',
- _tests.desktop.checkStickyNav
- );
- it('should render correctly in all themes', _tests.all.screenshotThemes);
-});
-
-describe('TableOfContents | manually defined (mobile)', () => {
- beforeEach(() => {
- cy.viewport(320, 720);
- cy.visit(`/${_paths.manual_default}`);
- });
-
- it(
- 'should load table of contents sidebar with links',
- _tests.mobile.checkRender
- );
- it(
- 'should navigate content to selected section',
- _tests.mobile.checkLinkFunctionality
- );
- xit('should update current section on scroll', _tests.mobile.checkScrollSpy);
- it(
- 'should remain visible on page throughout scroll',
- _tests.mobile.checkStickyNav
- );
- it('should render correctly in all themes', _tests.all.screenshotThemes);
-});
-
-describe('TableOfContents | dynamically defined (mobile)', () => {
- beforeEach(() => {
- cy.viewport(320, 720);
- cy.visit(`/${_paths.dynamic_default}`);
- });
-
- it(
- 'should load table of contents sidebar with links',
- _tests.mobile.checkRender
- );
- it(
- 'should navigate content to selected section',
- _tests.mobile.checkLinkFunctionality
- );
- xit('should update current section on scroll', _tests.mobile.checkScrollSpy);
- it(
- 'should remain visible on page throughout scroll',
- _tests.mobile.checkStickyNav
- );
- it('should render correctly in all themes', _tests.all.screenshotThemes);
-});
-
-describe('TableOfContents | with heading content (mobile)', () => {
+describe('TableOfContents | default (mobile)', () => {
beforeEach(() => {
cy.viewport(320, 720);
- cy.visit(`/${_paths.heading_content}`);
+ cy.visit(`/${_paths.default}`);
});
it(
diff --git a/packages/styles/scss/components/tableofcontents/_tableofcontents.scss b/packages/styles/scss/components/tableofcontents/_tableofcontents.scss
index f9e905997c6..0bb19f2febd 100644
--- a/packages/styles/scss/components/tableofcontents/_tableofcontents.scss
+++ b/packages/styles/scss/components/tableofcontents/_tableofcontents.scss
@@ -205,6 +205,15 @@ $hover-transition-timing: 95ms;
display: none;
}
}
+
+ > .#{$prefix}--link-list {
+ padding-top: 0;
+ padding-bottom: $spacing-05;
+ }
+
+ hr[data-autoid='#{$dds-prefix}--hr'] {
+ margin-top: 0;
+ }
}
.#{$prefix}--tableofcontents__contents {
diff --git a/packages/web-components/src/components/table-of-contents/__stories__/content.ts b/packages/web-components/src/components/table-of-contents/__stories__/content.ts
index 8efdb7b5eeb..db052388ebf 100644
--- a/packages/web-components/src/components/table-of-contents/__stories__/content.ts
+++ b/packages/web-components/src/components/table-of-contents/__stories__/content.ts
@@ -9,200 +9,47 @@
import { html } from 'lit-element';
-const content = contentClass => html`
+export const headings = [
+ 'Forward thinkers',
+ 'Innovation and transformation',
+ 'Client success stories',
+ 'Iconic moments in IBM history',
+ 'Trust and responsibility',
+ 'Connect with IBM',
+];
+
+// eslint-disable-next-line max-len
+export const LOREM = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis. Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
+nisl.`;
+
+const generateCopySections = n =>
+ [...Array(n)].map(
+ () =>
+ html`
+ ${LOREM}
+ `
+ );
+
+const content = ({ contentClass, items }) => html`
-
-
- Forward thinkers
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
-
- Innovation and transformation
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
-
- Client success stories
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
-
- Iconic moments in IBM history
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
-
- Trust and responsibility
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
-
- Connect with IBM
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
+ ${items.map(
+ ({ heading, copy }, i) =>
+ html`
+
+
+ ${heading}
+
+
+ ${copy
+ ? copy.split('\n').map(
+ section =>
+ html`
+
${section}
+ `
+ )
+ : generateCopySections(3)}
+ `
+ )}
`;
diff --git a/packages/web-components/src/components/table-of-contents/__stories__/table-of-contents.stories.react.tsx b/packages/web-components/src/components/table-of-contents/__stories__/table-of-contents.stories.react.tsx
index d8fb391f7d9..dc0db1650ca 100644
--- a/packages/web-components/src/components/table-of-contents/__stories__/table-of-contents.stories.react.tsx
+++ b/packages/web-components/src/components/table-of-contents/__stories__/table-of-contents.stories.react.tsx
@@ -12,62 +12,75 @@ import React from 'react';
// In our dev env, we auto-generate the file and re-map below path to to point to the generated file.
// @ts-ignore
import DDSHorizontalRule from '@carbon/ibmdotcom-web-components/es/components-react/horizontal-rule/horizontal-rule';
-import DDSImage from '@carbon/ibmdotcom-web-components/es/components-react/image/image';
-import DDSImageItem from '@carbon/ibmdotcom-web-components/es/components-react/image/image-item';
-import { boolean } from '@storybook/addon-knobs';
+import { boolean, select, text } from '@storybook/addon-knobs';
+// @ts-ignore
import DDSTableOfContents from '@carbon/ibmdotcom-web-components/es/components-react/table-of-contents/table-of-contents';
-import content from './wrapper-content';
+import DDSLinkList from '@carbon/ibmdotcom-web-components/es/components-react/link-list/link-list';
+import DDSLinkListItem from '@carbon/ibmdotcom-web-components/es/components-react/link-list/link-list-item';
+import ArrowLeft20 from '@carbon/icons-react/es/arrow--left/20.js';
+import content, { headings, LOREM } from './wrapper-content';
import readme from './README.stories.react.mdx';
import styles from './table-of-contents.stories.scss';
-import imgMd16x9 from '../../../../../storybook-images/assets/480/fpo--16x9--480x270--005.jpg';
-import imgLg16x9 from '../../../../../storybook-images/assets/720/fpo--16x9--720x405--001.jpg';
-import imgLg1x1 from '../../../../../storybook-images/assets/720/fpo--1x1--720x720--001.jpg';
-import imgXlg16x9 from '../../../../../storybook-images/assets/1312/fpo--16x9--1312x738--001.jpg';
+import { ICON_PLACEMENT } from '../../../globals/defs';
-export const Default = () => {
+export const Default = ({ parameters }) => {
+ const { numberOfItems: items, withHeadingContent } = parameters?.props?.Other ?? {};
return (
<>
- {content()}
+
+ {withHeadingContent && (
+ <>
+
+
+ DevOps
+
+
+ Automation
+
+
+ Development
+
+
+
+ >
+ )}
+ {content({ items })}
+
>
);
};
-export const WithHeadingContent = ({ parameters }) => {
- const { menuRule } = parameters?.props?.Other ?? {};
+export const Horizontal = ({ parameters }) => {
+ const { numberOfItems: items } = parameters?.props?.Other ?? {};
return (
<>
-
-
-
-
-
-
- {!menuRule ? null : }
- {content()}
-
+ {content({ items })}
>
);
};
-WithHeadingContent.story = {
- name: 'With heading content',
+Horizontal.story = {
+ name: 'Horizontal',
parameters: {
knobs: {
- Other: () => ({
- menuRule: boolean('Put a horizontal rule', false),
+ Other: ({ groupId }) => ({
+ numberOfItems: Array.from({
+ length: select('Number of items', [5, 6, 7, 8], 5, groupId),
+ }).map((_, i) => ({
+ heading: text(`Section ${i + 1} heading`, headings[i % headings.length], groupId),
+ copy: text(`Section ${i + 1} copy`, `${LOREM}\n`.repeat(3).trim(), groupId),
+ })),
}),
},
},
};
-export const Horizontal = () => {
- return (
- <>
- {content()}
- >
- );
-};
-
export default {
title: 'Components/Table of contents',
decorators: [
@@ -85,5 +98,16 @@ export default {
parameters: {
...readme.parameters,
hasStoryPadding: true,
+ knobs: {
+ Other: ({ groupId }) => ({
+ withHeadingContent: boolean('With heading content', false, groupId),
+ numberOfItems: Array.from({
+ length: select('Number of items', [5, 6, 7, 8], 5, groupId),
+ }).map((_, i) => ({
+ heading: text(`Section ${i + 1} heading`, headings[i % headings.length], groupId),
+ copy: text(`Section ${i + 1} copy`, `${LOREM}\n`.repeat(3).trim(), groupId),
+ })),
+ }),
+ },
},
};
diff --git a/packages/web-components/src/components/table-of-contents/__stories__/table-of-contents.stories.ts b/packages/web-components/src/components/table-of-contents/__stories__/table-of-contents.stories.ts
index 2bf23608d8a..035e90c561d 100644
--- a/packages/web-components/src/components/table-of-contents/__stories__/table-of-contents.stories.ts
+++ b/packages/web-components/src/components/table-of-contents/__stories__/table-of-contents.stories.ts
@@ -9,65 +9,81 @@
import { nothing } from 'lit-html';
import { html } from 'lit-element';
-import { boolean } from '@storybook/addon-knobs';
+import { boolean, select, text } from '@storybook/addon-knobs';
+import ArrowLeft20 from 'carbon-web-components/es/icons/arrow--left/20.js';
import '../table-of-contents';
import '../../horizontal-rule/horizontal-rule';
import '../../image/image';
-import content from './content';
+import '../../link-list/link-list';
+import content, { headings, LOREM } from './content';
import styles from './table-of-contents.stories.scss';
import readme from './README.stories.mdx';
-import imgMd16x9 from '../../../../../storybook-images/assets/480/fpo--16x9--480x270--005.jpg';
-import imgLg16x9 from '../../../../../storybook-images/assets/720/fpo--16x9--720x405--001.jpg';
-import imgLg1x1 from '../../../../../storybook-images/assets/720/fpo--1x1--720x720--001.jpg';
-import imgXlg16x9 from '../../../../../storybook-images/assets/1312/fpo--16x9--1312x738--001.jpg';
import { TOC_TYPES } from '../defs';
+import { ICON_PLACEMENT } from '../../../globals/defs';
-export const Default = () => html`
-
- ${content('bx--tableofcontents__contents')}
-
-`;
-
-export const WithHeadingContent = ({ parameters }) => {
- const { menuRule } = parameters?.props?.Other ?? {};
+export const Default = ({ parameters }) => {
+ const { numberOfItems: items, withHeadingContent } = parameters?.props?.Other ?? {};
return html`
-
-
-
-
-
- ${!menuRule
- ? nothing
- : html`
+ ${withHeadingContent
+ ? html`
+
+
+ DevOps${ArrowLeft20({ slot: 'icon' })}
+
+
+ Automation${ArrowLeft20({ slot: 'icon' })}
+
+
+ Development${ArrowLeft20({ slot: 'icon' })}
+
+
- `}
- ${content('bx--tableofcontents__contents')}
+ `
+ : nothing}
+ ${content({ contentClass: 'bx--tableofcontents__contents', items })}
+
+ `;
+};
+
+export const Horizontal = ({ parameters }) => {
+ const { numberOfItems: items } = parameters?.props?.Other ?? {};
+ return html`
+
+
+
+ ${content({ contentClass: 'bx--tableofcontents-horizontal__contents', items })}
+
+
`;
};
-WithHeadingContent.story = {
- name: 'With heading content',
+Horizontal.story = {
+ name: 'Horizontal',
parameters: {
knobs: {
- Other: () => ({
- menuRule: boolean('Put a horizontal rule', false),
+ Other: ({ groupId }) => ({
+ numberOfItems: Array.from({
+ length: select('Number of items', [5, 6, 7, 8], 5, groupId),
+ }).map((_, i) => ({
+ heading: text(`Section ${i + 1} heading`, headings[i % headings.length], groupId),
+ copy: text(`Section ${i + 1} copy`, `${LOREM}\n`.repeat(3).trim(), groupId),
+ })),
}),
},
},
};
-export const Horizontal = () => html`
-
-
-
- ${content('bx--tableofcontents-horizontal__contents')}
-
-
-
-`;
-
export default {
title: 'Components/Table of contents',
decorators: [
@@ -83,5 +99,16 @@ export default {
parameters: {
...readme.parameters,
hasStoryPadding: true,
+ knobs: {
+ Other: ({ groupId }) => ({
+ withHeadingContent: boolean('With heading content', false, groupId),
+ numberOfItems: Array.from({
+ length: select('Number of items', [5, 6, 7, 8], 5, groupId),
+ }).map((_, i) => ({
+ heading: text(`Section ${i + 1} heading`, headings[i % headings.length], groupId),
+ copy: text(`Section ${i + 1} copy`, `${LOREM}\n`.repeat(3).trim(), groupId),
+ })),
+ }),
+ },
},
};
diff --git a/packages/web-components/src/components/table-of-contents/__stories__/wrapper-content.tsx b/packages/web-components/src/components/table-of-contents/__stories__/wrapper-content.tsx
index 50a5dd3c0c7..128cd856c6a 100644
--- a/packages/web-components/src/components/table-of-contents/__stories__/wrapper-content.tsx
+++ b/packages/web-components/src/components/table-of-contents/__stories__/wrapper-content.tsx
@@ -10,191 +10,33 @@
// @ts-nocheck
import React from 'react';
-/* eslint-disable jsx-a11y/anchor-is-valid */
-const content = () => (
+export const headings = [
+ 'Forward thinkers',
+ 'Innovation and transformation',
+ 'Client success stories',
+ 'Iconic moments in IBM history',
+ 'Trust and responsibility',
+ 'Connect with IBM',
+];
+
+// eslint-disable-next-line max-len
+export const LOREM = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis. Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
+nisl.`;
+
+const generateCopySections = (n: Number) => [...Array(n)].map(() => {LOREM}
);
+
+const content = ({ items }: { items: Array }) => (
-
- Forward thinkers
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Innovation and transformation
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Client success stories
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Iconic moments in IBM history
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Trust and responsibility
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Connect with IBM
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras molestie condimentum consectetur. Nulla tristique lacinia
- elit, at elementum dui gravida non. Mauris et nisl semper, elementum quam non, lacinia purus. Vivamus aliquam vitae sapien
- volutpat efficitur. Curabitur sagittis neque facilisis magna posuere consectetur. Praesent fermentum sodales facilisis.
- Mauris a efficitur sem. Aliquam vehicula sapien libero, a viverra felis scelerisque vel. Vestibulum ante ipsum primis in
- faucibus orci luctus et ultrices posuere cubilia Curae; Donec fringilla dui tellus, a pretium diam vehicula et. Etiam non
- vulputate augue. Morbi laoreet diam dapibus sapien pellentesque tristique. Morbi id nibh metus. Integer non scelerisque
- nisl.
-
+ {items?.map(({ heading, copy }, i: Number) => (
+ <>
+ {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
+
+ {heading}
+
+ {copy ? copy.split('\n').map((section: String) =>
{section}
) : generateCopySections(3)}
+ >
+ ))}
);
-/* eslint-enable jsx-a11y/anchor-is-valid */
export default content;
diff --git a/packages/web-components/tests/e2e-storybook/cypress/integration/table-of-contents/table-of-contents.e2e.js b/packages/web-components/tests/e2e-storybook/cypress/integration/table-of-contents/table-of-contents.e2e.js
index b16a757a4ad..9f65c2007ee 100644
--- a/packages/web-components/tests/e2e-storybook/cypress/integration/table-of-contents/table-of-contents.e2e.js
+++ b/packages/web-components/tests/e2e-storybook/cypress/integration/table-of-contents/table-of-contents.e2e.js
@@ -13,7 +13,6 @@
*/
const _paths = {
default: 'iframe.html?id=components-table-of-contents--default',
- heading: 'iframe.html?id=components-table-of-contents--with-heading-content',
horizontal: 'iframe.html?id=components-table-of-contents--horizontal',
};
@@ -240,19 +239,6 @@ describe('dds-table-of-contents | default (desktop)', () => {
it('should render correctly in all themes', _tests.all.screenshotThemes);
});
-describe('dds-table-of-contents | with heading content (desktop)', () => {
- beforeEach(() => {
- cy.viewport(1280, 720);
- cy.visit(`/${_paths.heading}`);
- });
-
- it('should load table of contents sidebar with links', _tests.desktop.checkRender);
- it('should navigate content to selected section', _tests.desktop.checkLinkFunctionality);
- xit('should update current section on scroll', _tests.desktop.checkScrollSpy);
- it('should remain visible on page throughout scroll', _tests.desktop.checkStickyNav);
- it('should render correctly in all themes', _tests.all.screenshotThemes);
-});
-
describe('dds-table-of-contents | horizontal (desktop)', () => {
beforeEach(() => {
cy.viewport(1280, 720);
@@ -279,19 +265,6 @@ describe('dds-table-of-contents | default (mobile)', () => {
it('should render correctly in all themes', _tests.all.screenshotThemes);
});
-describe('dds-table-of-contents | with heading content (mobile)', () => {
- beforeEach(() => {
- cy.viewport(320, 720);
- cy.visit(`/${_paths.heading}`);
- });
-
- it('should load table of contents sidebar with links', _tests.mobile.checkRender);
- it('should navigate content to selected section', _tests.mobile.checkLinkFunctionality);
- xit('should update current section on scroll', _tests.mobile.checkScrollSpy);
- it('should remain visible on page throughout scroll', _tests.mobile.checkStickyNav);
- it('should render correctly in all themes', _tests.all.screenshotThemes);
-});
-
describe('dds-table-of-contents | horizontal (mobile)', () => {
beforeEach(() => {
cy.viewport(320, 720);