diff --git a/libs/components/src/side-sheet/side-sheet.stories.js b/libs/components/src/side-sheet/side-sheet.stories.js index 5a2d7b45f..18c23664a 100644 --- a/libs/components/src/side-sheet/side-sheet.stories.js +++ b/libs/components/src/side-sheet/side-sheet.stories.js @@ -4,57 +4,34 @@ import { Active as ActiveStatusHeader } from '../status-header/status-header.sto import tableRowSelectionContent from '../../stories/demos/table-row-selection.content.html?raw'; import '../data-table/data-table.stories.scss'; -export default { - title: 'Components/Side sheet', - argTypes: { - onClick: { action: 'clicked' }, - width: { control: { type: 'number' } }, - }, - args: { - width: 800, - }, - parameters: { - actions: { - handles: ['click cv-button'], - }, - }, - tags: ['autodocs'], -}; +const renderStory = (story, args = {}) => + story.render({ ...(story.args ?? {}), ...args }); -export const Basic = ({ width }) => { +const attachSideSheetToggle = ({ + triggerSelector, + sideSheetSelector, + childTriggerSelector, + childSideSheetSelector, +}) => { document.addEventListener( 'DOMContentLoaded', () => { - const sideSheet = document.querySelector('cv-side-sheet'); + const sideSheet = document.querySelector(sideSheetSelector); + document - .querySelector('cv-button') + .querySelector(triggerSelector) ?.addEventListener('click', () => sideSheet?.open ? sideSheet.close() : sideSheet?.show(), ); - }, - { once: true }, - ); - return ` - Open side sheet - - - `; -}; -export const Multiple = ({ width }) => { - document.addEventListener( - 'DOMContentLoaded', - () => { - const sideSheet = document.querySelector('#parentSideSheet'); - const childSideSheet = document.querySelector('#childSideSheet'); + if (!childTriggerSelector || !childSideSheetSelector) { + return; + } + + const childSideSheet = document.querySelector(childSideSheetSelector); document - .querySelector('#parentTarget') - ?.addEventListener('click', () => - sideSheet?.open ? sideSheet.close() : sideSheet?.show(), - ); - document - .querySelector('#childTarget') + .querySelector(childTriggerSelector) ?.addEventListener('click', () => childSideSheet?.open ? childSideSheet.close() @@ -63,38 +40,84 @@ export const Multiple = ({ width }) => { }, { once: true }, ); +}; + +const renderSingleSideSheet = ({ + heading = 'Sample side sheet', + open = false, + pushed = false, + noPadding = false, + width, + content = '', +}) => { + attachSideSheetToggle({ + triggerSelector: 'cv-button', + sideSheetSelector: 'cv-side-sheet', + }); + + return ` + ${ + width + ? `` + : '' + } + Open side sheet + + ${content} + + `; +}; + +const renderMultipleSideSheets = () => { + attachSideSheetToggle({ + triggerSelector: '#parentTarget', + sideSheetSelector: '#parentSideSheet', + childTriggerSelector: '#childTarget', + childSideSheetSelector: '#childSideSheet', + }); + return ` Open side sheet - + Open child - + `; }; -export const StatusHeader = ({ width }) => { - document.addEventListener( - 'DOMContentLoaded', - () => { - const sideSheet = document.querySelector('cv-side-sheet'); - console.log(sideSheet); - document - .querySelector('cv-button') - ?.addEventListener('click', () => - sideSheet?.open ? sideSheet.close() : sideSheet?.show(), - ); +export default { + title: 'Components/Side sheet', + argTypes: { onClick: { action: 'clicked' } }, + parameters: { + actions: { + handles: ['click cv-button'], }, - { once: true }, - ); - return ` - Open side sheet - - ${ActiveStatusHeader({ - state: 'active', - title: 'Example status from a side sheet', - })} - ${tableRowSelectionContent} - - `; + }, + tags: ['autodocs'], +}; + +export const Basic = { + render: renderSingleSideSheet, +}; + +export const Multiple = { + render: renderMultipleSideSheets, +}; + +export const StatusHeader = { + render: renderSingleSideSheet, + args: { + noPadding: true, + width: '800px', + content: `${renderStory(ActiveStatusHeader, { + state: 'active', + titleText: 'Example status from a side sheet', + })} + ${tableRowSelectionContent}`, + }, }; diff --git a/libs/components/src/skeleton/skeleton.stories.js b/libs/components/src/skeleton/skeleton.stories.js index 76862b35c..c7513ed82 100644 --- a/libs/components/src/skeleton/skeleton.stories.js +++ b/libs/components/src/skeleton/skeleton.stories.js @@ -1,52 +1,68 @@ import '../checkbox/checkbox'; import '../formfield/formfield'; -import { Basic } from '../typography/typography.stories'; +import typographyMeta, { Basic } from '../typography/typography.stories'; import loremIpsumContent from '../../stories/demos/lorem-ipsum.content.html?raw'; import tableProgressContent from '../../stories/demos/table-progress-indicator.content.html?raw'; import 'skeleton-elements/css'; -export default { - title: 'Components/Skeleton', +const renderStory = (story, meta, args = {}) => { + if (typeof story === 'function') { + return story(args); + } + + const render = story.render ?? meta?.render; + + if (typeof render !== 'function') { + throw new Error('Story render function is not available'); + } + + return render({ ...(story.args ?? {}), ...args }); }; -const skeletonClsName = 'skeleton-text'; -const skeletonEffect = 'skeleton-effect-fade'; +const applySkeletonClasses = (elements) => { + Array.from(elements).forEach((element) => { + element.classList.add(skeletonClsName); + element.classList.add(skeletonEffect); + }); +}; -export const DataTable = () => { +const createSkeletonContainer = (content, applySkeleton) => { const container = document.createElement('div'); - container.innerHTML = tableProgressContent; - const tableCell = container.getElementsByClassName('mdc-data-table__cell'); - Array.from(tableCell).forEach((cell) => { - cell.classList.add(skeletonClsName); - cell.classList.add(skeletonEffect); - }); + container.innerHTML = content; + applySkeleton?.(container); return container; }; -export const Typography = () => { - const container = document.createElement('div'); - container.classList.add(skeletonClsName); - container.classList.add(skeletonEffect); - container.innerHTML = `${Basic()}`; +const renderSkeletonContent = (content) => { + return createSkeletonContainer(content, (container) => { + applySkeletonClasses( + container.children.length ? container.children : [container], + ); + }); +}; - return container; +const renderDataTable = () => { + return createSkeletonContainer(tableProgressContent, (container) => { + applySkeletonClasses( + container.getElementsByClassName('mdc-data-table__cell'), + ); + }); }; -export const Content = () => { - const container = document.createElement('div'); - container.classList.add(skeletonClsName); - container.classList.add(skeletonEffect); - container.innerHTML = loremIpsumContent; +const renderTypography = () => { + return renderSkeletonContent(renderStory(Basic, typographyMeta)); +}; - return container; +const renderContent = () => { + return renderSkeletonContent(loremIpsumContent); }; -export const Checkbox = ({ label = 'Bananas', indeterminate }) => { - const container = document.createElement('div'); - container.innerHTML = ` +const renderCheckbox = ({ label = 'Bananas', indeterminate }) => { + const container = createSkeletonContainer( + `