@apify/ui-library 1.132.1 → 1.133.0

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 (104) hide show
  1. package/dist/src/components/index.d.ts +1 -0
  2. package/dist/src/components/index.d.ts.map +1 -1
  3. package/dist/src/components/index.js +1 -0
  4. package/dist/src/components/index.js.map +1 -1
  5. package/dist/src/components/link.d.ts +3 -0
  6. package/dist/src/components/link.d.ts.map +1 -1
  7. package/dist/src/components/link.js +2 -2
  8. package/dist/src/components/link.js.map +1 -1
  9. package/dist/src/components/table/index.d.ts +17 -0
  10. package/dist/src/components/table/index.d.ts.map +1 -0
  11. package/dist/src/components/table/index.js +16 -0
  12. package/dist/src/components/table/index.js.map +1 -0
  13. package/dist/src/components/table/table.context.d.ts +3 -0
  14. package/dist/src/components/table/table.context.d.ts.map +1 -0
  15. package/dist/src/components/table/table.context.js +3 -0
  16. package/dist/src/components/table/table.context.js.map +1 -0
  17. package/dist/src/components/table/table.d.ts +3 -0
  18. package/dist/src/components/table/table.d.ts.map +1 -0
  19. package/dist/src/components/table/table.js +6 -0
  20. package/dist/src/components/table/table.js.map +1 -0
  21. package/dist/src/components/table/table.styled.d.ts +30 -0
  22. package/dist/src/components/table/table.styled.d.ts.map +1 -0
  23. package/dist/src/components/table/table.styled.js +194 -0
  24. package/dist/src/components/table/table.styled.js.map +1 -0
  25. package/dist/src/components/table/table_body.d.ts +3 -0
  26. package/dist/src/components/table/table_body.d.ts.map +1 -0
  27. package/dist/src/components/table/table_body.js +6 -0
  28. package/dist/src/components/table/table_body.js.map +1 -0
  29. package/dist/src/components/table/table_cell.d.ts +10 -0
  30. package/dist/src/components/table/table_cell.d.ts.map +1 -0
  31. package/dist/src/components/table/table_cell.js +18 -0
  32. package/dist/src/components/table/table_cell.js.map +1 -0
  33. package/dist/src/components/table/table_empty_row.d.ts +6 -0
  34. package/dist/src/components/table/table_empty_row.d.ts.map +1 -0
  35. package/dist/src/components/table/table_empty_row.js +5 -0
  36. package/dist/src/components/table/table_empty_row.js.map +1 -0
  37. package/dist/src/components/table/table_error_row.d.ts +7 -0
  38. package/dist/src/components/table/table_error_row.d.ts.map +1 -0
  39. package/dist/src/components/table/table_error_row.js +6 -0
  40. package/dist/src/components/table/table_error_row.js.map +1 -0
  41. package/dist/src/components/table/table_expansion_row.d.ts +10 -0
  42. package/dist/src/components/table/table_expansion_row.d.ts.map +1 -0
  43. package/dist/src/components/table/table_expansion_row.js +10 -0
  44. package/dist/src/components/table/table_expansion_row.js.map +1 -0
  45. package/dist/src/components/table/table_foot.d.ts +3 -0
  46. package/dist/src/components/table/table_foot.d.ts.map +1 -0
  47. package/dist/src/components/table/table_foot.js +6 -0
  48. package/dist/src/components/table/table_foot.js.map +1 -0
  49. package/dist/src/components/table/table_head.d.ts +3 -0
  50. package/dist/src/components/table/table_head.d.ts.map +1 -0
  51. package/dist/src/components/table/table_head.js +6 -0
  52. package/dist/src/components/table/table_head.js.map +1 -0
  53. package/dist/src/components/table/table_head_cell.d.ts +3 -0
  54. package/dist/src/components/table/table_head_cell.d.ts.map +1 -0
  55. package/dist/src/components/table/table_head_cell.js +6 -0
  56. package/dist/src/components/table/table_head_cell.js.map +1 -0
  57. package/dist/src/components/table/table_head_row.d.ts +3 -0
  58. package/dist/src/components/table/table_head_row.d.ts.map +1 -0
  59. package/dist/src/components/table/table_head_row.js +6 -0
  60. package/dist/src/components/table/table_head_row.js.map +1 -0
  61. package/dist/src/components/table/table_loading_row.d.ts +6 -0
  62. package/dist/src/components/table/table_loading_row.d.ts.map +1 -0
  63. package/dist/src/components/table/table_loading_row.js +6 -0
  64. package/dist/src/components/table/table_loading_row.js.map +1 -0
  65. package/dist/src/components/table/table_row.d.ts +4 -0
  66. package/dist/src/components/table/table_row.d.ts.map +1 -0
  67. package/dist/src/components/table/table_row.js +12 -0
  68. package/dist/src/components/table/table_row.js.map +1 -0
  69. package/dist/src/components/table/table_test_ids.d.ts +16 -0
  70. package/dist/src/components/table/table_test_ids.d.ts.map +1 -0
  71. package/dist/src/components/table/table_test_ids.js +16 -0
  72. package/dist/src/components/table/table_test_ids.js.map +1 -0
  73. package/dist/src/components/table/table_wrapper.d.ts +4 -0
  74. package/dist/src/components/table/table_wrapper.d.ts.map +1 -0
  75. package/dist/src/components/table/table_wrapper.js +49 -0
  76. package/dist/src/components/table/table_wrapper.js.map +1 -0
  77. package/dist/src/components/table/types.d.ts +21 -0
  78. package/dist/src/components/table/types.d.ts.map +1 -0
  79. package/dist/src/components/table/types.js +2 -0
  80. package/dist/src/components/table/types.js.map +1 -0
  81. package/dist/tsconfig.build.tsbuildinfo +1 -1
  82. package/package.json +3 -3
  83. package/src/components/index.ts +1 -0
  84. package/src/components/link.stories.tsx +12 -0
  85. package/src/components/link.tsx +9 -0
  86. package/src/components/table/index.ts +16 -0
  87. package/src/components/table/table.context.ts +5 -0
  88. package/src/components/table/table.stories.tsx +258 -0
  89. package/src/components/table/table.styled.ts +207 -0
  90. package/src/components/table/table.tsx +9 -0
  91. package/src/components/table/table_body.tsx +9 -0
  92. package/src/components/table/table_cell.tsx +28 -0
  93. package/src/components/table/table_empty_row.tsx +12 -0
  94. package/src/components/table/table_error_row.tsx +13 -0
  95. package/src/components/table/table_expansion_row.tsx +24 -0
  96. package/src/components/table/table_foot.tsx +9 -0
  97. package/src/components/table/table_head.tsx +9 -0
  98. package/src/components/table/table_head_cell.tsx +9 -0
  99. package/src/components/table/table_head_row.tsx +9 -0
  100. package/src/components/table/table_loading_row.tsx +13 -0
  101. package/src/components/table/table_row.tsx +30 -0
  102. package/src/components/table/table_test_ids.ts +15 -0
  103. package/src/components/table/table_wrapper.tsx +71 -0
  104. package/src/components/table/types.ts +24 -0
