@quadrats/react 1.0.0 → 1.1.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 (108) hide show
  1. package/card/components/Card.js +83 -75
  2. package/card/index.cjs.js +82 -74
  3. package/carousel/components/Carousel.js +32 -28
  4. package/carousel/index.cjs.js +32 -28
  5. package/components/Tooltip/index.js +5 -2
  6. package/components/index.cjs.js +5 -2
  7. package/embed/renderers/base/components/BaseEmbedElement.js +51 -43
  8. package/embed/renderers/base/index.cjs.js +50 -42
  9. package/image/components/Image.js +34 -26
  10. package/image/createReactImage.js +1 -1
  11. package/image/index.cjs.js +34 -26
  12. package/package.json +4 -4
  13. package/table/components/Table.d.ts +9 -0
  14. package/table/components/Table.js +231 -0
  15. package/table/components/TableBody.d.ts +5 -0
  16. package/table/components/TableBody.js +8 -0
  17. package/table/components/TableCell.d.ts +5 -0
  18. package/table/components/TableCell.js +191 -0
  19. package/table/components/TableHeader.d.ts +5 -0
  20. package/table/components/TableHeader.js +13 -0
  21. package/table/components/TableMain.d.ts +5 -0
  22. package/table/components/TableMain.js +225 -0
  23. package/table/components/TableRow.d.ts +5 -0
  24. package/table/components/TableRow.js +8 -0
  25. package/table/components/TableTitle.d.ts +5 -0
  26. package/table/components/TableTitle.js +18 -0
  27. package/table/contexts/TableActionsContext.d.ts +3 -0
  28. package/table/contexts/TableActionsContext.js +5 -0
  29. package/table/contexts/TableHeaderContext.d.ts +2 -0
  30. package/table/contexts/TableHeaderContext.js +7 -0
  31. package/table/contexts/TableMetadataContext.d.ts +3 -0
  32. package/table/contexts/TableMetadataContext.js +5 -0
  33. package/table/contexts/TableScrollContext.d.ts +2 -0
  34. package/table/contexts/TableScrollContext.js +9 -0
  35. package/table/contexts/TableStateContext.d.ts +3 -0
  36. package/table/contexts/TableStateContext.js +5 -0
  37. package/table/createReactTable.d.ts +4 -0
  38. package/table/createReactTable.js +297 -0
  39. package/table/defaultRenderTableElements.d.ts +2 -0
  40. package/table/defaultRenderTableElements.js +20 -0
  41. package/table/hooks/useColumnResize.d.ts +12 -0
  42. package/table/hooks/useColumnResize.js +139 -0
  43. package/table/hooks/useTableActions.d.ts +25 -0
  44. package/table/hooks/useTableActions.js +886 -0
  45. package/table/hooks/useTableActionsContext.d.ts +1 -0
  46. package/table/hooks/useTableActionsContext.js +12 -0
  47. package/table/hooks/useTableCell.d.ts +16 -0
  48. package/table/hooks/useTableCell.js +166 -0
  49. package/table/hooks/useTableCellToolbarActions.d.ts +34 -0
  50. package/table/hooks/useTableCellToolbarActions.js +404 -0
  51. package/table/hooks/useTableMetadata.d.ts +1 -0
  52. package/table/hooks/useTableMetadata.js +12 -0
  53. package/table/hooks/useTableStateContext.d.ts +1 -0
  54. package/table/hooks/useTableStateContext.js +12 -0
  55. package/table/hooks/useTableStates.d.ts +18 -0
  56. package/table/hooks/useTableStates.js +14 -0
  57. package/table/index.cjs.js +3254 -0
  58. package/table/index.d.ts +16 -0
  59. package/table/index.js +24 -0
  60. package/table/jsx-serializer/components/Table.d.ts +3 -0
  61. package/table/jsx-serializer/components/Table.js +7 -0
  62. package/table/jsx-serializer/components/TableBody.d.ts +3 -0
  63. package/table/jsx-serializer/components/TableBody.js +7 -0
  64. package/table/jsx-serializer/components/TableCell.d.ts +5 -0
  65. package/table/jsx-serializer/components/TableCell.js +33 -0
  66. package/table/jsx-serializer/components/TableHeader.d.ts +3 -0
  67. package/table/jsx-serializer/components/TableHeader.js +10 -0
  68. package/table/jsx-serializer/components/TableMain.d.ts +6 -0
  69. package/table/jsx-serializer/components/TableMain.js +18 -0
  70. package/table/jsx-serializer/components/TableRow.d.ts +3 -0
  71. package/table/jsx-serializer/components/TableRow.js +7 -0
  72. package/table/jsx-serializer/components/TableTitle.d.ts +3 -0
  73. package/table/jsx-serializer/components/TableTitle.js +7 -0
  74. package/table/jsx-serializer/contexts/TableHeaderContext.d.ts +1 -0
  75. package/table/jsx-serializer/contexts/TableHeaderContext.js +5 -0
  76. package/table/jsx-serializer/contexts/TableScrollContext.d.ts +2 -0
  77. package/table/jsx-serializer/contexts/TableScrollContext.js +7 -0
  78. package/table/jsx-serializer/createJsxSerializeTable.d.ts +5 -0
  79. package/table/jsx-serializer/createJsxSerializeTable.js +113 -0
  80. package/table/jsx-serializer/defaultRenderTableElements.d.ts +2 -0
  81. package/table/jsx-serializer/defaultRenderTableElements.js +20 -0
  82. package/table/jsx-serializer/index.cjs.js +195 -0
  83. package/table/jsx-serializer/index.d.ts +3 -0
  84. package/table/jsx-serializer/index.js +2 -0
  85. package/table/jsx-serializer/package.json +7 -0
  86. package/table/jsx-serializer/typings.d.ts +12 -0
  87. package/table/package.json +10 -0
  88. package/table/table.css +1 -0
  89. package/table/table.scss +393 -0
  90. package/table/toolbar/TableToolbarIcon.d.ts +8 -0
  91. package/table/toolbar/TableToolbarIcon.js +12 -0
  92. package/table/toolbar/index.cjs.js +24 -0
  93. package/table/toolbar/index.d.ts +2 -0
  94. package/table/toolbar/index.js +2 -0
  95. package/table/toolbar/package.json +7 -0
  96. package/table/toolbar/useTableTool.d.ts +4 -0
  97. package/table/toolbar/useTableTool.js +13 -0
  98. package/table/typings.d.ts +66 -0
  99. package/table/utils/helper.d.ts +160 -0
  100. package/table/utils/helper.js +693 -0
  101. package/toolbar/components/InlineToolbar.d.ts +12 -11
  102. package/toolbar/components/InlineToolbar.js +23 -19
  103. package/toolbar/components/Toolbar.js +2 -2
  104. package/toolbar/index.cjs.js +24 -21
  105. package/toolbar/toolbar.css +1 -1
  106. package/toolbar/toolbar.scss +4 -1
  107. package/utils/index.cjs.js +7 -1
  108. package/utils/removePreviousElement.js +7 -1
