@popsure/dirty-swan 0.66.21 → 0.66.23
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/dist/cjs/index.js +30 -20
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/lib/components/table/Table.stories.d.ts +4 -0
- package/dist/cjs/lib/components/table/components/TableCell/BaseCell/BaseCell.d.ts +1 -1
- package/dist/esm/components/comparisonTable/components/AccordionItem/AccordionItem.js +1 -1
- package/dist/esm/components/comparisonTable/components/Row/index.js +1 -1
- package/dist/esm/components/table/Table.stories.js +134 -1
- package/dist/esm/components/table/Table.stories.js.map +1 -1
- package/dist/esm/components/table/components/TableCell/BaseCell/BaseCell.js +1 -1
- package/dist/esm/components/table/components/TableCell/BaseCell/BaseCell.js.map +1 -1
- package/dist/esm/components/table/components/TableCell/TableCell.js +4 -5
- package/dist/esm/components/table/components/TableCell/TableCell.js.map +1 -1
- package/dist/esm/components/table/components/TableCell/TableCell.test.js +14 -0
- package/dist/esm/components/table/components/TableCell/TableCell.test.js.map +1 -1
- package/dist/esm/components/table/components/TableContents/Collapsible.js +23 -12
- package/dist/esm/components/table/components/TableContents/Collapsible.js.map +1 -1
- package/dist/esm/lib/components/table/Table.stories.d.ts +4 -0
- package/dist/esm/lib/components/table/components/TableCell/BaseCell/BaseCell.d.ts +1 -1
- package/package.json +1 -1
- package/src/lib/components/comparisonTable/components/AccordionItem/AccordionItem.module.scss +0 -5
- package/src/lib/components/comparisonTable/components/Row/style.module.scss +1 -5
- package/src/lib/components/table/Table.stories.tsx +158 -0
- package/src/lib/components/table/components/TableCell/BaseCell/BaseCell.tsx +10 -1
- package/src/lib/components/table/components/TableCell/TableCell.module.scss +4 -0
- package/src/lib/components/table/components/TableCell/TableCell.test.tsx +18 -0
- package/src/lib/components/table/components/TableCell/TableCell.tsx +3 -3
- package/src/lib/components/table/components/TableContents/Collapsible.tsx +23 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableCell.js","sources":["../../../../../../../src/lib/components/table/components/TableCell/TableCell.tsx"],"sourcesContent":["import classNames from 'classnames';\n\nimport styles from './TableCell.module.scss';\nimport { BaseCell } from './BaseCell/BaseCell';\nimport { TableCellData } from '../../types';\nimport { CTACell } from './CTACell/CTACell';\nimport { CardCell } from './CardCell/CardCell';\nimport { ButtonCell } from './ButtonCell/ButtonCell';\nimport React from 'react';\n\ntype ExtraTableCellProps = {\n isHeader?: boolean;\n isFirstCellInRow?: boolean;\n isTopLeftCell?: boolean;\n isNavigation?: boolean;\n isSelectedColumn?: boolean;\n selectedColumnPosition?: 'top' | 'bottom' | 'middle';\n imageComponent?: (args: any) => JSX.Element;\n isBelowDesktop?: boolean;\n};\n\nexport type TableCellProps = TableCellData & ExtraTableCellProps;\n\nconst TableCell = React.memo(\n ({\n isFirstCellInRow = false,\n isHeader = false,\n isNavigation = false,\n isSelectedColumn = false,\n selectedColumnPosition,\n isTopLeftCell = false,\n colSpan = 0,\n isBelowDesktop,\n ...cellProps\n }: TableCellProps) => {\n // prettier-ignore\n const Tag = isNavigation\n ? 'div'\n : isHeader || isFirstCellInRow ? 'th' : 'td';\n\n // prettier-ignore\n const thScope = isHeader\n ? 'col'\n : isFirstCellInRow ? 'row' : undefined;\n\n const scope = {\n scope: thScope,\n };\n\n return (\n <Tag\n {...scope}\n className={classNames(isSelectedColumn ? 'bg-orange-50' : 'bg-white', styles.th, {\n 'ta-left': isFirstCellInRow,\n [styles.headerCell]: isHeader,\n [styles.thNavigation]: isNavigation,\n [styles.navigationTitle]: isNavigation && isTopLeftCell,\n [styles.fixedCell]: isFirstCellInRow && colSpan < 1 ,\n [styles.fixedCard]: cellProps.type === 'CARD',\n [styles.selectedColumnTop]: selectedColumnPosition === 'top',\n [styles.selectedColumnBottom]: selectedColumnPosition === 'bottom',\n })}\n colSpan={isBelowDesktop && cellProps.type === 'CARD' ? 2 : colSpan}\n >\n {!cellProps.type && (\n <BaseCell\n {...cellProps}\n fontVariant={\n isTopLeftCell
|
|
1
|
+
{"version":3,"file":"TableCell.js","sources":["../../../../../../../src/lib/components/table/components/TableCell/TableCell.tsx"],"sourcesContent":["import classNames from 'classnames';\n\nimport styles from './TableCell.module.scss';\nimport { BaseCell } from './BaseCell/BaseCell';\nimport { TableCellData } from '../../types';\nimport { CTACell } from './CTACell/CTACell';\nimport { CardCell } from './CardCell/CardCell';\nimport { ButtonCell } from './ButtonCell/ButtonCell';\nimport React from 'react';\n\ntype ExtraTableCellProps = {\n isHeader?: boolean;\n isFirstCellInRow?: boolean;\n isTopLeftCell?: boolean;\n isNavigation?: boolean;\n isSelectedColumn?: boolean;\n selectedColumnPosition?: 'top' | 'bottom' | 'middle';\n imageComponent?: (args: any) => JSX.Element;\n isBelowDesktop?: boolean;\n};\n\nexport type TableCellProps = TableCellData & ExtraTableCellProps;\n\nconst TableCell = React.memo(\n ({\n isFirstCellInRow = false,\n isHeader = false,\n isNavigation = false,\n isSelectedColumn = false,\n selectedColumnPosition,\n isTopLeftCell = false,\n colSpan = 0,\n isBelowDesktop,\n ...cellProps\n }: TableCellProps) => {\n // prettier-ignore\n const Tag = isNavigation\n ? 'div'\n : isHeader || isFirstCellInRow ? 'th' : 'td';\n\n // prettier-ignore\n const thScope = isHeader\n ? 'col'\n : isFirstCellInRow ? 'row' : undefined;\n\n const scope = {\n scope: thScope,\n };\n\n return (\n <Tag\n {...scope}\n className={classNames(isSelectedColumn ? 'bg-orange-50' : 'bg-white', styles.th, {\n 'ta-left': isFirstCellInRow,\n [styles.headerCell]: isHeader,\n [styles.subtitleCell]:\n !cellProps.type && cellProps.fontVariant === 'SUBTITLE',\n [styles.thNavigation]: isNavigation,\n [styles.navigationTitle]: isNavigation && isTopLeftCell,\n [styles.fixedCell]: isFirstCellInRow && colSpan < 1 ,\n [styles.fixedCard]: cellProps.type === 'CARD',\n [styles.selectedColumnTop]: selectedColumnPosition === 'top',\n [styles.selectedColumnBottom]: selectedColumnPosition === 'bottom',\n })}\n colSpan={isBelowDesktop && cellProps.type === 'CARD' ? 2 : colSpan}\n >\n {!cellProps.type && (\n <BaseCell\n {...cellProps}\n fontVariant={\n cellProps.fontVariant ?? (isTopLeftCell ? 'TITLE' : 'NORMAL')\n }\n />\n )}\n {cellProps.type === 'CTA' && (\n <CTACell {...cellProps} centered={isNavigation} />\n )}\n {cellProps.type === 'BUTTON' && <ButtonCell {...cellProps} />}\n {cellProps.type === 'CARD' && <CardCell {...cellProps} />}\n </Tag>\n );\n }\n);\n\nexport { TableCell };\n"],"names":["React","_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -86,5 +86,19 @@ describe('TableCell', function () {
|
|
|
86
86
|
title: '',
|
|
87
87
|
});
|
|
88
88
|
});
|
|
89
|
+
it('renders the top left cell as a title by default', function () {
|
|
90
|
+
setup({ isTopLeftCell: true, text: 'Choose a plan' });
|
|
91
|
+
expect(screen.getByText('Choose a plan')).toHaveClass('p-h2');
|
|
92
|
+
});
|
|
93
|
+
it('lets fontVariant override the top left cell title', function () {
|
|
94
|
+
setup({
|
|
95
|
+
isTopLeftCell: true,
|
|
96
|
+
fontVariant: 'SUBTITLE',
|
|
97
|
+
text: 'Choose a plan',
|
|
98
|
+
});
|
|
99
|
+
var cellText = screen.getByText('Choose a plan');
|
|
100
|
+
expect(cellText).toHaveClass('p-h4');
|
|
101
|
+
expect(cellText).not.toHaveClass('p-h2');
|
|
102
|
+
});
|
|
89
103
|
});
|
|
90
104
|
//# sourceMappingURL=TableCell.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableCell.test.js","sources":["../../../../../../../src/lib/components/table/components/TableCell/TableCell.test.tsx"],"sourcesContent":["import { render, screen } from '../../../../util/testUtils';\nimport { TableCell, TableCellProps } from './TableCell';\n\nconst openModal = jest.fn();\n\nconst setup = ({ isNavigation, ...rest }: TableCellProps = {}) =>\n render(\n isNavigation ? (\n <TableCell {...rest} isNavigation />\n ) : (\n <table>\n <tbody>\n <tr>\n <TableCell {...rest} />\n </tr>\n </tbody>\n </table>\n )\n );\n\ndescribe('TableCell', () => {\n it('renders the component with boolean true', () => {\n setup({ checkmarkValue: true });\n\n expect(screen.getByTitle('Yes')).toBeInTheDocument();\n expect(screen.getByTestId('table-cell-boolean-yes')).toBeInTheDocument();\n });\n\n it('renders the component with boolean false', () => {\n setup({ checkmarkValue: false });\n\n expect(screen.getByTitle('No')).toBeInTheDocument();\n expect(screen.getByTestId('table-cell-boolean-no')).toBeInTheDocument();\n });\n\n it('renders the component without boolean', () => {\n setup();\n\n expect(screen.queryByTitle('Yes')).not.toBeInTheDocument();\n expect(screen.queryByTitle('No')).not.toBeInTheDocument();\n expect(\n screen.queryByTestId('table-cell-boolean-yes')\n ).not.toBeInTheDocument();\n expect(\n screen.queryByTestId('table-cell-boolean-no')\n ).not.toBeInTheDocument();\n });\n\n it('renders the component with rating', () => {\n setup({ rating: { type: 'star', value: 2 } });\n\n expect(screen.getByTitle('2 out of 3')).toBeInTheDocument();\n });\n\n it('renders the component without rating', () => {\n setup();\n\n expect(screen.queryByTestId('table-cell-rating')).not.toBeInTheDocument();\n });\n\n it('renders the component with text', () => {\n setup({ text: 'Sample text' });\n\n expect(screen.getByText('Sample text')).toBeInTheDocument();\n });\n\n it('renders the component without text', () => {\n setup();\n\n expect(screen.queryByTestId('table-cell-text')).not.toBeInTheDocument();\n });\n\n it('renders the component without info', () => {\n setup();\n\n expect(screen.queryByText('View more info')).not.toBeInTheDocument();\n });\n\n it('calls openModal when info button is clicked', () => {\n setup({ modalContent: 'Additional information', openModal });\n\n // Click info button\n screen.getByTestId('ds-table-info-button').click();\n\n // Assert openModal is called with info prop\n expect(openModal).toHaveBeenCalledWith({\n body: 'Additional information',\n title: '',\n });\n });\n});\n"],"names":["render","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TableCell.test.js","sources":["../../../../../../../src/lib/components/table/components/TableCell/TableCell.test.tsx"],"sourcesContent":["import { render, screen } from '../../../../util/testUtils';\nimport { TableCell, TableCellProps } from './TableCell';\n\nconst openModal = jest.fn();\n\nconst setup = ({ isNavigation, ...rest }: TableCellProps = {}) =>\n render(\n isNavigation ? (\n <TableCell {...rest} isNavigation />\n ) : (\n <table>\n <tbody>\n <tr>\n <TableCell {...rest} />\n </tr>\n </tbody>\n </table>\n )\n );\n\ndescribe('TableCell', () => {\n it('renders the component with boolean true', () => {\n setup({ checkmarkValue: true });\n\n expect(screen.getByTitle('Yes')).toBeInTheDocument();\n expect(screen.getByTestId('table-cell-boolean-yes')).toBeInTheDocument();\n });\n\n it('renders the component with boolean false', () => {\n setup({ checkmarkValue: false });\n\n expect(screen.getByTitle('No')).toBeInTheDocument();\n expect(screen.getByTestId('table-cell-boolean-no')).toBeInTheDocument();\n });\n\n it('renders the component without boolean', () => {\n setup();\n\n expect(screen.queryByTitle('Yes')).not.toBeInTheDocument();\n expect(screen.queryByTitle('No')).not.toBeInTheDocument();\n expect(\n screen.queryByTestId('table-cell-boolean-yes')\n ).not.toBeInTheDocument();\n expect(\n screen.queryByTestId('table-cell-boolean-no')\n ).not.toBeInTheDocument();\n });\n\n it('renders the component with rating', () => {\n setup({ rating: { type: 'star', value: 2 } });\n\n expect(screen.getByTitle('2 out of 3')).toBeInTheDocument();\n });\n\n it('renders the component without rating', () => {\n setup();\n\n expect(screen.queryByTestId('table-cell-rating')).not.toBeInTheDocument();\n });\n\n it('renders the component with text', () => {\n setup({ text: 'Sample text' });\n\n expect(screen.getByText('Sample text')).toBeInTheDocument();\n });\n\n it('renders the component without text', () => {\n setup();\n\n expect(screen.queryByTestId('table-cell-text')).not.toBeInTheDocument();\n });\n\n it('renders the component without info', () => {\n setup();\n\n expect(screen.queryByText('View more info')).not.toBeInTheDocument();\n });\n\n it('calls openModal when info button is clicked', () => {\n setup({ modalContent: 'Additional information', openModal });\n\n // Click info button\n screen.getByTestId('ds-table-info-button').click();\n\n // Assert openModal is called with info prop\n expect(openModal).toHaveBeenCalledWith({\n body: 'Additional information',\n title: '',\n });\n });\n\n it('renders the top left cell as a title by default', () => {\n setup({ isTopLeftCell: true, text: 'Choose a plan' });\n\n expect(screen.getByText('Choose a plan')).toHaveClass('p-h2');\n });\n\n it('lets fontVariant override the top left cell title', () => {\n setup({\n isTopLeftCell: true,\n fontVariant: 'SUBTITLE',\n text: 'Choose a plan',\n });\n\n const cellText = screen.getByText('Choose a plan');\n expect(cellText).toHaveClass('p-h4');\n expect(cellText).not.toHaveClass('p-h2');\n });\n});\n"],"names":["render","_jsx"],"mappings":"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"}
|
|
@@ -8,6 +8,18 @@ var css_248z = ".Collapsible-module_collapsible__2wWKs {\n display: flow-root;\
|
|
|
8
8
|
var styles = {"collapsible":"Collapsible-module_collapsible__2wWKs"};
|
|
9
9
|
styleInject(css_248z);
|
|
10
10
|
|
|
11
|
+
var measureHeight = function (element) {
|
|
12
|
+
var height = 0;
|
|
13
|
+
for (var _i = 0, _a = Array.from(element.children); _i < _a.length; _i++) {
|
|
14
|
+
var child = _a[_i];
|
|
15
|
+
var childStyles = getComputedStyle(child);
|
|
16
|
+
height +=
|
|
17
|
+
child.getBoundingClientRect().height +
|
|
18
|
+
(parseFloat(childStyles.marginTop) || 0) +
|
|
19
|
+
(parseFloat(childStyles.marginBottom) || 0);
|
|
20
|
+
}
|
|
21
|
+
return Math.ceil(height);
|
|
22
|
+
};
|
|
11
23
|
var Collapsible = function (_a) {
|
|
12
24
|
var _b;
|
|
13
25
|
var children = _a.children, isExpanded = _a.isExpanded, onTransitionEnd = _a.onTransitionEnd;
|
|
@@ -16,24 +28,23 @@ var Collapsible = function (_a) {
|
|
|
16
28
|
var containerRef = useRef(null);
|
|
17
29
|
useEffect(function () {
|
|
18
30
|
if (!observerRef.current) {
|
|
19
|
-
observerRef.current = new ResizeObserver(function (
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
});
|
|
31
|
+
observerRef.current = new ResizeObserver(function () {
|
|
32
|
+
if (containerRef.current) {
|
|
33
|
+
setHeight(measureHeight(containerRef.current));
|
|
34
|
+
}
|
|
24
35
|
});
|
|
25
36
|
}
|
|
26
37
|
if (containerRef.current) {
|
|
27
38
|
observerRef.current.observe(containerRef.current);
|
|
28
|
-
|
|
29
|
-
|
|
39
|
+
Array.from(containerRef.current.children).forEach(function (child) {
|
|
40
|
+
var _a;
|
|
41
|
+
(_a = observerRef.current) === null || _a === void 0 ? void 0 : _a.observe(child);
|
|
42
|
+
});
|
|
43
|
+
setHeight(measureHeight(containerRef.current));
|
|
30
44
|
}
|
|
31
45
|
return function () {
|
|
32
|
-
var _a
|
|
33
|
-
|
|
34
|
-
(_a = observerRef.current) === null || _a === void 0 ? void 0 : _a.unobserve(containerRef.current);
|
|
35
|
-
}
|
|
36
|
-
(_b = observerRef.current) === null || _b === void 0 ? void 0 : _b.disconnect();
|
|
46
|
+
var _a;
|
|
47
|
+
(_a = observerRef.current) === null || _a === void 0 ? void 0 : _a.disconnect();
|
|
37
48
|
};
|
|
38
49
|
}, [containerRef.current]);
|
|
39
50
|
return (jsx("div", { className: classNames(styles.collapsible, (_b = {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Collapsible.js","sources":["../../../../../../../src/lib/components/table/components/TableContents/Collapsible.tsx"],"sourcesContent":["import { ReactNode, useEffect, useRef, useState } from 'react';\nimport styles from './Collapsible.module.scss';\nimport classNames from 'classnames';\ninterface CollapsibleProps {\n children: ReactNode;\n isExpanded?: boolean;\n onTransitionEnd?: () => void;\n}\n\nexport const Collapsible = ({ children, isExpanded, onTransitionEnd }: CollapsibleProps) => {\n const [height, setHeight] = useState<number | undefined>();\n\n const observerRef = useRef<ResizeObserver | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!observerRef.current) {\n observerRef.current = new ResizeObserver((
|
|
1
|
+
{"version":3,"file":"Collapsible.js","sources":["../../../../../../../src/lib/components/table/components/TableContents/Collapsible.tsx"],"sourcesContent":["import { ReactNode, useEffect, useRef, useState } from 'react';\nimport styles from './Collapsible.module.scss';\nimport classNames from 'classnames';\ninterface CollapsibleProps {\n children: ReactNode;\n isExpanded?: boolean;\n onTransitionEnd?: () => void;\n}\n\nconst measureHeight = (element: Element) => {\n let height = 0;\n\n for (const child of Array.from(element.children)) {\n const childStyles = getComputedStyle(child);\n\n height +=\n child.getBoundingClientRect().height +\n (parseFloat(childStyles.marginTop) || 0) +\n (parseFloat(childStyles.marginBottom) || 0);\n }\n\n return Math.ceil(height);\n};\n\nexport const Collapsible = ({ children, isExpanded, onTransitionEnd }: CollapsibleProps) => {\n const [height, setHeight] = useState<number | undefined>();\n\n const observerRef = useRef<ResizeObserver | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!observerRef.current) {\n observerRef.current = new ResizeObserver(() => {\n if (containerRef.current) {\n setHeight(measureHeight(containerRef.current));\n }\n });\n }\n if (containerRef.current) {\n observerRef.current.observe(containerRef.current);\n Array.from(containerRef.current.children).forEach((child) => {\n observerRef.current?.observe(child);\n });\n setHeight(measureHeight(containerRef.current));\n }\n\n return () => {\n observerRef.current?.disconnect();\n };\n }, [containerRef.current]);\n\n return (\n <div\n className={classNames(styles.collapsible, {\n [styles.hideDelayed]: !isExpanded,\n })}\n ref={containerRef}\n style={{\n maxHeight: isExpanded ? height : '0px',\n }}\n onTransitionEnd={isExpanded ? onTransitionEnd : undefined}\n >\n {children}\n </div>\n );\n};\n"],"names":["_jsx"],"mappings":";;;;;;;;;;AASA,IAAM,aAAa,GAAG,UAAC,OAAgB,EAAA;IACrC,IAAI,MAAM,GAAG,CAAC;AAEd,IAAA,KAAoB,UAA4B,EAA5B,EAAA,GAAA,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAA5B,EAAA,GAAA,EAAA,CAAA,MAA4B,EAA5B,EAAA,EAA4B,EAAE;AAA7C,QAAA,IAAM,KAAK,GAAA,EAAA,CAAA,EAAA,CAAA;AACd,QAAA,IAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC;QAE3C,MAAM;AACJ,YAAA,KAAK,CAAC,qBAAqB,EAAE,CAAC,MAAM;iBACnC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;iBACvC,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/C;AAEA,IAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AAC1B,CAAC;AAEM,IAAM,WAAW,GAAG,UAAC,EAA2D,EAAA;;AAAzD,IAAA,IAAA,QAAQ,cAAA,EAAE,UAAU,GAAA,EAAA,CAAA,UAAA,EAAE,eAAe,GAAA,EAAA,CAAA,eAAA;IAC3D,IAAA,EAAA,GAAsB,QAAQ,EAAsB,EAAnD,MAAM,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,SAAS,GAAA,EAAA,CAAA,CAAA,CAAkC;AAE1D,IAAA,IAAM,WAAW,GAAG,MAAM,CAAwB,IAAI,CAAC;AACvD,IAAA,IAAM,YAAY,GAAG,MAAM,CAAwB,IAAI,CAAC;AAExD,IAAA,SAAS,CAAC,YAAA;AACR,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AACxB,YAAA,WAAW,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,YAAA;AACvC,gBAAA,IAAI,YAAY,CAAC,OAAO,EAAE;oBACxB,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAChD;AACF,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,IAAI,YAAY,CAAC,OAAO,EAAE;YACxB,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;AACjD,YAAA,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,UAAC,KAAK,EAAA;;gBACtD,CAAA,EAAA,GAAA,WAAW,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,OAAO,CAAC,KAAK,CAAC;AACrC,YAAA,CAAC,CAAC;YACF,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAChD;QAEA,OAAO,YAAA;;AACL,YAAA,CAAA,EAAA,GAAA,WAAW,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,UAAU,EAAE;AACnC,QAAA,CAAC;AACH,IAAA,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAE1B,QACEA,aACE,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,WAAW,GAAA,EAAA,GAAA,EAAA;AACtC,YAAA,EAAA,CAAC,MAAM,CAAC,WAAW,CAAA,GAAG,CAAC,UAAU;AACjC,YAAA,EAAA,EAAA,EACF,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE;YACL,SAAS,EAAE,UAAU,GAAG,MAAM,GAAG,KAAK;AACvC,SAAA,EACD,eAAe,EAAE,UAAU,GAAG,eAAe,GAAG,SAAS,EAAA,QAAA,EAExD,QAAQ,EAAA,CACL;AAEV;;;;"}
|
|
@@ -95,6 +95,10 @@ export declare const TwoPlanQuote: {
|
|
|
95
95
|
render: () => JSX.Element;
|
|
96
96
|
name: string;
|
|
97
97
|
};
|
|
98
|
+
export declare const PlanDetailsQuote: {
|
|
99
|
+
render: () => JSX.Element;
|
|
100
|
+
name: string;
|
|
101
|
+
};
|
|
98
102
|
export declare const ThreePlanQuoteWebsite: {
|
|
99
103
|
render: () => JSX.Element;
|
|
100
104
|
name: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
import { ModalFunction } from '../../../types';
|
|
3
|
-
export type FontVariant = 'NORMAL' | 'TITLE' | 'PRICE';
|
|
3
|
+
export type FontVariant = 'NORMAL' | 'TITLE' | 'SUBTITLE' | 'PRICE';
|
|
4
4
|
export type Alignment = 'center' | 'left' | 'right';
|
|
5
5
|
export type BaseCellProps = {
|
|
6
6
|
align?: Alignment;
|
package/package.json
CHANGED
package/src/lib/components/comparisonTable/components/AccordionItem/AccordionItem.module.scss
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
@use '../../../../scss/public/colors' as colors;
|
|
2
|
-
@use '../../../../scss/public/grid' as *;
|
|
3
2
|
|
|
4
3
|
.container {
|
|
5
4
|
width: var(--growContent, min-content);
|
|
@@ -34,10 +33,6 @@
|
|
|
34
33
|
text-align: inherit;
|
|
35
34
|
transition: color 0.3s ease-in-out, transform 0.2s ease-in-out;
|
|
36
35
|
|
|
37
|
-
@include p-size-tablet {
|
|
38
|
-
padding: 24px;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
36
|
&[aria-expanded='true'] {
|
|
42
37
|
border-bottom-color: transparent;
|
|
43
38
|
}
|
|
@@ -54,10 +54,6 @@ $cell-min-width: var(--cellWidth, 211px); // 195 + 16px
|
|
|
54
54
|
|
|
55
55
|
&:first-child {
|
|
56
56
|
padding: 16px 8px 16px 0;
|
|
57
|
-
|
|
58
|
-
@include p-size-tablet {
|
|
59
|
-
padding: 16px 8px 16px 16px;
|
|
60
|
-
}
|
|
61
57
|
}
|
|
62
58
|
|
|
63
59
|
color: $ds-neutral-900;
|
|
@@ -83,7 +79,7 @@ $cell-min-width: var(--cellWidth, 211px); // 195 + 16px
|
|
|
83
79
|
flex: 1 0 $cell-min-width;
|
|
84
80
|
width: $cell-min-width;
|
|
85
81
|
&:first-child {
|
|
86
|
-
padding: 24px 8px 24px
|
|
82
|
+
padding: 24px 8px 24px 0;
|
|
87
83
|
}
|
|
88
84
|
|
|
89
85
|
padding: 24px 8px;
|
|
@@ -830,6 +830,164 @@ export const TwoPlanQuote = {
|
|
|
830
830
|
name: 'Two Plan Quote',
|
|
831
831
|
};
|
|
832
832
|
|
|
833
|
+
const getPlanDetailsData = (
|
|
834
|
+
selectedPlan: number,
|
|
835
|
+
setSelectedPlan: (plan: number) => void
|
|
836
|
+
): TableData => [
|
|
837
|
+
{
|
|
838
|
+
rows: [
|
|
839
|
+
[
|
|
840
|
+
{ text: 'Choose plan', fontVariant: 'SUBTITLE' },
|
|
841
|
+
{
|
|
842
|
+
type: 'BUTTON',
|
|
843
|
+
buttonCaption: 'Basic',
|
|
844
|
+
price: '€99/mo',
|
|
845
|
+
isSelected: selectedPlan === 1,
|
|
846
|
+
onClick: () => setSelectedPlan(1),
|
|
847
|
+
},
|
|
848
|
+
{
|
|
849
|
+
type: 'BUTTON',
|
|
850
|
+
buttonCaption: 'Advanced',
|
|
851
|
+
price: '€150/mo',
|
|
852
|
+
isSelected: selectedPlan === 2,
|
|
853
|
+
onClick: () => setSelectedPlan(2),
|
|
854
|
+
},
|
|
855
|
+
],
|
|
856
|
+
[
|
|
857
|
+
{
|
|
858
|
+
text: "General doctors' visits",
|
|
859
|
+
modalContent: 'Visits to general practitioners are covered in full.',
|
|
860
|
+
},
|
|
861
|
+
{ text: 'Up to €2 million' },
|
|
862
|
+
{ text: 'Up to €2 million' },
|
|
863
|
+
],
|
|
864
|
+
[
|
|
865
|
+
{
|
|
866
|
+
text: 'Specialists',
|
|
867
|
+
modalContent: 'Specialist visits are covered with a referral.',
|
|
868
|
+
},
|
|
869
|
+
{ text: '4 visits per year' },
|
|
870
|
+
{ text: 'Unlimited visits' },
|
|
871
|
+
],
|
|
872
|
+
[
|
|
873
|
+
{ text: 'Documents (not in a safe)' },
|
|
874
|
+
{ text: '20% of the insured sum', description: 'max €3,000' },
|
|
875
|
+
{ text: '30% of the insured sum', description: 'max €5,000' },
|
|
876
|
+
],
|
|
877
|
+
],
|
|
878
|
+
},
|
|
879
|
+
{
|
|
880
|
+
section: {
|
|
881
|
+
title: 'Theft, fraud and robberies',
|
|
882
|
+
},
|
|
883
|
+
rows: [
|
|
884
|
+
[
|
|
885
|
+
{ text: 'Burglary and vandalism' },
|
|
886
|
+
{ checkmarkValue: true },
|
|
887
|
+
{ checkmarkValue: true },
|
|
888
|
+
],
|
|
889
|
+
[
|
|
890
|
+
{ text: 'Valuables in bank safe deposits' },
|
|
891
|
+
{ text: '5% of the insured sum' },
|
|
892
|
+
{ text: '30% of the insured sum' },
|
|
893
|
+
],
|
|
894
|
+
[
|
|
895
|
+
{ text: 'Credit card misuse', description: 'E.g. after a robbery' },
|
|
896
|
+
{ checkmarkValue: false },
|
|
897
|
+
{ text: '€1,500', description: 'with a €150 deductible' },
|
|
898
|
+
],
|
|
899
|
+
],
|
|
900
|
+
},
|
|
901
|
+
{
|
|
902
|
+
section: {
|
|
903
|
+
title: 'Damage protection',
|
|
904
|
+
},
|
|
905
|
+
rows: [
|
|
906
|
+
[
|
|
907
|
+
{ text: 'Weather damage', description: 'Rain, storm, hail or snow' },
|
|
908
|
+
{ checkmarkValue: true },
|
|
909
|
+
{ checkmarkValue: true },
|
|
910
|
+
],
|
|
911
|
+
[
|
|
912
|
+
{
|
|
913
|
+
text: 'Weather damage due to negligence',
|
|
914
|
+
description: 'E.g. belongings damaged due to windows left open',
|
|
915
|
+
},
|
|
916
|
+
{ checkmarkValue: false },
|
|
917
|
+
{ text: '€5,000', description: 'with a €500 deductible' },
|
|
918
|
+
],
|
|
919
|
+
[
|
|
920
|
+
{ text: 'Rainwater pipe leaks (within building)' },
|
|
921
|
+
{ checkmarkValue: false },
|
|
922
|
+
{ checkmarkValue: true },
|
|
923
|
+
],
|
|
924
|
+
],
|
|
925
|
+
},
|
|
926
|
+
{
|
|
927
|
+
section: {
|
|
928
|
+
title: 'Loss & replacement',
|
|
929
|
+
},
|
|
930
|
+
rows: [
|
|
931
|
+
[
|
|
932
|
+
{ text: 'Luggage while travelling' },
|
|
933
|
+
{ text: 'Up to €2,000' },
|
|
934
|
+
{ text: 'Up to €5,000' },
|
|
935
|
+
],
|
|
936
|
+
[
|
|
937
|
+
{ text: 'Keys and locks', modalContent: 'Replacement of home keys and locks after theft.' },
|
|
938
|
+
{ checkmarkValue: true },
|
|
939
|
+
{ checkmarkValue: true },
|
|
940
|
+
],
|
|
941
|
+
],
|
|
942
|
+
},
|
|
943
|
+
{
|
|
944
|
+
section: {
|
|
945
|
+
title: 'Accommodation & relocation costs',
|
|
946
|
+
},
|
|
947
|
+
rows: [
|
|
948
|
+
[
|
|
949
|
+
{ text: 'Hotel costs', description: 'If your home is uninhabitable' },
|
|
950
|
+
{ text: 'Up to 100 days' },
|
|
951
|
+
{ text: 'Up to 200 days' },
|
|
952
|
+
],
|
|
953
|
+
[
|
|
954
|
+
{ text: 'Relocation costs' },
|
|
955
|
+
{ checkmarkValue: false },
|
|
956
|
+
{ checkmarkValue: true },
|
|
957
|
+
],
|
|
958
|
+
],
|
|
959
|
+
},
|
|
960
|
+
];
|
|
961
|
+
|
|
962
|
+
const PlanDetailsQuoteStory = () => {
|
|
963
|
+
const [selectedPlan, setSelectedPlan] = useState(1);
|
|
964
|
+
|
|
965
|
+
return (
|
|
966
|
+
<div style={{ maxWidth: 900 }}>
|
|
967
|
+
<p className="p-p tc-neutral-500 mb16">
|
|
968
|
+
Plan details table from the Sign-Ups designs: SUBTITLE top left cell,
|
|
969
|
+
plan selection buttons, selected column highlight, collapsible sections,
|
|
970
|
+
checkmarks, values with descriptions, and info modals.
|
|
971
|
+
</p>
|
|
972
|
+
<Table
|
|
973
|
+
tableData={getPlanDetailsData(selectedPlan, setSelectedPlan)}
|
|
974
|
+
title="Plan details"
|
|
975
|
+
collapsibleSections
|
|
976
|
+
showSelectedColumn
|
|
977
|
+
activeSection={selectedPlan}
|
|
978
|
+
onSelectionChanged={setSelectedPlan}
|
|
979
|
+
mobileNavigationMode="tabs"
|
|
980
|
+
/>
|
|
981
|
+
</div>
|
|
982
|
+
);
|
|
983
|
+
};
|
|
984
|
+
|
|
985
|
+
export const PlanDetailsQuote = {
|
|
986
|
+
render: () => <PlanDetailsQuoteStory />,
|
|
987
|
+
|
|
988
|
+
name: 'Plan Details - Quote',
|
|
989
|
+
};
|
|
990
|
+
|
|
833
991
|
const threePlanWebsiteData: TableData = [
|
|
834
992
|
{
|
|
835
993
|
rows: [
|
|
@@ -11,7 +11,7 @@ import { MiniProgressBar } from './MiniProgressBar/MiniProgressBar';
|
|
|
11
11
|
import { TableInfoButton } from '../../../../comparisonTable';
|
|
12
12
|
import { ModalFunction } from '../../../types';
|
|
13
13
|
|
|
14
|
-
export type FontVariant = 'NORMAL' | 'TITLE' | 'PRICE';
|
|
14
|
+
export type FontVariant = 'NORMAL' | 'TITLE' | 'SUBTITLE' | 'PRICE';
|
|
15
15
|
|
|
16
16
|
const progressLookup: Record<string, number> = {
|
|
17
17
|
'30%': 1,
|
|
@@ -157,6 +157,15 @@ export const BaseCell = ({
|
|
|
157
157
|
</h2>
|
|
158
158
|
)}
|
|
159
159
|
|
|
160
|
+
{text && fontVariant === 'SUBTITLE' && (
|
|
161
|
+
<h2
|
|
162
|
+
aria-hidden
|
|
163
|
+
className="tc-grey-800 p-h4"
|
|
164
|
+
>
|
|
165
|
+
{text}
|
|
166
|
+
</h2>
|
|
167
|
+
)}
|
|
168
|
+
|
|
160
169
|
{modalContent && openModal && (
|
|
161
170
|
<span className="ml8">
|
|
162
171
|
<TableInfoButton
|
|
@@ -88,4 +88,22 @@ describe('TableCell', () => {
|
|
|
88
88
|
title: '',
|
|
89
89
|
});
|
|
90
90
|
});
|
|
91
|
+
|
|
92
|
+
it('renders the top left cell as a title by default', () => {
|
|
93
|
+
setup({ isTopLeftCell: true, text: 'Choose a plan' });
|
|
94
|
+
|
|
95
|
+
expect(screen.getByText('Choose a plan')).toHaveClass('p-h2');
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('lets fontVariant override the top left cell title', () => {
|
|
99
|
+
setup({
|
|
100
|
+
isTopLeftCell: true,
|
|
101
|
+
fontVariant: 'SUBTITLE',
|
|
102
|
+
text: 'Choose a plan',
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const cellText = screen.getByText('Choose a plan');
|
|
106
|
+
expect(cellText).toHaveClass('p-h4');
|
|
107
|
+
expect(cellText).not.toHaveClass('p-h2');
|
|
108
|
+
});
|
|
91
109
|
});
|
|
@@ -53,6 +53,8 @@ const TableCell = React.memo(
|
|
|
53
53
|
className={classNames(isSelectedColumn ? 'bg-orange-50' : 'bg-white', styles.th, {
|
|
54
54
|
'ta-left': isFirstCellInRow,
|
|
55
55
|
[styles.headerCell]: isHeader,
|
|
56
|
+
[styles.subtitleCell]:
|
|
57
|
+
!cellProps.type && cellProps.fontVariant === 'SUBTITLE',
|
|
56
58
|
[styles.thNavigation]: isNavigation,
|
|
57
59
|
[styles.navigationTitle]: isNavigation && isTopLeftCell,
|
|
58
60
|
[styles.fixedCell]: isFirstCellInRow && colSpan < 1 ,
|
|
@@ -66,9 +68,7 @@ const TableCell = React.memo(
|
|
|
66
68
|
<BaseCell
|
|
67
69
|
{...cellProps}
|
|
68
70
|
fontVariant={
|
|
69
|
-
isTopLeftCell
|
|
70
|
-
? 'TITLE'
|
|
71
|
-
: cellProps.fontVariant ?? 'NORMAL'
|
|
71
|
+
cellProps.fontVariant ?? (isTopLeftCell ? 'TITLE' : 'NORMAL')
|
|
72
72
|
}
|
|
73
73
|
/>
|
|
74
74
|
)}
|
|
@@ -7,6 +7,21 @@ interface CollapsibleProps {
|
|
|
7
7
|
onTransitionEnd?: () => void;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
const measureHeight = (element: Element) => {
|
|
11
|
+
let height = 0;
|
|
12
|
+
|
|
13
|
+
for (const child of Array.from(element.children)) {
|
|
14
|
+
const childStyles = getComputedStyle(child);
|
|
15
|
+
|
|
16
|
+
height +=
|
|
17
|
+
child.getBoundingClientRect().height +
|
|
18
|
+
(parseFloat(childStyles.marginTop) || 0) +
|
|
19
|
+
(parseFloat(childStyles.marginBottom) || 0);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return Math.ceil(height);
|
|
23
|
+
};
|
|
24
|
+
|
|
10
25
|
export const Collapsible = ({ children, isExpanded, onTransitionEnd }: CollapsibleProps) => {
|
|
11
26
|
const [height, setHeight] = useState<number | undefined>();
|
|
12
27
|
|
|
@@ -15,24 +30,21 @@ export const Collapsible = ({ children, isExpanded, onTransitionEnd }: Collapsib
|
|
|
15
30
|
|
|
16
31
|
useEffect(() => {
|
|
17
32
|
if (!observerRef.current) {
|
|
18
|
-
observerRef.current = new ResizeObserver((
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
setHeight(scrollheight);
|
|
23
|
-
});
|
|
33
|
+
observerRef.current = new ResizeObserver(() => {
|
|
34
|
+
if (containerRef.current) {
|
|
35
|
+
setHeight(measureHeight(containerRef.current));
|
|
36
|
+
}
|
|
24
37
|
});
|
|
25
38
|
}
|
|
26
39
|
if (containerRef.current) {
|
|
27
40
|
observerRef.current.observe(containerRef.current);
|
|
28
|
-
|
|
29
|
-
|
|
41
|
+
Array.from(containerRef.current.children).forEach((child) => {
|
|
42
|
+
observerRef.current?.observe(child);
|
|
43
|
+
});
|
|
44
|
+
setHeight(measureHeight(containerRef.current));
|
|
30
45
|
}
|
|
31
46
|
|
|
32
47
|
return () => {
|
|
33
|
-
if (containerRef.current) {
|
|
34
|
-
observerRef.current?.unobserve(containerRef.current);
|
|
35
|
-
}
|
|
36
48
|
observerRef.current?.disconnect();
|
|
37
49
|
};
|
|
38
50
|
}, [containerRef.current]);
|