@@ -0,0 +1,9 @@
1
+ import clsx from 'clsx';
2
+ import type { FC, HTMLAttributes } from 'react';
3
+
4
+ import { tableClassNames } from './table.styled.js';
5
+ import { tableTestIds } from './table_test_ids.js';
6
+
7
+ export const TableHead: FC<HTMLAttributes<HTMLTableSectionElement>> = ({ className, ...rest }) => (
8
+ <thead data-test={tableTestIds.HEAD} className={clsx(tableClassNames.HEAD, className)} {...rest} />
9
+ );
@@ -0,0 +1,9 @@
1
+ import clsx from 'clsx';
2
+ import type { FC, ThHTMLAttributes } from 'react';
3
+
4
+ import { tableClassNames } from './table.styled.js';
5
+ import { tableTestIds } from './table_test_ids.js';
6
+
7
+ export const TableHeadCell: FC<ThHTMLAttributes<HTMLTableCellElement>> = ({ className, ...rest }) => (
8
+ <th data-test={tableTestIds.HEAD_CELL} className={clsx(tableClassNames.HEAD_CELL, className)} {...rest} />
9
+ );
@@ -0,0 +1,9 @@
1
+ import clsx from 'clsx';
2
+ import type { FC, HTMLAttributes } from 'react';
3
+
4
+ import { tableClassNames } from './table.styled.js';
5
+ import { tableTestIds } from './table_test_ids.js';
6
+
7
+ export const TableHeadRow: FC<HTMLAttributes<HTMLTableRowElement>> = ({ className, ...rest }) => (
8
+ <tr data-test={tableTestIds.HEAD_ROW} className={clsx(tableClassNames.HEAD_ROW, className)} {...rest} />
9
+ );
@@ -0,0 +1,13 @@
1
+ import type { FC, ReactNode } from 'react';
2
+
3
+ import { InlineSpinner } from '../spinner.js';
4
+ import { tableClassNames } from './table.styled.js';
5
+ import { tableTestIds } from './table_test_ids.js';
6
+
7
+ export const TableLoadingRow: FC<{ colSpan: number; children?: ReactNode }> = ({ colSpan, children }) => (
8
+ <tr data-test={tableTestIds.LOADING_ROW} className={tableClassNames.ROW_EMPTY}>
9
+ <td colSpan={colSpan} className={tableClassNames.ROW_EMPTY_CELL}>
10
+ {children ?? <InlineSpinner />}
11
+ </td>
12
+ </tr>
13
+ );
@@ -0,0 +1,30 @@
1
+ import clsx from 'clsx';
2
+ import type { FC } from 'react';
3
+
4
+ import { TableRowLinkContext } from './table.context.js';
5
+ import { tableClassNames } from './table.styled.js';
6
+ import { tableTestIds } from './table_test_ids.js';
7
+ import type { TableRowProps } from './types.js';
8
+
9
+ export const TableRow: FC<TableRowProps> = ({ className, clickable, expanded, to, ...rest }) => {
10
+ const row = (
11
+ <tr
12
+ data-test={tableTestIds.ROW}
13
+ className={clsx(
14
+ tableClassNames.BODY_ROW,
15
+ (clickable || to) && tableClassNames.BODY_ROW_CLICKABLE,
16
+ expanded && tableClassNames.BODY_ROW_EXPANDED,
17
+ className,
18
+ )}
19
+ {...rest}
20
+ />
21
+ );
22
+
23
+ if (!to) return row;
24
+
25
+ return (
26
+ <TableRowLinkContext.Provider value={to}>
27
+ {row}
28
+ </TableRowLinkContext.Provider>
29
+ );
30
+ };
@@ -0,0 +1,15 @@
1
+ export const tableTestIds = {
2
+ TABLE: 'Table-table',
3
+ HEAD: 'Table-head',
4
+ HEAD_ROW: 'Table-headRow',
5
+ HEAD_CELL: 'Table-headCell',
6
+ BODY: 'Table-body',
7
+ ROW: 'Table-row',
8
+ CELL: 'Table-cell',
9
+ FOOT: 'Table-foot',
10
+ WRAPPER: 'Table-wrapper',
11
+ EMPTY_ROW: 'Table-emptyRow',
12
+ LOADING_ROW: 'Table-loadingRow',
13
+ ERROR_ROW: 'Table-errorRow',
14
+ EXPANSION_ROW: 'Table-expansionRow',
15
+ };
@@ -0,0 +1,71 @@
1
+ import type { FC } from 'react';
2
+ import { useCallback, useEffect, useRef } from 'react';
3
+
4
+ import { Box } from '../box.js';
5
+ import {
6
+ StyledHorizontallyScrollableTableWrapper,
7
+ StyledTableFooterWrapper,
8
+ tableClassNames,
9
+ } from './table.styled.js';
10
+ import { tableTestIds } from './table_test_ids.js';
11
+ import type { HorizontallyScrollableTableWrapperProps } from './types.js';
12
+
13
+ export const HorizontallyScrollableTableWrapper: FC<HorizontallyScrollableTableWrapperProps> = ({ children, footer, className }) => {
14
+ const scrollableRef = useRef<HTMLDivElement>(null);
15
+ const wrapperRef = useRef<HTMLDivElement>(null);
16
+ const animationFrameIdRef = useRef(0);
17
+
18
+ const updateShadows = useCallback(() => {
19
+ const container = scrollableRef.current;
20
+ const wrapper = wrapperRef.current;
21
+ if (!container || !wrapper) return;
22
+
23
+ const isScrollable = container.scrollWidth > container.clientWidth;
24
+
25
+ if (container.scrollLeft > 0) {
26
+ wrapper.classList.add(tableClassNames.WRAPPER_SHADOW_LEFT);
27
+ } else {
28
+ wrapper.classList.remove(tableClassNames.WRAPPER_SHADOW_LEFT);
29
+ }
30
+
31
+ if (isScrollable && container.scrollLeft < container.scrollWidth - container.clientWidth - 1) {
32
+ wrapper.classList.add(tableClassNames.WRAPPER_SHADOW_RIGHT);
33
+ } else {
34
+ wrapper.classList.remove(tableClassNames.WRAPPER_SHADOW_RIGHT);
35
+ }
36
+ }, []);
37
+
38
+ const throttledUpdateShadows = useCallback(() => {
39
+ cancelAnimationFrame(animationFrameIdRef.current);
40
+ animationFrameIdRef.current = requestAnimationFrame(updateShadows);
41
+ }, [updateShadows]);
42
+
43
+ useEffect(() => {
44
+ const container = scrollableRef.current;
45
+ if (!container) return undefined;
46
+
47
+ updateShadows();
48
+ container.addEventListener('scroll', throttledUpdateShadows);
49
+ const resizeObserver = new ResizeObserver(throttledUpdateShadows);
50
+ resizeObserver.observe(container);
51
+
52
+ return () => {
53
+ cancelAnimationFrame(animationFrameIdRef.current);
54
+ container.removeEventListener('scroll', throttledUpdateShadows);
55
+ resizeObserver.disconnect();
56
+ };
57
+ }, [updateShadows, throttledUpdateShadows]);
58
+
59
+ return (
60
+ <StyledHorizontallyScrollableTableWrapper data-test={tableTestIds.WRAPPER} ref={wrapperRef} className={className}>
61
+ <Box className={tableClassNames.WRAPPER_SCROLLABLE} ref={scrollableRef}>
62
+ {children}
63
+ </Box>
64
+ {footer && (
65
+ <StyledTableFooterWrapper>
66
+ {footer}
67
+ </StyledTableFooterWrapper>
68
+ )}
69
+ </StyledHorizontallyScrollableTableWrapper>
70
+ );
71
+ };
@@ -0,0 +1,24 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+
3
+ import type { To } from '../link.js';
4
+
5
+ export type TableRowProps = HTMLAttributes<HTMLTableRowElement> & {
6
+ /** Apply clickable cursor style. Automatically set when `to` is provided. */
7
+ clickable?: boolean;
8
+ /** Apply expanded row style. */
9
+ expanded?: boolean;
10
+ /** Row-level navigation URL. Each `TableCell` inside will render an overlay link automatically. */
11
+ to?: To;
12
+ };
13
+
14
+ export type HorizontallyScrollableTableWrapperProps = {
15
+ children: ReactNode;
16
+ footer?: ReactNode;
17
+ className?: string;
18
+ };
19
+
20
+ export type TableExpansion = {
21
+ expandedId: string | null;
22
+ toggle: (id: string) => void;
23
+ isExpanded: (id: string) => boolean;
24
+ };