@@ -0,0 +1,16 @@
1
+ export * from './contexts/TableActionsContext';
2
+ export * from './contexts/TableMetadataContext';
3
+ export * from './contexts/TableStateContext';
4
+ export * from './hooks/useTableActionsContext';
5
+ export * from './hooks/useTableMetadata';
6
+ export * from './hooks/useTableStateContext';
7
+ export * from './hooks/useTableCellToolbarActions';
8
+ export * from './typings';
9
+ export * from './components/Table';
10
+ export * from './components/TableTitle';
11
+ export * from './components/TableMain';
12
+ export * from './components/TableHeader';
13
+ export * from './components/TableRow';
14
+ export * from './components/TableCell';
15
+ export { defaultRenderTableElements } from './defaultRenderTableElements';
16
+ export { CreateReactTableOptions, createReactTable } from './createReactTable';
package/table/index.js ADDED
@@ -0,0 +1,24 @@
1
+ export { TableActionsContext } from './contexts/TableActionsContext.js';
2
+ export { TableMetadataContext } from './contexts/TableMetadataContext.js';
3
+ export { TableStateContext } from './contexts/TableStateContext.js';
4
+ export { useTableActionsContext } from './hooks/useTableActionsContext.js';
5
+ export { useTableMetadata } from './hooks/useTableMetadata.js';
6
+ export { useTableStateContext } from './hooks/useTableStateContext.js';
7
+ export { useTableCellToolbarActions } from './hooks/useTableCellToolbarActions.js';
8
+ import 'react';
9
+ import '@quadrats/core';
10
+ import '@quadrats/common/table';
11
+ import 'slate-react';
12
+ import '@quadrats/react';
13
+ import '@quadrats/common/align';
14
+ import '@quadrats/react/components';
15
+ import '@quadrats/icons';
16
+ import 'clsx';
17
+ import '@quadrats/react/toolbar';
18
+ import 'slate';
19
+ import './contexts/TableScrollContext.js';
20
+ import '@quadrats/react/utils';
21
+ import '@quadrats/common/list';
22
+ import './contexts/TableHeaderContext.js';
23
+ export { defaultRenderTableElements } from './defaultRenderTableElements.js';
24
+ export { createReactTable } from './createReactTable.js';
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { JsxSerializeElementProps } from '@quadrats/react/jsx-serializer';
3
+ export declare const TableJsxSerializeElement: ({ children }: JsxSerializeElementProps) => React.JSX.Element;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+
3
+ const TableJsxSerializeElement = ({ children }) => {
4
+ return React.createElement("div", { className: "qdr-table" }, children);
5
+ };
6
+
7
+ export { TableJsxSerializeElement };
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { JsxSerializeElementProps } from '@quadrats/react/jsx-serializer';
3
+ export declare const TableBodyJsxSerializeElement: ({ children }: JsxSerializeElementProps) => React.JSX.Element;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+
3
+ const TableBodyJsxSerializeElement = ({ children }) => {
4
+ return React.createElement("tbody", { className: "qdr-table__body" }, children);
5
+ };
6
+
7
+ export { TableBodyJsxSerializeElement };
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import { JsxSerializeTableElementProps } from '../typings';
3
+ export declare const TableCellJsxSerializeElement: ({ children, element, isColumnPinned, }: JsxSerializeTableElementProps & {
4
+ isColumnPinned?: boolean;
5
+ }) => React.JSX.Element;
@@ -0,0 +1,33 @@
1
+ import React, { useContext, useRef, useState, useEffect } from 'react';
2
+ import clsx from 'clsx';
3
+ import { TableHeaderContext } from '../contexts/TableHeaderContext.js';
4
+ import { TableScrollContext } from '../contexts/TableScrollContext.js';
5
+
6
+ const TableCellJsxSerializeElement = ({ children, element, isColumnPinned, }) => {
7
+ const isHeader = useContext(TableHeaderContext);
8
+ // calculate the left position of the cell when it is stuck
9
+ const cellRef = useRef(null);
10
+ const { scrollRef } = useContext(TableScrollContext);
11
+ const [cellStuckAtLeft, setCellStuckAtLeft] = useState(0);
12
+ useEffect(() => {
13
+ const { current: cell } = cellRef;
14
+ const { current: scrollContainer } = scrollRef;
15
+ if (scrollContainer && cell) {
16
+ const cellRect = cell.getBoundingClientRect();
17
+ const containerRect = scrollContainer.getBoundingClientRect();
18
+ setCellStuckAtLeft(Math.max(Math.round(cellRect.left - containerRect.left), 0));
19
+ }
20
+ }, [scrollRef]);
21
+ const CellTag = isHeader ? 'th' : 'td';
22
+ const shouldPinned = element.pinned && isColumnPinned && element.treatAsTitle;
23
+ return (React.createElement(CellTag, { ref: cellRef, className: clsx('qdr-table__cell', {
24
+ 'qdr-table__cell--header': isHeader || element.treatAsTitle,
25
+ 'qdr-table__cell--pinned': shouldPinned,
26
+ }), style: shouldPinned
27
+ ? {
28
+ left: cellStuckAtLeft,
29
+ }
30
+ : undefined }, children));
31
+ };
32
+
33
+ export { TableCellJsxSerializeElement };
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { JsxSerializeElementProps } from '@quadrats/react/jsx-serializer';
3
+ export declare const TableHeaderJsxSerializeElement: ({ children, element }: JsxSerializeElementProps) => React.JSX.Element;
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { TableHeaderContext } from '../contexts/TableHeaderContext.js';
3
+
4
+ const TableHeaderJsxSerializeElement = ({ children, element }) => {
5
+ const hasAnyRowPinned = element.children.some((child) => child.children.every((cell) => cell.pinned));
6
+ return (React.createElement(TableHeaderContext.Provider, { value: true },
7
+ React.createElement("thead", { className: `qdr-table__header ${hasAnyRowPinned ? 'qdr-table__header--pinned' : ''}` }, children)));
8
+ };
9
+
10
+ export { TableHeaderJsxSerializeElement };
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { JsxSerializeElementProps } from '@quadrats/react/jsx-serializer';
3
+ import { ColumnWidth } from '@quadrats/common/table';
4
+ export declare const TableMainJsxSerializeElement: ({ children, columnWidths, }: JsxSerializeElementProps & {
5
+ columnWidths?: ColumnWidth[];
6
+ }) => React.JSX.Element;
@@ -0,0 +1,18 @@
1
+ import React, { useRef, useMemo } from 'react';
2
+ import { TableScrollContext } from '../contexts/TableScrollContext.js';
3
+ import { calculateTableMinWidth, columnWidthToCSS } from '@quadrats/common/table';
4
+
5
+ const TableMainJsxSerializeElement = ({ children, columnWidths, }) => {
6
+ const scrollRef = useRef(null);
7
+ const scrollContextValue = useMemo(() => ({ scrollRef }), [scrollRef]);
8
+ const tableMinWidth = useMemo(() => (columnWidths ? calculateTableMinWidth(columnWidths) : '100%'), [columnWidths]);
9
+ return (React.createElement("div", { ref: scrollRef, className: "qdr-table__scrollContainer" },
10
+ React.createElement(TableScrollContext.Provider, { value: scrollContextValue },
11
+ React.createElement("table", { className: "qdr-table__main", style: {
12
+ minWidth: tableMinWidth,
13
+ } },
14
+ (columnWidths === null || columnWidths === void 0 ? void 0 : columnWidths.length) ? (React.createElement("colgroup", null, columnWidths.map((width, index) => (React.createElement("col", { key: index, style: { width: columnWidthToCSS(width), minWidth: columnWidthToCSS(width) } }))))) : null,
15
+ children))));
16
+ };
17
+
18
+ export { TableMainJsxSerializeElement };
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { JsxSerializeElementProps } from '@quadrats/react/jsx-serializer';
3
+ export declare const TableRowJsxSerializeElement: ({ children }: JsxSerializeElementProps) => React.JSX.Element;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+
3
+ const TableRowJsxSerializeElement = ({ children }) => {
4
+ return React.createElement("tr", { className: "qdr-table__row" }, children);
5
+ };
6
+
7
+ export { TableRowJsxSerializeElement };
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { JsxSerializeElementProps } from '@quadrats/react/jsx-serializer';
3
+ export declare const TableTitleJsxSerializeElement: ({ children }: JsxSerializeElementProps) => React.JSX.Element;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+
3
+ const TableTitleJsxSerializeElement = ({ children }) => {
4
+ return React.createElement("span", { className: "qdr-table__title" }, children);
5
+ };
6
+
7
+ export { TableTitleJsxSerializeElement };
@@ -0,0 +1 @@
1
+ export declare const TableHeaderContext: import("react").Context<boolean>;
@@ -0,0 +1,5 @@
1
+ import { createContext } from 'react';
2
+
3
+ const TableHeaderContext = createContext(false);
4
+
5
+ export { TableHeaderContext };
@@ -0,0 +1,2 @@
1
+ import { TableScrollContextType } from '../typings';
2
+ export declare const TableScrollContext: import("react").Context<TableScrollContextType>;
@@ -0,0 +1,7 @@
1
+ import { createContext } from 'react';
2
+
3
+ const TableScrollContext = createContext({
4
+ scrollRef: { current: null },
5
+ });
6
+
7
+ export { TableScrollContext };
@@ -0,0 +1,5 @@
1
+ import { TableTypeKey, TableTitleTypeKey, TableMainTypeKey, TableHeaderTypeKey, TableBodyTypeKey, TableRowTypeKey, TableCellTypeKey } from '@quadrats/common/table';
2
+ import { CreateJsxSerializeElementOptions, JsxSerializeElementProps } from '@quadrats/react/jsx-serializer';
3
+ import { JsxSerializeTableElementProps } from './typings';
4
+ export type CreateJsxSerializeTableOptions = Partial<Record<TableTypeKey, Partial<CreateJsxSerializeElementOptions<JsxSerializeTableElementProps>>> & Record<TableTitleTypeKey, Partial<CreateJsxSerializeElementOptions<JsxSerializeElementProps>>> & Record<TableMainTypeKey, Partial<CreateJsxSerializeElementOptions<JsxSerializeElementProps>>> & Record<TableHeaderTypeKey, Partial<CreateJsxSerializeElementOptions<JsxSerializeElementProps>>> & Record<TableBodyTypeKey, Partial<CreateJsxSerializeElementOptions<JsxSerializeElementProps>>> & Record<TableRowTypeKey, Partial<CreateJsxSerializeElementOptions<JsxSerializeElementProps>>> & Record<TableCellTypeKey, Partial<CreateJsxSerializeElementOptions<JsxSerializeElementProps>>>>;
5
+ export declare function createJsxSerializeTable(options?: CreateJsxSerializeTableOptions): (props: JsxSerializeElementProps) => import("react").JSX.Element | null | undefined;
@@ -0,0 +1,113 @@
1
+ import { getFirstAncestor } from '@quadrats/core/serializers';
2
+ import { TABLE_TYPES } from '@quadrats/common/table';
3
+ import { createJsxSerializeElements } from '@quadrats/react/jsx-serializer';
4
+ import { defaultRenderTableElements } from './defaultRenderTableElements.js';
5
+ import { Element } from '@quadrats/core';
6
+
7
+ /* eslint-disable @typescript-eslint/naming-convention */
8
+ function createJsxSerializeTable(options = {}) {
9
+ const { table = {}, table_title = {}, table_main = {}, table_header = {}, table_body = {}, table_row = {}, table_cell = {}, } = options;
10
+ const tableType = table.type || TABLE_TYPES.table;
11
+ const tableTitleType = table_title.type || TABLE_TYPES.table_title;
12
+ const tableMainType = table_main.type || TABLE_TYPES.table_main;
13
+ const tableHeaderType = table_header.type || TABLE_TYPES.table_header;
14
+ const tableBodyType = table_body.type || TABLE_TYPES.table_body;
15
+ const tableRowType = table_row.type || TABLE_TYPES.table_row;
16
+ const tableCellType = table_cell.type || TABLE_TYPES.table_cell;
17
+ const renderTable = table.render || defaultRenderTableElements.table;
18
+ const renderTableTitle = table_title.render || defaultRenderTableElements.table_title;
19
+ const renderTableMain = table_main.render || defaultRenderTableElements.table_main;
20
+ const renderTableHeader = table_header.render || defaultRenderTableElements.table_header;
21
+ const renderTableBody = table_body.render || defaultRenderTableElements.table_body;
22
+ const renderTableRow = table_row.render || defaultRenderTableElements.table_row;
23
+ const renderTableCell = table_cell.render || defaultRenderTableElements.table_cell;
24
+ return createJsxSerializeElements([
25
+ {
26
+ type: tableType,
27
+ render: (props) => {
28
+ const { children } = props;
29
+ const element = props.element;
30
+ return renderTable({
31
+ children,
32
+ element,
33
+ });
34
+ },
35
+ },
36
+ {
37
+ type: tableTitleType,
38
+ render: (props) => {
39
+ const { children } = props;
40
+ const element = props.element;
41
+ return renderTableTitle({
42
+ children,
43
+ element,
44
+ });
45
+ },
46
+ },
47
+ {
48
+ type: tableMainType,
49
+ render: (props) => {
50
+ const { children } = props;
51
+ const element = props.element;
52
+ const firstAncestor = getFirstAncestor(element, (node) => node.type === tableType);
53
+ const columnWidths = (firstAncestor === null || firstAncestor === void 0 ? void 0 : firstAncestor.columnWidths) || [];
54
+ return renderTableMain({
55
+ children,
56
+ element,
57
+ columnWidths,
58
+ });
59
+ },
60
+ },
61
+ {
62
+ type: tableHeaderType,
63
+ render: (props) => {
64
+ const { children } = props;
65
+ const element = props.element;
66
+ return renderTableHeader({
67
+ children,
68
+ element,
69
+ });
70
+ },
71
+ },
72
+ {
73
+ type: tableBodyType,
74
+ render: (props) => {
75
+ const { children } = props;
76
+ const element = props.element;
77
+ return renderTableBody({
78
+ children,
79
+ element,
80
+ });
81
+ },
82
+ },
83
+ {
84
+ type: tableRowType,
85
+ render: (props) => {
86
+ const { children } = props;
87
+ const element = props.element;
88
+ return renderTableRow({
89
+ children,
90
+ element,
91
+ });
92
+ },
93
+ },
94
+ {
95
+ type: tableCellType,
96
+ render: (props) => {
97
+ const { children } = props;
98
+ const element = props.element;
99
+ const firstAncestor = getFirstAncestor(element, (node) => node.type === tableMainType);
100
+ const body = firstAncestor === null || firstAncestor === void 0 ? void 0 : firstAncestor.children.find((child) => child.type === tableBodyType);
101
+ const firstRow = body === null || body === void 0 ? void 0 : body.children[0];
102
+ const firstCell = Element.isElement(firstRow) ? firstRow.children[0] : null;
103
+ return renderTableCell({
104
+ children,
105
+ element,
106
+ isColumnPinned: Element.isElement(firstCell) ? firstCell.pinned : false,
107
+ });
108
+ },
109
+ },
110
+ ]);
111
+ }
112
+
113
+ export { createJsxSerializeTable };
@@ -0,0 +1,2 @@
1
+ import { TableJsxSerializeElements } from './typings';
2
+ export declare const defaultRenderTableElements: TableJsxSerializeElements;
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { TableJsxSerializeElement } from './components/Table.js';
3
+ import { TableTitleJsxSerializeElement } from './components/TableTitle.js';
4
+ import { TableMainJsxSerializeElement } from './components/TableMain.js';
5
+ import { TableHeaderJsxSerializeElement } from './components/TableHeader.js';
6
+ import { TableBodyJsxSerializeElement } from './components/TableBody.js';
7
+ import { TableRowJsxSerializeElement } from './components/TableRow.js';
8
+ import { TableCellJsxSerializeElement } from './components/TableCell.js';
9
+
10
+ const defaultRenderTableElements = {
11
+ table: (props) => React.createElement(TableJsxSerializeElement, Object.assign({}, props)),
12
+ table_title: (props) => React.createElement(TableTitleJsxSerializeElement, Object.assign({}, props)),
13
+ table_main: (props) => React.createElement(TableMainJsxSerializeElement, Object.assign({}, props)),
14
+ table_header: (props) => React.createElement(TableHeaderJsxSerializeElement, Object.assign({}, props)),
15
+ table_body: (props) => React.createElement(TableBodyJsxSerializeElement, Object.assign({}, props)),
16
+ table_row: (props) => React.createElement(TableRowJsxSerializeElement, Object.assign({}, props)),
17
+ table_cell: (props) => React.createElement(TableCellJsxSerializeElement, Object.assign({}, props)),
18
+ };
19
+
20
+ export { defaultRenderTableElements };
@@ -0,0 +1,195 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var table = require('@quadrats/common/table');
5
+ var clsx = require('clsx');
6
+ var serializers = require('@quadrats/core/serializers');
7
+ var jsxSerializer = require('@quadrats/react/jsx-serializer');
8
+ var core = require('@quadrats/core');
9
+
10
+ const TableJsxSerializeElement = ({ children }) => {
11
+ return React.createElement("div", { className: "qdr-table" }, children);
12
+ };
13
+
14
+ const TableTitleJsxSerializeElement = ({ children }) => {
15
+ return React.createElement("span", { className: "qdr-table__title" }, children);
16
+ };
17
+
18
+ const TableScrollContext = React.createContext({
19
+ scrollRef: { current: null },
20
+ });
21
+
22
+ const TableMainJsxSerializeElement = ({ children, columnWidths, }) => {
23
+ const scrollRef = React.useRef(null);
24
+ const scrollContextValue = React.useMemo(() => ({ scrollRef }), [scrollRef]);
25
+ const tableMinWidth = React.useMemo(() => (columnWidths ? table.calculateTableMinWidth(columnWidths) : '100%'), [columnWidths]);
26
+ return (React.createElement("div", { ref: scrollRef, className: "qdr-table__scrollContainer" },
27
+ React.createElement(TableScrollContext.Provider, { value: scrollContextValue },
28
+ React.createElement("table", { className: "qdr-table__main", style: {
29
+ minWidth: tableMinWidth,
30
+ } },
31
+ (columnWidths === null || columnWidths === void 0 ? void 0 : columnWidths.length) ? (React.createElement("colgroup", null, columnWidths.map((width, index) => (React.createElement("col", { key: index, style: { width: table.columnWidthToCSS(width), minWidth: table.columnWidthToCSS(width) } }))))) : null,
32
+ children))));
33
+ };
34
+
35
+ const TableHeaderContext = React.createContext(false);
36
+
37
+ const TableHeaderJsxSerializeElement = ({ children, element }) => {
38
+ const hasAnyRowPinned = element.children.some((child) => child.children.every((cell) => cell.pinned));
39
+ return (React.createElement(TableHeaderContext.Provider, { value: true },
40
+ React.createElement("thead", { className: `qdr-table__header ${hasAnyRowPinned ? 'qdr-table__header--pinned' : ''}` }, children)));
41
+ };
42
+
43
+ const TableBodyJsxSerializeElement = ({ children }) => {
44
+ return React.createElement("tbody", { className: "qdr-table__body" }, children);
45
+ };
46
+
47
+ const TableRowJsxSerializeElement = ({ children }) => {
48
+ return React.createElement("tr", { className: "qdr-table__row" }, children);
49
+ };
50
+
51
+ const TableCellJsxSerializeElement = ({ children, element, isColumnPinned, }) => {
52
+ const isHeader = React.useContext(TableHeaderContext);
53
+ // calculate the left position of the cell when it is stuck
54
+ const cellRef = React.useRef(null);
55
+ const { scrollRef } = React.useContext(TableScrollContext);
56
+ const [cellStuckAtLeft, setCellStuckAtLeft] = React.useState(0);
57
+ React.useEffect(() => {
58
+ const { current: cell } = cellRef;
59
+ const { current: scrollContainer } = scrollRef;
60
+ if (scrollContainer && cell) {
61
+ const cellRect = cell.getBoundingClientRect();
62
+ const containerRect = scrollContainer.getBoundingClientRect();
63
+ setCellStuckAtLeft(Math.max(Math.round(cellRect.left - containerRect.left), 0));
64
+ }
65
+ }, [scrollRef]);
66
+ const CellTag = isHeader ? 'th' : 'td';
67
+ const shouldPinned = element.pinned && isColumnPinned && element.treatAsTitle;
68
+ return (React.createElement(CellTag, { ref: cellRef, className: clsx('qdr-table__cell', {
69
+ 'qdr-table__cell--header': isHeader || element.treatAsTitle,
70
+ 'qdr-table__cell--pinned': shouldPinned,
71
+ }), style: shouldPinned
72
+ ? {
73
+ left: cellStuckAtLeft,
74
+ }
75
+ : undefined }, children));
76
+ };
77
+
78
+ const defaultRenderTableElements = {
79
+ table: (props) => React.createElement(TableJsxSerializeElement, Object.assign({}, props)),
80
+ table_title: (props) => React.createElement(TableTitleJsxSerializeElement, Object.assign({}, props)),
81
+ table_main: (props) => React.createElement(TableMainJsxSerializeElement, Object.assign({}, props)),
82
+ table_header: (props) => React.createElement(TableHeaderJsxSerializeElement, Object.assign({}, props)),
83
+ table_body: (props) => React.createElement(TableBodyJsxSerializeElement, Object.assign({}, props)),
84
+ table_row: (props) => React.createElement(TableRowJsxSerializeElement, Object.assign({}, props)),
85
+ table_cell: (props) => React.createElement(TableCellJsxSerializeElement, Object.assign({}, props)),
86
+ };
87
+
88
+ /* eslint-disable @typescript-eslint/naming-convention */
89
+ function createJsxSerializeTable(options = {}) {
90
+ const { table: table$1 = {}, table_title = {}, table_main = {}, table_header = {}, table_body = {}, table_row = {}, table_cell = {}, } = options;
91
+ const tableType = table$1.type || table.TABLE_TYPES.table;
92
+ const tableTitleType = table_title.type || table.TABLE_TYPES.table_title;
93
+ const tableMainType = table_main.type || table.TABLE_TYPES.table_main;
94
+ const tableHeaderType = table_header.type || table.TABLE_TYPES.table_header;
95
+ const tableBodyType = table_body.type || table.TABLE_TYPES.table_body;
96
+ const tableRowType = table_row.type || table.TABLE_TYPES.table_row;
97
+ const tableCellType = table_cell.type || table.TABLE_TYPES.table_cell;
98
+ const renderTable = table$1.render || defaultRenderTableElements.table;
99
+ const renderTableTitle = table_title.render || defaultRenderTableElements.table_title;
100
+ const renderTableMain = table_main.render || defaultRenderTableElements.table_main;
101
+ const renderTableHeader = table_header.render || defaultRenderTableElements.table_header;
102
+ const renderTableBody = table_body.render || defaultRenderTableElements.table_body;
103
+ const renderTableRow = table_row.render || defaultRenderTableElements.table_row;
104
+ const renderTableCell = table_cell.render || defaultRenderTableElements.table_cell;
105
+ return jsxSerializer.createJsxSerializeElements([
106
+ {
107
+ type: tableType,
108
+ render: (props) => {
109
+ const { children } = props;
110
+ const element = props.element;
111
+ return renderTable({
112
+ children,
113
+ element,
114
+ });
115
+ },
116
+ },
117
+ {
118
+ type: tableTitleType,
119
+ render: (props) => {
120
+ const { children } = props;
121
+ const element = props.element;
122
+ return renderTableTitle({
123
+ children,
124
+ element,
125
+ });
126
+ },
127
+ },
128
+ {
129
+ type: tableMainType,
130
+ render: (props) => {
131
+ const { children } = props;
132
+ const element = props.element;
133
+ const firstAncestor = serializers.getFirstAncestor(element, (node) => node.type === tableType);
134
+ const columnWidths = (firstAncestor === null || firstAncestor === void 0 ? void 0 : firstAncestor.columnWidths) || [];
135
+ return renderTableMain({
136
+ children,
137
+ element,
138
+ columnWidths,
139
+ });
140
+ },
141
+ },
142
+ {
143
+ type: tableHeaderType,
144
+ render: (props) => {
145
+ const { children } = props;
146
+ const element = props.element;
147
+ return renderTableHeader({
148
+ children,
149
+ element,
150
+ });
151
+ },
152
+ },
153
+ {
154
+ type: tableBodyType,
155
+ render: (props) => {
156
+ const { children } = props;
157
+ const element = props.element;
158
+ return renderTableBody({
159
+ children,
160
+ element,
161
+ });
162
+ },
163
+ },
164
+ {
165
+ type: tableRowType,
166
+ render: (props) => {
167
+ const { children } = props;
168
+ const element = props.element;
169
+ return renderTableRow({
170
+ children,
171
+ element,
172
+ });
173
+ },
174
+ },
175
+ {
176
+ type: tableCellType,
177
+ render: (props) => {
178
+ const { children } = props;
179
+ const element = props.element;
180
+ const firstAncestor = serializers.getFirstAncestor(element, (node) => node.type === tableMainType);
181
+ const body = firstAncestor === null || firstAncestor === void 0 ? void 0 : firstAncestor.children.find((child) => child.type === tableBodyType);
182
+ const firstRow = body === null || body === void 0 ? void 0 : body.children[0];
183
+ const firstCell = core.Element.isElement(firstRow) ? firstRow.children[0] : null;
184
+ return renderTableCell({
185
+ children,
186
+ element,
187
+ isColumnPinned: core.Element.isElement(firstCell) ? firstCell.pinned : false,
188
+ });
189
+ },
190
+ },
191
+ ]);
192
+ }
193
+
194
+ exports.createJsxSerializeTable = createJsxSerializeTable;
195
+ exports.defaultRenderTableElements = defaultRenderTableElements;
@@ -0,0 +1,3 @@
1
+ export * from './typings';
2
+ export { defaultRenderTableElements } from './defaultRenderTableElements';
3
+ export { CreateJsxSerializeTableOptions, createJsxSerializeTable } from './createJsxSerializeTable';
@@ -0,0 +1,2 @@
1
+ export { defaultRenderTableElements } from './defaultRenderTableElements.js';
2
+ export { createJsxSerializeTable } from './createJsxSerializeTable.js';
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@quadrats/react/table/jsx-serializer",
3
+ "sideEffects": false,
4
+ "main": "./index.cjs.js",
5
+ "module": "./index.js",
6
+ "typings": "./index.d.ts"
7
+ }
@@ -0,0 +1,12 @@
1
+ import { TableElement, TableTypeKey, TableTitleTypeKey, TableMainTypeKey, TableHeaderTypeKey, TableBodyTypeKey, TableRowTypeKey, TableCellTypeKey, ColumnWidth } from '@quadrats/common/table';
2
+ import { JsxSerializeElementProps } from '@quadrats/react/jsx-serializer';
3
+ import { RefObject } from 'react';
4
+ export type JsxSerializeTableElementProps = JsxSerializeElementProps<TableElement>;
5
+ export type TableJsxSerializeElements = Record<TableTypeKey, (props: JsxSerializeTableElementProps) => JSX.Element | null | undefined> & Record<TableTitleTypeKey, (props: JsxSerializeTableElementProps) => JSX.Element | null | undefined> & Record<TableMainTypeKey, (props: JsxSerializeTableElementProps & {
6
+ columnWidths?: ColumnWidth[];
7
+ }) => JSX.Element | null | undefined> & Record<TableHeaderTypeKey, (props: JsxSerializeTableElementProps) => JSX.Element | null | undefined> & Record<TableBodyTypeKey, (props: JsxSerializeTableElementProps) => JSX.Element | null | undefined> & Record<TableRowTypeKey, (props: JsxSerializeTableElementProps) => JSX.Element | null | undefined> & Record<TableCellTypeKey, (props: JsxSerializeTableElementProps & {
8
+ isColumnPinned?: boolean;
9
+ }) => JSX.Element | null | undefined>;
10
+ export type TableScrollContextType = {
11
+ scrollRef: RefObject<HTMLDivElement | null>;
12
+ };
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "@quadrats/react/table",
3
+ "sideEffects": [
4
+ "**/*.css",
5
+ "**/*.scss"
6
+ ],
7
+ "main": "./index.cjs.js",
8
+ "module": "./index.js",
9
+ "typings": "./index.d.ts"
10
+ }
@@ -0,0 +1 @@
1
+ .qdr-table__table-toolbar{right:unset;left:50%;top:-4px;transform:translate(-50%, -100%)}.qdr-table{display:flex;flex-flow:column;align-items:flex-start;gap:var(--qdr-spacing-4);margin:var(--qdr-spacing-11) 0;position:relative}.qdr-table__selection{padding:0;position:absolute;left:-22px;top:0;z-index:0;width:20px;height:20px;color:var(--qdr-action-inactive);border:none;border-radius:var(--qdr-radius-1);background-color:rgba(0,0,0,0);display:flex;align-items:center;justify-content:center;cursor:pointer}.qdr-table__selection:hover{background-color:var(--qdr-secondary-active-bg);color:var(--qdr-action-active)}.qdr-table__portal-container{position:relative;pointer-events:none}.qdr-table__title{width:100%;display:block;position:relative;margin:0;font-size:var(--qdr-typography-article-h6-font-size);line-height:var(--qdr-typography-article-h6-line-height);letter-spacing:var(--qdr-typography-article-h6-letter-spacing);font-weight:var(--qdr-typography-article-h6-font-weight);color:var(--qdr-text-primary);background-color:var(--qdr-surface-secondary)}.qdr-table__title__placeholder{position:absolute;left:0;top:0;color:var(--qdr-text-secondary);pointer-events:none}.qdr-table__header{background-color:var(--qdr-bg)}.qdr-table__header--pinned{position:sticky;z-index:2;top:0;box-shadow:0 2px 4px -2px rgba(0,0,0,.1490196078)}.qdr-table__scrollContainer{width:100%;max-width:100%;max-height:420px;overflow:auto;scrollbar-width:thin;position:relative}.qdr-table__main{margin:0;border-collapse:separate;border-spacing:0;table-layout:fixed}.qdr-table__main th:not(:first-child),.qdr-table__main td:not(:first-child){border-left:none}.qdr-table__main thead tr:not(:last-child) th,.qdr-table__main tbody tr:not(:last-child) td{border-bottom:none}.qdr-table__inline-table-toolbar,.qdr-table__cell__inline-table-toolbar{pointer-events:none;top:-50px;left:0;right:unset}.qdr-table__mainWrapper{width:100%;max-width:100%;height:100%;position:relative}.qdr-table__mainWrapper--selected .qdr-table__main{border:2px solid var(--qdr-primary)}.qdr-table__mainWrapper--selected .qdr-table__table-toolbar{opacity:1;pointer-events:auto}.qdr-table__body{background-color:var(--qdr-surface-primary)}.qdr-table__cell{position:relative;padding:var(--qdr-spacing-3) var(--qdr-spacing-4);font-size:var(--qdr-typography-article-body1-font-size);line-height:var(--qdr-typography-article-body1-line-height);letter-spacing:var(--qdr-typography-article-body1-letter-spacing);font-weight:var(--qdr-typography-article-body1-font-weight);color:var(--qdr-text-primary);text-align:left;border-top:1px solid var(--qdr-border);border-right:1px solid var(--qdr-border);border-bottom:1px solid var(--qdr-border);border-left:1px solid var(--qdr-border);vertical-align:top;word-break:break-all}.qdr-table__cell p,.qdr-table__cell ul,.qdr-table__cell ol{margin:0}.qdr-table__cell--resizing::after{content:"";position:absolute;right:0;top:0;width:2px;height:100%;background-color:var(--qdr-primary-light);pointer-events:none;opacity:1}.qdr-table__cell__resize-handle{position:absolute;right:0;top:0;width:6px;height:100%;transform:translateX(0);cursor:col-resize;z-index:1}.qdr-table__cell--header{font-weight:var(--qdr-typography-article-h6-font-weight);color:var(--qdr-text-primary);background-color:var(--qdr-bg)}.qdr-table__cell--pinned{position:sticky;z-index:1;left:0;box-shadow:2px 0 4px -2px rgba(0,0,0,.1490196078)}.qdr-table__cell--top-active{border-top:2px solid var(--qdr-primary-light) !important}.qdr-table__cell--right-active{border-right:2px solid var(--qdr-primary-light) !important}.qdr-table__cell--bottom-active{border-bottom:2px solid var(--qdr-primary-light) !important}.qdr-table__cell--left-active{border-left:2px solid var(--qdr-primary-light) !important}.qdr-table__btn-icon{color:var(--qdr-action-disabled);pointer-events:none}.qdr-table__add-column{position:absolute;z-index:0;cursor:pointer;padding:0;background-color:var(--qdr-block);border-radius:var(--qdr-radius-1);border:1px solid var(--qdr-divider);display:flex;align-items:center;justify-content:center;right:-24px;top:0;width:20px;height:100%}.qdr-table__add-column:hover{background-color:var(--qdr-bg)}.qdr-table__add-column:hover .qdr-table__btn-icon{color:var(--qdr-text-secondary)}.qdr-table__add-column:active{background-color:var(--qdr-divider);border:1px solid var(--qdr-border)}.qdr-table__add-column:active .qdr-table__btn-icon{color:var(--qdr-text-secondary)}.qdr-table__add-row{position:absolute;z-index:0;cursor:pointer;padding:0;background-color:var(--qdr-block);border-radius:var(--qdr-radius-1);border:1px solid var(--qdr-divider);display:flex;align-items:center;justify-content:center;bottom:-24px;left:0;width:100%;height:20px}.qdr-table__add-row:hover{background-color:var(--qdr-bg)}.qdr-table__add-row:hover .qdr-table__btn-icon{color:var(--qdr-text-secondary)}.qdr-table__add-row:active{background-color:var(--qdr-divider);border:1px solid var(--qdr-border)}.qdr-table__add-row:active .qdr-table__btn-icon{color:var(--qdr-text-secondary)}.qdr-table__add-both{position:absolute;z-index:0;cursor:pointer;padding:0;background-color:var(--qdr-block);border-radius:var(--qdr-radius-1);border:1px solid var(--qdr-divider);display:flex;align-items:center;justify-content:center;right:-24px;bottom:-24px;width:20px;height:20px}.qdr-table__add-both:hover{background-color:var(--qdr-bg)}.qdr-table__add-both:hover .qdr-table__btn-icon{color:var(--qdr-text-secondary)}.qdr-table__add-both:active{background-color:var(--qdr-divider);border:1px solid var(--qdr-border)}.qdr-table__add-both:active .qdr-table__btn-icon{color:var(--qdr-text-secondary)}.qdr-table__delete{color:var(--qdr-error)}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}.qdr-table__cell__focus-toolbar,.qdr-table__cell__inline-table-toolbar{position:absolute;right:unset;transform:translate(-10%, -100%);padding:4px;border-radius:10px;border:1px solid var(--qdr-border);background:var(--qdr-bg);box-shadow:0 4px 8px -2px rgba(0,0,0,.1019607843),0 2px 4px -2px rgba(0,0,0,.0392156863);animation-name:fade-in;animation-duration:.1s;animation-delay:.1s;animation-iteration-count:1;animation-fill-mode:forwards;animation-timing-function:linear;pointer-events:auto;z-index:10}.qdr-table__cell-row-action{position:absolute;z-index:9;width:20px;height:24px;padding:0;border-radius:var(--qdr-radius-1);border:1px solid var(--qdr-primary-active-bg);background-color:var(--qdr-primary-hover-bg);display:flex;align-items:center;justify-content:center;pointer-events:auto;cursor:pointer;opacity:1}.qdr-table__cell-column-action{position:absolute;z-index:9;width:20px;height:24px;padding:0;border-radius:var(--qdr-radius-1);border:1px solid var(--qdr-primary-active-bg);background-color:var(--qdr-primary-hover-bg);display:flex;align-items:center;justify-content:center;pointer-events:auto;cursor:pointer;opacity:1;transform:rotate(90deg);transform-origin:center}.qdr-table__size-indicators{display:none;overflow:hidden;position:absolute;z-index:1;left:0;top:0;width:100%;max-width:100%;padding:8px 0;pointer-events:none;transform:translateY(-100%);flex-flow:row nowrap;align-items:center}.qdr-table__size-indicator{display:flex;align-items:center;justify-content:center;position:relative}.qdr-table__size{background-color:var(--qdr-action-inactive);color:var(--qdr-on-primary);padding:4px 8px;font-size:12px;white-space:pre-wrap;position:relative}.qdr-table__size::after{position:absolute;content:"";z-index:-1;top:calc(100% - 2px);left:50%;width:10px;height:10px;background-color:var(--qdr-action-inactive);border-right:1px solid var(--qdr-action-inactive);border-bottom:1px solid var(--qdr-action-inactive);transform:translateX(-50%) translateY(-50%) rotate(45deg)}