@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 +21 -0
- package/README.md +32 -0
- package/dist/components/DashboardLayout.d.ts +24 -0
- package/dist/components/DashboardLayout.d.ts.map +1 -0
- package/dist/components/DashboardLayout.js +45 -0
- package/dist/components/DashboardLayout.js.map +1 -0
- package/dist/components/DataTable.d.ts +41 -0
- package/dist/components/DataTable.d.ts.map +1 -0
- package/dist/components/DataTable.js +165 -0
- package/dist/components/DataTable.js.map +1 -0
- package/dist/components/TreeExplorer.d.ts +24 -0
- package/dist/components/TreeExplorer.d.ts.map +1 -0
- package/dist/components/TreeExplorer.js +100 -0
- package/dist/components/TreeExplorer.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/package.json +90 -0
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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
+
}
|