@coderlifenet/ui-components 0.1.0-alpha.2

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) 2026 CoderLife
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,32 @@
1
+ # @coderlifenet/ui-components
2
+
3
+ Advanced components built on top of `@coderlifenet/ui-core` public APIs only.
4
+
5
+ ## Components
6
+
7
+ - `DataTable`
8
+ - `TreeExplorer`
9
+ - `DashboardLayout`
10
+
11
+ ## Install
12
+
13
+ ```bash
14
+ pnpm add @coderlifenet/ui-components@0.1.0-alpha.2 @coderlifenet/ui-core@0.1.0-alpha.2 @mui/material@9.4.0 @emotion/react@11.14.0 @emotion/styled@11.14.1 react@19.2.8 react-dom@19.2.8
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ```tsx
20
+ import { DataTable, TreeExplorer, DashboardLayout } from "@coderlifenet/ui-components";
21
+ ```
22
+
23
+ ## Feature Scope
24
+
25
+ - DataTable: typed columns/rows, sorting/filtering/pagination/selection, loading/empty/error states, toolbar actions.
26
+ - TreeExplorer: typed hierarchical nodes, controlled/uncontrolled expansion and selection, keyboard support.
27
+ - DashboardLayout: responsive shell with header/sidebar/navigation/breadcrumb slots and mobile drawer behavior.
28
+
29
+ ## Notes
30
+
31
+ - This package does not claim MUI X Pro/Premium compatibility.
32
+ - Large-data virtualization, grouping, pivoting, and charting are roadmap items.
@@ -0,0 +1,24 @@
1
+ import type { ComponentProps, JSX } from "react";
2
+ import { Box } from "@coderlifenet/ui-core";
3
+ type UINode = ComponentProps<typeof Box>["children"];
4
+ export interface NavigationItem {
5
+ id: string;
6
+ label: string;
7
+ href?: string;
8
+ onNavigate?: () => void;
9
+ }
10
+ export interface DashboardLayoutProps {
11
+ title: UINode;
12
+ breadcrumbs?: readonly NavigationItem[];
13
+ navigationItems?: readonly NavigationItem[];
14
+ sidebar?: UINode;
15
+ headerEnd?: UINode;
16
+ children: UINode;
17
+ sidebarOpen?: boolean;
18
+ defaultSidebarOpen?: boolean;
19
+ onSidebarOpenChange?: (open: boolean) => void;
20
+ semanticTrackingOnly?: boolean;
21
+ }
22
+ export declare function DashboardLayout({ title, breadcrumbs, navigationItems, sidebar, headerEnd, children, sidebarOpen, defaultSidebarOpen, onSidebarOpenChange, semanticTrackingOnly }: DashboardLayoutProps): JSX.Element;
23
+ export {};
24
+ //# sourceMappingURL=DashboardLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardLayout.d.ts","sourceRoot":"","sources":["../../src/components/DashboardLayout.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAEL,GAAG,EAUJ,MAAM,uBAAuB,CAAC;AAI/B,KAAK,MAAM,GAAG,cAAc,CAAC,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IACxC,eAAe,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,WAAgB,EAChB,eAAoB,EACpB,OAAO,EACP,SAAS,EACT,QAAQ,EACR,WAAW,EACX,kBAAyB,EACzB,mBAAmB,EACnB,oBAA2B,EAC5B,EAAE,oBAAoB,GAAG,GAAG,CAAC,OAAO,CA+GpC"}
@@ -0,0 +1,45 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { AppBar, Box, Breadcrumbs, Drawer, IconButton, Link, Stack, Toolbar, Typography, useMediaQuery, useTheme } from "@coderlifenet/ui-core";
5
+ import { TrackingBoundary } from "@coderlifenet/ui-core/extensions";
6
+ import { useEmitUIEvent } from "@coderlifenet/ui-core/instrumentation";
7
+ export function DashboardLayout({ title, breadcrumbs = [], navigationItems = [], sidebar, headerEnd, children, sidebarOpen, defaultSidebarOpen = true, onSidebarOpenChange, semanticTrackingOnly = true }) {
8
+ const emit = useEmitUIEvent();
9
+ const theme = useTheme();
10
+ const isDesktop = useMediaQuery(theme.breakpoints.up("md"));
11
+ const [internalSidebarOpen, setInternalSidebarOpen] = useState(defaultSidebarOpen);
12
+ const activeSidebarOpen = sidebarOpen ?? internalSidebarOpen;
13
+ const setOpen = (next) => {
14
+ if (onSidebarOpenChange) {
15
+ onSidebarOpenChange(next);
16
+ }
17
+ else {
18
+ setInternalSidebarOpen(next);
19
+ }
20
+ emit({ type: "ui.dashboard.sidebar_toggle", action: "toggle_sidebar", component: "DashboardLayout", metadata: { open: next } });
21
+ };
22
+ const drawerContent = (_jsx(Box, { component: "nav", "aria-label": "Primary", children: _jsxs(Stack, { spacing: 1, sx: { p: 2 }, children: [navigationItems.map((item) => (_jsx(Link, { href: item.href ?? "#", underline: "hover", onClick: (event) => {
23
+ if (!item.href) {
24
+ event.preventDefault();
25
+ }
26
+ item.onNavigate?.();
27
+ emit({
28
+ type: "ui.dashboard.navigate",
29
+ action: "navigate",
30
+ component: "DashboardLayout",
31
+ semanticId: item.id
32
+ });
33
+ }, children: item.label }, item.id))), sidebar] }) }));
34
+ const content = (_jsxs(Box, { sx: { minHeight: "100vh", display: "grid", gridTemplateRows: "auto 1fr" }, children: [_jsx(AppBar, { position: "sticky", color: "default", elevation: 0, children: _jsxs(Toolbar, { children: [_jsx(IconButton, { edge: "start", "aria-label": "Open navigation", onClick: () => setOpen(!activeSidebarOpen), children: _jsx(Typography, { variant: "button", children: "Menu" }) }), _jsx(Typography, { variant: "h6", sx: { ml: 1, flexGrow: 1 }, children: title }), headerEnd] }) }), _jsxs(Box, { sx: { display: "grid", gridTemplateColumns: { md: activeSidebarOpen ? "280px 1fr" : "1fr" }, minHeight: 0 }, children: [isDesktop ? (activeSidebarOpen ? (_jsx(Box, { component: "aside", sx: { borderRight: `1px solid ${theme.palette.divider}` }, children: drawerContent })) : null) : (_jsx(Drawer, { open: activeSidebarOpen, onClose: () => setOpen(false), ModalProps: { keepMounted: true }, children: drawerContent })), _jsxs(Box, { component: "main", sx: { p: 2 }, children: [breadcrumbs.length > 0 ? (_jsx(Breadcrumbs, { "aria-label": "Breadcrumb", children: breadcrumbs.map((item) => (_jsx(Link, { href: item.href ?? "#", onClick: (event) => {
35
+ if (!item.href) {
36
+ event.preventDefault();
37
+ }
38
+ item.onNavigate?.();
39
+ }, children: item.label }, item.id))) })) : null, _jsx(Box, { sx: { mt: breadcrumbs.length > 0 ? 2 : 0 }, children: children })] })] })] }));
40
+ if (!semanticTrackingOnly) {
41
+ return content;
42
+ }
43
+ return (_jsx(TrackingBoundary, { id: "dashboard-layout-internal", optOut: true, children: content }));
44
+ }
45
+ //# sourceMappingURL=DashboardLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardLayout.js","sourceRoot":"","sources":["../../src/components/DashboardLayout.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { ComponentProps, JSX } from "react";
2
+ import { Box } from "@coderlifenet/ui-core";
3
+ export type SortDirection = "asc" | "desc";
4
+ type UINode = ComponentProps<typeof Box>["children"];
5
+ export interface DataTableSortState {
6
+ columnId: string;
7
+ direction: SortDirection;
8
+ }
9
+ export interface DataTableColumn<TRow> {
10
+ id: string;
11
+ header: UINode;
12
+ accessor: (row: TRow) => UINode;
13
+ sortValue?: (row: TRow) => string | number;
14
+ filterValue?: (row: TRow) => string;
15
+ align?: "left" | "right" | "center";
16
+ }
17
+ export interface DataTableProps<TRow> {
18
+ rows: readonly TRow[];
19
+ columns: readonly DataTableColumn<TRow>[];
20
+ getRowId: (row: TRow) => string;
21
+ loading?: boolean;
22
+ error?: string;
23
+ serverMode?: boolean;
24
+ page?: number;
25
+ pageSize?: number;
26
+ onPageChange?: (page: number) => void;
27
+ onPageSizeChange?: (pageSize: number) => void;
28
+ sort?: DataTableSortState | null;
29
+ onSortChange?: (sort: DataTableSortState | null) => void;
30
+ filterQuery?: string;
31
+ onFilterQueryChange?: (query: string) => void;
32
+ selectedRowIds?: readonly string[];
33
+ onSelectedRowIdsChange?: (next: readonly string[]) => void;
34
+ toolbarActions?: UINode;
35
+ onRefresh?: () => void;
36
+ emptyMessage?: string;
37
+ semanticTrackingOnly?: boolean;
38
+ }
39
+ export declare function DataTable<TRow>({ rows, columns, getRowId, loading, error, serverMode, page, pageSize, onPageChange, onPageSizeChange, sort, onSortChange, filterQuery, onFilterQueryChange, selectedRowIds, onSelectedRowIdsChange, toolbarActions, onRefresh, emptyMessage, semanticTrackingOnly }: DataTableProps<TRow>): JSX.Element;
40
+ export {};
41
+ //# sourceMappingURL=DataTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../src/components/DataTable.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAEL,GAAG,EAiBJ,MAAM,uBAAuB,CAAC;AAI/B,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAE3C,KAAK,MAAM,GAAG,cAAc,CAAC,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe,CAAC,IAAI;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,MAAM,CAAC;IAChC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,MAAM,GAAG,MAAM,CAAC;IAC3C,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,MAAM,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;CACrC;AAED,MAAM,WAAW,cAAc,CAAC,IAAI;IAClC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC;IACtB,OAAO,EAAE,SAAS,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,QAAQ,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,IAAI,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACjC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,KAAK,IAAI,CAAC;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,sBAAsB,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAC;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAOD,wBAAgB,SAAS,CAAC,IAAI,EAAE,EAC9B,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,OAAe,EACf,KAAK,EACL,UAAkB,EAClB,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,sBAAsB,EACtB,cAAc,EACd,SAAS,EACT,YAAkC,EAClC,oBAA2B,EAC5B,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CA4QpC"}
@@ -0,0 +1,165 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useMemo, useState } from "react";
4
+ import { Alert, Box, Checkbox, CircularProgress, IconButton, Paper, Stack, Table, TableBody, TableCell, TableContainer, TableHead, TablePagination, TableRow, TableSortLabel, TextField, Toolbar, Typography } from "@coderlifenet/ui-core";
5
+ import { TrackingBoundary } from "@coderlifenet/ui-core/extensions";
6
+ import { useEmitUIEvent } from "@coderlifenet/ui-core/instrumentation";
7
+ function compareValues(a, b, direction) {
8
+ const result = a > b ? 1 : a < b ? -1 : 0;
9
+ return direction === "asc" ? result : result * -1;
10
+ }
11
+ export function DataTable({ rows, columns, getRowId, loading = false, error, serverMode = false, page, pageSize, onPageChange, onPageSizeChange, sort, onSortChange, filterQuery, onFilterQueryChange, selectedRowIds, onSelectedRowIdsChange, toolbarActions, onRefresh, emptyMessage = "No records found.", semanticTrackingOnly = true }) {
12
+ const emit = useEmitUIEvent();
13
+ const [internalPage, setInternalPage] = useState(0);
14
+ const [internalPageSize, setInternalPageSize] = useState(10);
15
+ const [internalSort, setInternalSort] = useState(null);
16
+ const [internalFilter, setInternalFilter] = useState("");
17
+ const [internalSelectedRowIds, setInternalSelectedRowIds] = useState([]);
18
+ const activePage = page ?? internalPage;
19
+ const activePageSize = pageSize ?? internalPageSize;
20
+ const activeSort = sort ?? internalSort;
21
+ const activeFilter = filterQuery ?? internalFilter;
22
+ const activeSelectedRowIds = selectedRowIds ?? internalSelectedRowIds;
23
+ const filteredRows = useMemo(() => {
24
+ if (serverMode) {
25
+ return rows;
26
+ }
27
+ if (!activeFilter.trim()) {
28
+ return rows;
29
+ }
30
+ const query = activeFilter.toLowerCase();
31
+ return rows.filter((row) => columns.some((column) => {
32
+ const value = column.filterValue?.(row) ?? String(column.accessor(row));
33
+ return value.toLowerCase().includes(query);
34
+ }));
35
+ }, [activeFilter, columns, rows, serverMode]);
36
+ const sortedRows = useMemo(() => {
37
+ if (serverMode || !activeSort) {
38
+ return filteredRows;
39
+ }
40
+ const column = columns.find((entry) => entry.id === activeSort.columnId);
41
+ if (!column) {
42
+ return filteredRows;
43
+ }
44
+ return [...filteredRows].sort((a, b) => {
45
+ const aValue = column.sortValue?.(a) ?? String(column.accessor(a));
46
+ const bValue = column.sortValue?.(b) ?? String(column.accessor(b));
47
+ return compareValues(aValue, bValue, activeSort.direction);
48
+ });
49
+ }, [activeSort, columns, filteredRows, serverMode]);
50
+ const pagedRows = useMemo(() => {
51
+ if (serverMode) {
52
+ return sortedRows;
53
+ }
54
+ const start = activePage * activePageSize;
55
+ const end = start + activePageSize;
56
+ return sortedRows.slice(start, end);
57
+ }, [activePage, activePageSize, serverMode, sortedRows]);
58
+ const allSelected = pagedRows.length > 0 && pagedRows.every((row) => activeSelectedRowIds.includes(getRowId(row)));
59
+ const setPageValue = (next) => {
60
+ if (onPageChange) {
61
+ onPageChange(next);
62
+ }
63
+ else {
64
+ setInternalPage(next);
65
+ }
66
+ emit({
67
+ type: "ui.table.page_change",
68
+ action: "paginate",
69
+ component: "DataTable",
70
+ metadata: { page: next }
71
+ });
72
+ };
73
+ const setPageSizeValue = (next) => {
74
+ if (onPageSizeChange) {
75
+ onPageSizeChange(next);
76
+ }
77
+ else {
78
+ setInternalPageSize(next);
79
+ setInternalPage(0);
80
+ }
81
+ emit({
82
+ type: "ui.table.page_size_change",
83
+ action: "page_size",
84
+ component: "DataTable",
85
+ metadata: { pageSize: next }
86
+ });
87
+ };
88
+ const setSortValue = (next) => {
89
+ if (onSortChange) {
90
+ onSortChange(next);
91
+ }
92
+ else {
93
+ setInternalSort(next);
94
+ }
95
+ emit({
96
+ type: "ui.table.sort_change",
97
+ action: "sort",
98
+ component: "DataTable",
99
+ metadata: { hasSort: Boolean(next) }
100
+ });
101
+ };
102
+ const setFilterValue = (next) => {
103
+ if (onFilterQueryChange) {
104
+ onFilterQueryChange(next);
105
+ }
106
+ else {
107
+ setInternalFilter(next);
108
+ }
109
+ emit({
110
+ type: "ui.table.filter_change",
111
+ action: "filter",
112
+ component: "DataTable",
113
+ metadata: { queryLength: next.length }
114
+ });
115
+ };
116
+ const setSelectionValue = (next) => {
117
+ if (onSelectedRowIdsChange) {
118
+ onSelectedRowIdsChange(next);
119
+ }
120
+ else {
121
+ setInternalSelectedRowIds(next);
122
+ }
123
+ emit({
124
+ type: "ui.table.selection_change",
125
+ action: "select",
126
+ component: "DataTable",
127
+ metadata: { selectedCount: next.length }
128
+ });
129
+ };
130
+ const content = (_jsxs(Paper, { children: [_jsx(Toolbar, { children: _jsxs(Stack, { direction: { xs: "column", sm: "row" }, spacing: 2, sx: { width: "100%", alignItems: { sm: "center" } }, children: [_jsx(Typography, { variant: "h6", sx: { flexGrow: 1 }, children: "Data Table" }), _jsx(TextField, { size: "small", label: "Filter", value: activeFilter, onChange: (event) => setFilterValue(event.target.value) }), toolbarActions, onRefresh ? (_jsx(IconButton, { "aria-label": "Refresh table", onClick: () => {
131
+ onRefresh();
132
+ emit({ type: "ui.table.refresh", action: "refresh", component: "DataTable" });
133
+ }, children: _jsx(Typography, { variant: "caption", children: "R" }) })) : null] }) }), error ? _jsx(Alert, { severity: "error", children: error }) : null, _jsx(TableContainer, { sx: { maxWidth: "100%", overflowX: "auto" }, children: _jsxs(Table, { "aria-label": "Data table", children: [_jsx(TableHead, { children: _jsxs(TableRow, { children: [_jsx(TableCell, { padding: "checkbox", children: _jsx(Checkbox, { slotProps: { input: { "aria-label": "Select all rows" } }, checked: allSelected, onChange: (event) => {
134
+ if (event.target.checked) {
135
+ setSelectionValue(pagedRows.map((row) => getRowId(row)));
136
+ }
137
+ else {
138
+ setSelectionValue([]);
139
+ }
140
+ } }) }), columns.map((column) => {
141
+ const isSorted = activeSort?.columnId === column.id;
142
+ return (_jsx(TableCell, { align: column.align ?? "left", children: _jsx(TableSortLabel, { active: isSorted, direction: isSorted ? activeSort.direction : "asc", onClick: () => {
143
+ if (!isSorted) {
144
+ setSortValue({ columnId: column.id, direction: "asc" });
145
+ return;
146
+ }
147
+ const nextDirection = activeSort.direction === "asc" ? "desc" : "asc";
148
+ setSortValue({ columnId: column.id, direction: nextDirection });
149
+ }, children: column.header }) }, column.id));
150
+ })] }) }), _jsx(TableBody, { children: loading ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: columns.length + 1, children: _jsx(Box, { sx: { display: "flex", justifyContent: "center", py: 3 }, children: _jsx(CircularProgress, { size: 24 }) }) }) })) : pagedRows.length === 0 ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: columns.length + 1, children: _jsx(Typography, { sx: { py: 2 }, children: emptyMessage }) }) })) : (pagedRows.map((row) => {
151
+ const rowId = getRowId(row);
152
+ const checked = activeSelectedRowIds.includes(rowId);
153
+ return (_jsxs(TableRow, { hover: true, selected: checked, children: [_jsx(TableCell, { padding: "checkbox", children: _jsx(Checkbox, { slotProps: { input: { "aria-label": `Select row ${rowId}` } }, checked: checked, onChange: (event) => {
154
+ const next = event.target.checked
155
+ ? [...activeSelectedRowIds, rowId]
156
+ : activeSelectedRowIds.filter((id) => id !== rowId);
157
+ setSelectionValue(next);
158
+ } }) }), columns.map((column) => (_jsx(TableCell, { align: column.align ?? "left", children: column.accessor(row) }, column.id)))] }, rowId));
159
+ })) })] }) }), _jsx(TablePagination, { component: "div", count: serverMode ? rows.length : sortedRows.length, page: activePage, rowsPerPage: activePageSize, rowsPerPageOptions: [...new Set([activePageSize, 5, 10, 25, 50])].sort((a, b) => a - b), onPageChange: (_, next) => setPageValue(next), onRowsPerPageChange: (event) => setPageSizeValue(Number(event.target.value)) })] }));
160
+ if (!semanticTrackingOnly) {
161
+ return content;
162
+ }
163
+ return (_jsx(TrackingBoundary, { id: "datatable-internal", optOut: true, children: content }));
164
+ }
165
+ //# sourceMappingURL=DataTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.js","sourceRoot":"","sources":["../../src/components/DataTable.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ComponentProps, JSX } from "react";
2
+ import { ListItemText } from "@coderlifenet/ui-core";
3
+ type TreeLabelNode = ComponentProps<typeof ListItemText>["primary"];
4
+ export interface TreeExplorerNode {
5
+ id: string;
6
+ label: TreeLabelNode;
7
+ disabled?: boolean;
8
+ children?: readonly TreeExplorerNode[];
9
+ }
10
+ export interface TreeExplorerProps {
11
+ nodes: readonly TreeExplorerNode[];
12
+ expandedIds?: readonly string[];
13
+ defaultExpandedIds?: readonly string[];
14
+ selectedId?: string | null;
15
+ defaultSelectedId?: string | null;
16
+ onExpandedIdsChange?: (ids: readonly string[]) => void;
17
+ onSelectedIdChange?: (id: string | null) => void;
18
+ loading?: boolean;
19
+ emptyMessage?: string;
20
+ renderLabel?: (node: TreeExplorerNode) => TreeLabelNode;
21
+ }
22
+ export declare function TreeExplorer({ nodes, expandedIds, defaultExpandedIds, selectedId, defaultSelectedId, onExpandedIdsChange, onSelectedIdChange, loading, emptyMessage, renderLabel }: TreeExplorerProps): JSX.Element;
23
+ export {};
24
+ //# sourceMappingURL=TreeExplorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeExplorer.d.ts","sourceRoot":"","sources":["../../src/components/TreeExplorer.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,GAAG,EAAiB,MAAM,OAAO,CAAC;AAChE,OAAO,EAKL,YAAY,EAGb,MAAM,uBAAuB,CAAC;AAG/B,KAAK,aAAa,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAC;IACvD,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACjD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,aAAa,CAAC;CACzD;AAkBD,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,WAAW,EACX,kBAAuB,EACvB,UAAU,EACV,iBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,OAAe,EACf,YAA8B,EAC9B,WAAW,EACZ,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,CA2HjC"}
@@ -0,0 +1,100 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useMemo, useState } from "react";
4
+ import { Box, Collapse, List, ListItemButton, ListItemText, Stack, Typography } from "@coderlifenet/ui-core";
5
+ import { useEmitUIEvent } from "@coderlifenet/ui-core/instrumentation";
6
+ function flatten(nodes, expanded, depth = 1) {
7
+ const output = [];
8
+ for (const node of nodes) {
9
+ output.push({ node, depth });
10
+ if (node.children && node.children.length > 0 && expanded.has(node.id)) {
11
+ output.push(...flatten(node.children, expanded, depth + 1));
12
+ }
13
+ }
14
+ return output;
15
+ }
16
+ export function TreeExplorer({ nodes, expandedIds, defaultExpandedIds = [], selectedId, defaultSelectedId = null, onExpandedIdsChange, onSelectedIdChange, loading = false, emptyMessage = "No tree data.", renderLabel }) {
17
+ const emit = useEmitUIEvent();
18
+ const [internalExpandedIds, setInternalExpandedIds] = useState(defaultExpandedIds);
19
+ const [internalSelectedId, setInternalSelectedId] = useState(defaultSelectedId);
20
+ const activeExpandedIds = expandedIds ?? internalExpandedIds;
21
+ const activeSelectedId = selectedId ?? internalSelectedId;
22
+ const expandedSet = useMemo(() => new Set(activeExpandedIds), [activeExpandedIds]);
23
+ const flatNodes = useMemo(() => flatten(nodes, expandedSet), [nodes, expandedSet]);
24
+ const setExpanded = (next) => {
25
+ if (onExpandedIdsChange) {
26
+ onExpandedIdsChange(next);
27
+ }
28
+ else {
29
+ setInternalExpandedIds(next);
30
+ }
31
+ emit({ type: "ui.tree.expand_change", action: "expand", component: "TreeExplorer", metadata: { expanded: next.length } });
32
+ };
33
+ const setSelected = (next) => {
34
+ if (onSelectedIdChange) {
35
+ onSelectedIdChange(next);
36
+ }
37
+ else {
38
+ setInternalSelectedId(next);
39
+ }
40
+ emit(next
41
+ ? { type: "ui.tree.selection_change", action: "select", component: "TreeExplorer", semanticId: next }
42
+ : { type: "ui.tree.selection_change", action: "select", component: "TreeExplorer" });
43
+ };
44
+ const toggleNode = (node) => {
45
+ if (!node.children || node.children.length === 0 || node.disabled) {
46
+ return;
47
+ }
48
+ if (expandedSet.has(node.id)) {
49
+ setExpanded(activeExpandedIds.filter((id) => id !== node.id));
50
+ return;
51
+ }
52
+ setExpanded([...activeExpandedIds, node.id]);
53
+ };
54
+ const handleKeyDown = (event) => {
55
+ const currentIndex = flatNodes.findIndex((item) => item.node.id === activeSelectedId);
56
+ if (event.key === "ArrowDown") {
57
+ event.preventDefault();
58
+ const next = flatNodes[Math.min(currentIndex + 1, flatNodes.length - 1)];
59
+ if (next && !next.node.disabled) {
60
+ setSelected(next.node.id);
61
+ }
62
+ }
63
+ if (event.key === "ArrowUp") {
64
+ event.preventDefault();
65
+ const next = flatNodes[Math.max(currentIndex - 1, 0)];
66
+ if (next && !next.node.disabled) {
67
+ setSelected(next.node.id);
68
+ }
69
+ }
70
+ if (event.key === "ArrowRight") {
71
+ event.preventDefault();
72
+ const current = flatNodes[currentIndex]?.node;
73
+ if (current) {
74
+ toggleNode(current);
75
+ }
76
+ }
77
+ if (event.key === "ArrowLeft") {
78
+ event.preventDefault();
79
+ const current = flatNodes[currentIndex]?.node;
80
+ if (current && expandedSet.has(current.id)) {
81
+ setExpanded(activeExpandedIds.filter((id) => id !== current.id));
82
+ }
83
+ }
84
+ };
85
+ if (loading) {
86
+ return _jsx(Typography, { children: "Loading tree..." });
87
+ }
88
+ if (nodes.length === 0) {
89
+ return _jsx(Typography, { children: emptyMessage });
90
+ }
91
+ return (_jsx(Box, { role: "tree", "aria-label": "Tree explorer", children: _jsx(List, { role: "group", onKeyDown: handleKeyDown, children: flatNodes.map(({ node, depth }) => {
92
+ const isExpanded = expandedSet.has(node.id);
93
+ const hasChildren = Boolean(node.children && node.children.length > 0);
94
+ return (_jsxs(Stack, { children: [_jsxs(ListItemButton, { role: "treeitem", "aria-expanded": hasChildren ? isExpanded : undefined, "aria-selected": activeSelectedId === node.id, disabled: node.disabled ?? false, selected: activeSelectedId === node.id, onClick: () => {
95
+ setSelected(node.id);
96
+ toggleNode(node);
97
+ }, sx: { pl: depth * 2 }, children: [hasChildren ? _jsx(Typography, { sx: { width: 16 }, children: isExpanded ? "v" : ">" }) : null, _jsx(ListItemText, { primary: renderLabel ? renderLabel(node) : node.label })] }), hasChildren ? (_jsx(Collapse, { in: isExpanded, timeout: "auto", unmountOnExit: true, children: _jsx(Box, { role: "group" }) })) : null] }, node.id));
98
+ }) }) }));
99
+ }
100
+ //# sourceMappingURL=TreeExplorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeExplorer.js","sourceRoot":"","sources":["../../src/components/TreeExplorer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { DataTable } from "./components/DataTable.js";
2
+ export type { DataTableProps, DataTableColumn } from "./components/DataTable.js";
3
+ export { TreeExplorer } from "./components/TreeExplorer.js";
4
+ export type { TreeExplorerNode, TreeExplorerProps } from "./components/TreeExplorer.js";
5
+ export { DashboardLayout } from "./components/DashboardLayout.js";
6
+ export type { DashboardLayoutProps } from "./components/DashboardLayout.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAExF,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,YAAY,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { DataTable } from "./components/DataTable.js";
2
+ export { TreeExplorer } from "./components/TreeExplorer.js";
3
+ export { DashboardLayout } from "./components/DashboardLayout.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "@coderlifenet/ui-components",
3
+ "version": "0.1.0-alpha.2",
4
+ "description": "Advanced components built on @coderlifenet/ui-core.",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/CoderLifeNet/ui-components.git"
8
+ },
9
+ "homepage": "https://github.com/CoderLifeNet/ui-components#readme",
10
+ "bugs": "https://github.com/CoderLifeNet/ui-components/issues",
11
+ "main": "./dist/index.js",
12
+ "module": "./dist/index.js",
13
+ "types": "./dist/index.d.ts",
14
+ "keywords": [
15
+ "react",
16
+ "mui",
17
+ "datatable",
18
+ "tree",
19
+ "dashboard"
20
+ ],
21
+ "author": "CoderLife",
22
+ "license": "MIT",
23
+ "type": "module",
24
+ "files": [
25
+ "dist",
26
+ "README.md",
27
+ "LICENSE"
28
+ ],
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "default": "./dist/index.js"
33
+ },
34
+ "./DataTable": {
35
+ "types": "./dist/components/DataTable.d.ts",
36
+ "default": "./dist/components/DataTable.js"
37
+ },
38
+ "./TreeExplorer": {
39
+ "types": "./dist/components/TreeExplorer.d.ts",
40
+ "default": "./dist/components/TreeExplorer.js"
41
+ },
42
+ "./DashboardLayout": {
43
+ "types": "./dist/components/DashboardLayout.d.ts",
44
+ "default": "./dist/components/DashboardLayout.js"
45
+ }
46
+ },
47
+ "peerDependencies": {
48
+ "@coderlifenet/ui-core": "0.1.0-alpha.2",
49
+ "@emotion/react": "^11.14.0",
50
+ "@emotion/styled": "^11.14.1",
51
+ "react": "^19.2.8",
52
+ "react-dom": "^19.2.8"
53
+ },
54
+ "publishConfig": {
55
+ "access": "public",
56
+ "tag": "alpha",
57
+ "provenance": true
58
+ },
59
+ "dependencies": {
60
+ "@mui/material": "9.4.0"
61
+ },
62
+ "devDependencies": {
63
+ "@changesets/changelog-github": "1.0.1",
64
+ "@changesets/cli": "3.0.2",
65
+ "@testing-library/jest-dom": "6.9.0",
66
+ "@testing-library/react": "16.3.2",
67
+ "@testing-library/user-event": "14.6.1",
68
+ "@types/node": "24.4.0",
69
+ "@types/react": "19.2.2",
70
+ "@types/react-dom": "19.2.2",
71
+ "@typescript-eslint/eslint-plugin": "8.43.0",
72
+ "@typescript-eslint/parser": "8.43.0",
73
+ "eslint": "9.35.0",
74
+ "jsdom": "27.0.0",
75
+ "playwright": "1.56.1",
76
+ "typescript": "7.0.2",
77
+ "vitest": "4.1.0"
78
+ },
79
+ "scripts": {
80
+ "build": "tsc -p tsconfig.build.json",
81
+ "typecheck": "tsc -p tsconfig.json --noEmit",
82
+ "test": "vitest run",
83
+ "test:watch": "vitest",
84
+ "lint": "eslint .",
85
+ "check:consumers": "node scripts/prepare-artifacts.mjs && pnpm --dir consumers/vite-app install --frozen-lockfile && pnpm --dir consumers/vite-app build && pnpm --dir consumers/next-app install --frozen-lockfile && pnpm --dir consumers/next-app build && pnpm exec playwright install chromium && node scripts/check-consumer-browser.mjs",
86
+ "check:external-consumer": "node scripts/prepare-artifacts.mjs && pnpm --dir consumers/external-check install --frozen-lockfile && pnpm --dir consumers/external-check typecheck && pnpm --dir consumers/external-check why @mui/material && pnpm --dir consumers/external-check why react",
87
+ "check:acceptance": "pnpm typecheck && pnpm test && pnpm build && pnpm pack:local && pnpm check:consumers && pnpm check:external-consumer",
88
+ "pack:local": "pnpm build && node scripts/pack-local.mjs"
89
+ }
90
+ }