@ehfuse/mui-virtual-data-table 1.0.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 김영진 (Kim Young Jin)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,141 @@
1
+ # MUI Virtual Data Table
2
+
3
+ A high-performance virtual data table component for React with Material-UI integration, featuring virtualized rendering, infinite scroll, keyboard navigation, and customizable styling.
4
+
5
+ React와 Material-UI를 위한 고성능 가상화 데이터 테이블 컴포넌트입니다. 가상화 렌더링, 무한 스크롤, 키보드 탐색, 커스터마이징 가능한 스타일링을 제공합니다.
6
+
7
+ ## Features
8
+
9
+ - 🚀 **High Performance**: Virtualized rendering with react-virtuoso for smooth scrolling with large datasets
10
+ - ♾️ **Infinite Scroll**: Built-in infinite scroll with automatic loading indicator
11
+ - ⌨️ **Keyboard Navigation**: Full keyboard support (Arrow keys, PageUp/Down, Home/End)
12
+ - 🎨 **Material-UI Integration**: Seamless integration with MUI components
13
+ - 🦓 **Zebra Striping**: Optional alternating row colors with custom color support
14
+ - 🔧 **TypeScript Support**: Full TypeScript support with comprehensive type definitions
15
+ - 🔄 **Sorting**: Built-in column sorting functionality
16
+ - 🎯 **Customizable**: Highly customizable columns, styling, and scrollbar options
17
+ - 📊 **Empty State**: Built-in empty state handling with custom message
18
+ - 🔍 **Loading State**: Smooth loading transitions with fade-out animation
19
+ - 📏 **Grouped Headers**: Support for grouped column headers with dynamic height calculation
20
+ - 🎨 **Custom Scrollbar**: Beautiful custom scrollbar with full customization options
21
+
22
+ ## 주요 기능
23
+
24
+ - 🚀 **고성능**: react-virtuoso를 사용한 가상화 렌더링으로 대용량 데이터셋에서도 부드러운 스크롤
25
+ - ♾️ **무한 스크롤**: 자동 로딩 인디케이터가 포함된 무한 스크롤 기능
26
+ - ⌨️ **키보드 탐색**: 완전한 키보드 지원 (방향키, PageUp/Down, Home/End)
27
+ - 🎨 **Material-UI 통합**: MUI 컴포넌트와의 완벽한 통합
28
+ - 🦓 **얼룩말 줄무늬**: 사용자 지정 색상을 지원하는 선택적 행 교차 색상
29
+ - 🔧 **TypeScript 지원**: 포괄적인 타입 정의가 포함된 완전한 TypeScript 지원
30
+ - 🔄 **정렬**: 내장된 컬럼 정렬 기능
31
+ - 🎯 **커스터마이징**: 컬럼, 스타일링, 스크롤바 옵션의 높은 커스터마이징
32
+ - 📊 **빈 상태**: 커스텀 메시지를 지원하는 내장된 빈 상태 처리
33
+ - 🔍 **로딩 상태**: 페이드아웃 애니메이션이 적용된 부드러운 로딩 전환
34
+ - 📏 **그룹 헤더**: 동적 높이 계산을 지원하는 그룹화된 컬럼 헤더
35
+ - 🎨 **커스텀 스크롤바**: 완전한 커스터마이징 옵션을 갖춘 아름다운 커스텀 스크롤바
36
+
37
+ ## Installation
38
+
39
+ ```bash
40
+ npm install @ehfuse/mui-virtual-data-table
41
+ ```
42
+
43
+ ## Peer Dependencies
44
+
45
+ This package requires the following peer dependencies:
46
+
47
+ ```bash
48
+ npm install react react-dom @mui/material react-virtuoso
49
+ ```
50
+
51
+ ## 📚 Documentation
52
+
53
+ For detailed API reference and usage examples:
54
+
55
+ - **[한국어 시작하기](./docs/ko/getting-started.md)** - API 설명 및 가이드
56
+ - **[한국어 예제 코드](./docs/ko/example.md)** - 다양한 사용 예제
57
+ - **[Getting Started (English)](./docs/en/getting-started.md)** - API reference and guide _(coming soon)_
58
+
59
+ ## Quick Start
60
+
61
+ ```tsx
62
+ import { VirtualDataTable } from "@ehfuse/mui-virtual-data-table";
63
+ import type { DataColumn } from "@ehfuse/mui-virtual-data-table";
64
+
65
+ interface User {
66
+ id: number;
67
+ name: string;
68
+ email: string;
69
+ }
70
+
71
+ const columns: DataColumn<User>[] = [
72
+ { id: "id", text: "ID", width: 80 },
73
+ { id: "name", text: "Name", width: 200, sortable: true },
74
+ { id: "email", text: "Email", width: 250 },
75
+ ];
76
+
77
+ const data: User[] = [
78
+ { id: 1, name: "John Doe", email: "john@example.com" },
79
+ { id: 2, name: "Jane Smith", email: "jane@example.com" },
80
+ // ... more data
81
+ ];
82
+
83
+ function App() {
84
+ return (
85
+ <VirtualDataTable
86
+ data={data}
87
+ columns={columns}
88
+ totalCount={data.length}
89
+ loading={false}
90
+ />
91
+ );
92
+ }
93
+ ```
94
+
95
+ ## Basic Props Signature
96
+
97
+ ```tsx
98
+ <VirtualDataTable
99
+ // Required
100
+ data={T[]} // Data array
101
+ columns={DataColumn<T>[]} // Column definitions
102
+ totalCount={number} // Total data count
103
+
104
+ // Optional - Styling
105
+ striped={boolean | string} // Zebra striping (true: default gray (#f5f5f5), string: custom color, default: false)
106
+ rowDivider={boolean} // Show row borders (default: true)
107
+ rowHeight={number} // Row height in px (default: 50)
108
+ columnHeight={number} // Header height in px (default: 56, auto 2x for grouped headers)
109
+ showPaper={boolean} // Wrap in Paper component (default: true)
110
+ paddingX={string | number} // Horizontal padding (default: "1rem")
111
+
112
+ // Optional - Infinite Scroll
113
+ loading={boolean} // Loading state (default: false)
114
+ onLoadMore={(offset, limit) => void} // Load more callback (enables infinite scroll when provided)
115
+
116
+ // Optional - Sorting
117
+ sortBy={string} // Current sort field
118
+ sortDirection={"asc" | "desc"} // Current sort direction
119
+ onSort={(id, direction) => void} // Sort callback
120
+
121
+ // Optional - Interactions
122
+ onRowClick={(item, index) => void} // Row click handler
123
+
124
+ // Optional - Customization
125
+ emptyMessage={string | React.ReactNode} // Empty state message (default: "NO DATA")
126
+ scrollbars={VDTOverlayScrollbarProps} // Custom scrollbar options
127
+ LoadingComponent={React.ComponentType} // Custom loading component
128
+ />
129
+ ```
130
+
131
+ ## License
132
+
133
+ MIT © KIM YOUNG JIN (ehfuse@gmail.com)
134
+
135
+ ## Contributing
136
+
137
+ Contributions are welcome! Please feel free to submit a Pull Request.
138
+
139
+ ## Support
140
+
141
+ For support, email ehfuse@gmail.com or create an issue on GitHub.
@@ -0,0 +1,81 @@
1
+ /**
2
+ * OverlayScrollbar.tsx
3
+ *
4
+ * @copyright 2025 KIM YOUNG JIN (ehfuse@gmail.com)
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in all
14
+ * copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ * SOFTWARE.
23
+ */
24
+ import React, { ReactNode } from "react";
25
+ export interface ThumbConfig {
26
+ width?: number;
27
+ minHeight?: number;
28
+ radius?: number;
29
+ color?: string;
30
+ opacity?: number;
31
+ hoverColor?: string;
32
+ hoverOpacity?: number;
33
+ }
34
+ export interface TrackConfig {
35
+ width?: number;
36
+ color?: string;
37
+ visible?: boolean;
38
+ alignment?: "center" | "right";
39
+ radius?: number;
40
+ margin?: number;
41
+ }
42
+ export interface ArrowsConfig {
43
+ visible?: boolean;
44
+ step?: number;
45
+ color?: string;
46
+ opacity?: number;
47
+ hoverColor?: string;
48
+ hoverOpacity?: number;
49
+ }
50
+ export interface DragScrollConfig {
51
+ enabled?: boolean;
52
+ excludeClasses?: string[];
53
+ excludeSelectors?: string[];
54
+ }
55
+ export interface AutoHideConfig {
56
+ enabled?: boolean;
57
+ delay?: number;
58
+ delayOnWheel?: number;
59
+ }
60
+ export interface OverlayScrollbarProps {
61
+ className?: string;
62
+ style?: React.CSSProperties;
63
+ children: ReactNode;
64
+ onScroll?: (event: Event) => void;
65
+ thumb?: ThumbConfig;
66
+ track?: TrackConfig;
67
+ arrows?: ArrowsConfig;
68
+ dragScroll?: DragScrollConfig;
69
+ autoHide?: AutoHideConfig;
70
+ showScrollbar?: boolean;
71
+ }
72
+ export interface OverlayScrollbarRef {
73
+ getScrollContainer: () => HTMLDivElement | null;
74
+ scrollTo: (options: ScrollToOptions) => void;
75
+ scrollTop: number;
76
+ scrollHeight: number;
77
+ clientHeight: number;
78
+ }
79
+ declare const OverlayScrollbar: React.ForwardRefExoticComponent<OverlayScrollbarProps & React.RefAttributes<OverlayScrollbarRef>>;
80
+ export default OverlayScrollbar;
81
+ export { OverlayScrollbar };
@@ -0,0 +1,28 @@
1
+ /**
2
+ * VirtualDataTable.tsx
3
+ *
4
+ * MIT License
5
+ *
6
+ import { VirtuosoScrollbar } from './components/Scrollbar'; Copyright (c) 2025 KIM YOUNG JIN (ehfuse@gmail.com)
7
+ *
8
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ * of this software and associated documentation files (the "Software"), to deal
10
+ * in the Software without restriction, including without limitation the rights
11
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ * copies of the Software, and to permit persons to whom the Software is
13
+ * furnished to do so, subject to the following conditions:
14
+ *
15
+ * The above copyright notice and this permission notice shall be included in all
16
+ * copies or substantial portions of the Software.
17
+ *
18
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ * SOFTWARE.
25
+ */
26
+ import React from "react";
27
+ import type { VirtualDataTableProps } from "./types";
28
+ export declare const VirtualDataTable: <T>(props: VirtualDataTableProps<T>) => React.JSX.Element;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * VirtuosoScrollbar.tsx
3
+ *
4
+ * @license Proprietary License (독점 라이선스)
5
+ * @copyright 2025 김영진 (Kim Young Jin)
6
+ * @author 김영진 (ehfuse@gmail.com)
7
+ * @contact 010-3094-9944
8
+ *
9
+ * IMPORTANT NOTICE (중요 공지):
10
+ * This code is the intellectual property of 김영진 (Kim Young Jin).
11
+ * All rights reserved. Unauthorized copying, modification, distribution,
12
+ * or use of this code is strictly prohibited without prior written
13
+ * permission from the copyright holder.
14
+ *
15
+ * 이 코드는 김영진의 지적재산권입니다.
16
+ * 모든 권리가 보호됩니다. 저작권자의 사전 서면 허가 없이
17
+ * 무단 복사, 수정, 배포 또는 사용을 엄격히 금지합니다.
18
+ *
19
+ * For licensing inquiries, please contact (라이선스 문의):
20
+ * Email: ehfuse@gmail.com
21
+ * Phone: 010-3094-9944
22
+ */
23
+ import React, { ReactNode } from "react";
24
+ interface VirtuosoScrollbarProps {
25
+ children: ReactNode;
26
+ height?: string | number;
27
+ width?: string | number;
28
+ onScroll?: (event: Event) => void;
29
+ }
30
+ export declare const VirtuosoScrollbar: React.FC<VirtuosoScrollbarProps>;
31
+ export default VirtuosoScrollbar;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * MIT License
3
+ *
4
+ * Copyright (c) 2025 KIM YOUNG JIN (ehfuse@gmail.com)
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in all
14
+ * copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ * SOFTWARE.
23
+ */
24
+ interface LoadingProps {
25
+ visible?: boolean;
26
+ onComplete?: () => void;
27
+ }
28
+ export declare const Loading: ({ visible, onComplete }: LoadingProps) => import("react/jsx-runtime").JSX.Element | null;
29
+ export {};
@@ -0,0 +1,39 @@
1
+ /**
2
+ * MIT License
3
+ *
4
+ * Copyright (c) 2025 KIM YOUNG JIN (ehfuse@gmail.com)
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in all
14
+ * copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ * SOFTWARE.
23
+ */
24
+ import React from "react";
25
+ import type { ReactNode } from "react";
26
+ export interface VirtuosoScrollbarProps {
27
+ children: ReactNode;
28
+ onScroll?: (event: Event) => void;
29
+ visible?: boolean;
30
+ hideDelay?: number;
31
+ hideDelayOnWheel?: number;
32
+ trackWidth?: number;
33
+ thumbWidth?: number;
34
+ trackColor?: string;
35
+ thumbColor?: string;
36
+ thumbHoverColor?: string;
37
+ thumbActiveColor?: string;
38
+ }
39
+ export declare const VirtuosoScrollbar: React.FC<VirtuosoScrollbarProps>;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Virtual Data Table - A high-performance virtual data table component for React
3
+ *
4
+ * @license MIT
5
+ * @copyright 2025 김영진 (Kim Young Jin)
6
+ * @author 김영진 (ehfuse@gmail.com)
7
+ */
8
+ export { VirtualDataTable } from "./VirtualDataTable";
9
+ export type { DataColumn, SortDirection, SortableFilter, VirtualDataTableProps, } from "./types";