@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.
Files changed (27) hide show
  1. package/dist/cjs/index.js +30 -20
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/lib/components/table/Table.stories.d.ts +4 -0
  4. package/dist/cjs/lib/components/table/components/TableCell/BaseCell/BaseCell.d.ts +1 -1
  5. package/dist/esm/components/comparisonTable/components/AccordionItem/AccordionItem.js +1 -1
  6. package/dist/esm/components/comparisonTable/components/Row/index.js +1 -1
  7. package/dist/esm/components/table/Table.stories.js +134 -1
  8. package/dist/esm/components/table/Table.stories.js.map +1 -1
  9. package/dist/esm/components/table/components/TableCell/BaseCell/BaseCell.js +1 -1
  10. package/dist/esm/components/table/components/TableCell/BaseCell/BaseCell.js.map +1 -1
  11. package/dist/esm/components/table/components/TableCell/TableCell.js +4 -5
  12. package/dist/esm/components/table/components/TableCell/TableCell.js.map +1 -1
  13. package/dist/esm/components/table/components/TableCell/TableCell.test.js +14 -0
  14. package/dist/esm/components/table/components/TableCell/TableCell.test.js.map +1 -1
  15. package/dist/esm/components/table/components/TableContents/Collapsible.js +23 -12
  16. package/dist/esm/components/table/components/TableContents/Collapsible.js.map +1 -1
  17. package/dist/esm/lib/components/table/Table.stories.d.ts +4 -0
  18. package/dist/esm/lib/components/table/components/TableCell/BaseCell/BaseCell.d.ts +1 -1
  19. package/package.json +1 -1
  20. package/src/lib/components/comparisonTable/components/AccordionItem/AccordionItem.module.scss +0 -5
  21. package/src/lib/components/comparisonTable/components/Row/style.module.scss +1 -5
  22. package/src/lib/components/table/Table.stories.tsx +158 -0
  23. package/src/lib/components/table/components/TableCell/BaseCell/BaseCell.tsx +10 -1
  24. package/src/lib/components/table/components/TableCell/TableCell.module.scss +4 -0
  25. package/src/lib/components/table/components/TableCell/TableCell.test.tsx +18 -0
  26. package/src/lib/components/table/components/TableCell/TableCell.tsx +3 -3
  27. 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\n ? 'TITLE'\n : cellProps.fontVariant ?? '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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"}
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 (entries) {
20
- entries.forEach(function (entry) {
21
- var scrollheight = entry.target.scrollHeight;
22
- setHeight(scrollheight);
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
- var scrollheight = containerRef.current.scrollHeight;
29
- setHeight(scrollheight);
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, _b;
33
- if (containerRef.current) {
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((entries) => {\n entries.forEach((entry) => {\n const scrollheight = entry.target.scrollHeight;\n\n setHeight(scrollheight);\n });\n });\n }\n if (containerRef.current) {\n observerRef.current.observe(containerRef.current);\n const scrollheight = containerRef.current.scrollHeight;\n setHeight(scrollheight);\n }\n\n return () => {\n if (containerRef.current) {\n observerRef.current?.unobserve(containerRef.current);\n }\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":";;;;;;;;;;AASO,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,UAAC,OAAO,EAAA;AAC/C,gBAAA,OAAO,CAAC,OAAO,CAAC,UAAC,KAAK,EAAA;AACpB,oBAAA,IAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY;oBAE9C,SAAS,CAAC,YAAY,CAAC;AACzB,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,IAAI,YAAY,CAAC,OAAO,EAAE;YACxB,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;AACjD,YAAA,IAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY;YACtD,SAAS,CAAC,YAAY,CAAC;QACzB;QAEA,OAAO,YAAA;;AACL,YAAA,IAAI,YAAY,CAAC,OAAO,EAAE;gBACxB,CAAA,EAAA,GAAA,WAAW,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC;YACtD;AACA,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;;;;"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@popsure/dirty-swan",
3
- "version": "0.66.21",
3
+ "version": "0.66.23",
4
4
  "author": "Vincent Audoire <vincent@getpopsure.com>",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -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 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
@@ -31,6 +31,10 @@
31
31
  vertical-align: top;
32
32
  }
33
33
 
34
+ .subtitleCell {
35
+ vertical-align: middle;
36
+ }
37
+
34
38
  .fixedCell {
35
39
  position: sticky;
36
40
  left: 0;
@@ -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((entries) => {
19
- entries.forEach((entry) => {
20
- const scrollheight = entry.target.scrollHeight;
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
- const scrollheight = containerRef.current.scrollHeight;
29
- setHeight(scrollheight);
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]);