@synerise/ds-list 1.1.41 → 1.1.43
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/CHANGELOG.md +8 -0
- package/CLAUDE.md +149 -0
- package/README.md +5 -3
- package/dist/List.d.ts +8 -9
- package/dist/List.js +62 -45
- package/dist/List.styles.d.ts +8 -0
- package/dist/List.styles.js +25 -0
- package/dist/List.types.d.ts +30 -3
- package/package.json +8 -11
- package/dist/assets/style/index-tn0RQdqM.css +0 -0
- package/dist/style/index.css +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [1.1.43](https://github.com/Synerise/synerise-design/compare/@synerise/ds-list@1.1.42...@synerise/ds-list@1.1.43) (2026-07-24)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @synerise/ds-list
|
|
9
|
+
|
|
10
|
+
## [1.1.42](https://github.com/Synerise/synerise-design/compare/@synerise/ds-list@1.1.41...@synerise/ds-list@1.1.42) (2026-07-23)
|
|
11
|
+
|
|
12
|
+
**Note:** Version bump only for package @synerise/ds-list
|
|
13
|
+
|
|
6
14
|
## [1.1.41](https://github.com/Synerise/synerise-design/compare/@synerise/ds-list@1.1.40...@synerise/ds-list@1.1.41) (2026-06-27)
|
|
7
15
|
|
|
8
16
|
**Note:** Version bump only for package @synerise/ds-list
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# List (`@synerise/ds-list`)
|
|
2
|
+
> A generic **DS-native** list component (no antd), supporting nested/sectioned data sources, optional radio group wrapping, and styled sub-components for text items, item wrappers, and dividers. Reproduces antd `List`'s DOM + `.ant-list*` class hooks (`.ant-list`, `.ant-list-items`, `.ant-list-header`, `.ant-list-split`, `.ant-list-bordered`) side-by-side with `.ds-list*` hooks so existing consumer stylesheets keep working.
|
|
3
|
+
|
|
4
|
+
## Package structure
|
|
5
|
+
```
|
|
6
|
+
src/
|
|
7
|
+
List.tsx — functional component, renders flat or nested (sectioned) DS-native list
|
|
8
|
+
List.styles.ts — styled-components for the root/header/items(ul)/loading
|
|
9
|
+
List.types.ts — ListPropsType<T> type definition (hand-written, no antd)
|
|
10
|
+
index.ts — public entry point
|
|
11
|
+
modules.d.ts — CSS/Less module declarations
|
|
12
|
+
Elements/
|
|
13
|
+
index.ts — re-exports TextItem, ItemWrapper, ListDivider
|
|
14
|
+
Text/
|
|
15
|
+
Text.tsx — List.Item styled <li> with icon, actions, size, disabled, danger support
|
|
16
|
+
Text.styles.ts — styled-components for Text; defines ListItemType union
|
|
17
|
+
ItemWrapper/
|
|
18
|
+
ItemWrapper.tsx — generic padded wrapper div for arbitrary list row content
|
|
19
|
+
ItemWrapper.styles.ts — styled-components for ItemWrapper
|
|
20
|
+
Divider/
|
|
21
|
+
Divider.tsx — thin wrapper around @synerise/ds-divider with horizontal padding
|
|
22
|
+
Divider.styles.ts — styled-components for Divider
|
|
23
|
+
__spec__/
|
|
24
|
+
List.spec.tsx — Vitest tests
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Public exports
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
export { default } from './List'; // List functional component (default)
|
|
31
|
+
export type { ListPropsType } from './List.types';
|
|
32
|
+
export type { TextProps } from './Elements/Text/Text';
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Static sub-components on `List`
|
|
36
|
+
| Name | Component | Description |
|
|
37
|
+
|------|-----------|-------------|
|
|
38
|
+
| `List.Item` | `TextItem` | Styled `<li>` for text-based rows |
|
|
39
|
+
| `List.ItemWrapper` | `ItemWrapper` | Padded `<div>` wrapper for arbitrary row content (e.g. checkboxes, switches) |
|
|
40
|
+
| `List.Divider` | `ListDivider` | Horizontal rule between sections |
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
### `List<T>` (default export)
|
|
45
|
+
|
|
46
|
+
Hand-written props (`ListPropsType<T>`, no antd). Core props:
|
|
47
|
+
|
|
48
|
+
| Prop | Type | Default | Description |
|
|
49
|
+
|------|------|---------|-------------|
|
|
50
|
+
| `dataSource` | `T[] \| T[][]` | — | Flat array OR nested array of arrays. A nested array renders multiple DS-native list sections separated by `ListDivider`. Only the first section renders the `header`. |
|
|
51
|
+
| `radio` | `boolean` | `undefined` | Wraps the entire rendered list in `Radio.Group` |
|
|
52
|
+
| `options` | `RadioGroupProps` | `undefined` | Props forwarded to the `Radio.Group` wrapper; only used when `radio` is `true` |
|
|
53
|
+
| `dashed` | `boolean` | `undefined` | Controls the dashed style of the auto-rendered `ListDivider` between sections. Note: `ListDivider` defaults `dashed` to `true` when not supplied |
|
|
54
|
+
|
|
55
|
+
Supported antd-`List`-parity props: `bordered`, `header`, `renderItem`, `split`, `loading` (DS `Loader`), `loadMore`, `rowKey`, `itemLayout`, `size`, `className`, `style`, `children`. **Dropped in the de-antd migration (0 real consumer usage):** `grid`, `pagination`, and `locale`/`emptyText` (the default "No data" empty state was removed — consumers render their own) — reintroduce natively if a need appears. `List.Item.Meta` is not implemented (unused).
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
### `List.Item` / `TextItem`
|
|
60
|
+
|
|
61
|
+
Exported type: `TextProps`
|
|
62
|
+
|
|
63
|
+
| Prop | Type | Default | Description |
|
|
64
|
+
|------|------|---------|-------------|
|
|
65
|
+
| `disabled` | `boolean` | `undefined` | Reduces opacity to 0.4, sets `cursor: not-allowed`, removes tabIndex |
|
|
66
|
+
| `icon` | `JSX.Element` | `undefined` | Rendered in `IconWrapper` before content; adjusts `ContentWrapper` left padding |
|
|
67
|
+
| `danger` | `boolean` | `undefined` | Colors text and icon `red-600`; hover background becomes `red-050` |
|
|
68
|
+
| `actions` | `ReactNode` | `undefined` | Rendered at the end of the row in a flex-1 container |
|
|
69
|
+
| `onSelect` | `(e?: MouseEvent \| KeyboardEvent) => void` | `undefined` | Called on click and on `Space` keyup |
|
|
70
|
+
| `size` | `'small' \| 'medium'` | `'small'` | `small`: padding `5px 12px 4px 7px`; `medium`: padding `12px` (left `12px` with icon, `16px` without) |
|
|
71
|
+
| `..htmlAttributes` | `HTMLLIElement attrs` | — | Spread onto the `<li>` element via `WithHTMLAttributes` |
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
### `List.Divider` / `ListDivider`
|
|
76
|
+
|
|
77
|
+
| Prop | Type | Default | Description |
|
|
78
|
+
|------|------|---------|-------------|
|
|
79
|
+
| `dashed` | `boolean` | `true` | Passed to `@synerise/ds-divider`. The divider is always rendered with `marginTop={8}` and `marginBottom={8}`. |
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
### `List.ItemWrapper` / `ItemWrapper`
|
|
84
|
+
|
|
85
|
+
| Prop | Type | Default | Description |
|
|
86
|
+
|------|------|---------|-------------|
|
|
87
|
+
| `children` | `ReactNode` | `undefined` | Wrapped in a `div` with `padding: 8px 12px` |
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Usage patterns
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
import List from '@synerise/ds-list';
|
|
95
|
+
|
|
96
|
+
// Flat single-section list
|
|
97
|
+
<List
|
|
98
|
+
header="Folders"
|
|
99
|
+
dataSource={[{ text: 'Item 1' }]}
|
|
100
|
+
renderItem={(item) => (
|
|
101
|
+
<List.Item size="medium" icon={<Icon component={<FileM />} />} onSelect={() => {}}>
|
|
102
|
+
{item.text}
|
|
103
|
+
</List.Item>
|
|
104
|
+
)}
|
|
105
|
+
/>
|
|
106
|
+
|
|
107
|
+
// Nested (multi-section) list — sections are separated by a ListDivider
|
|
108
|
+
<List
|
|
109
|
+
header="Sections"
|
|
110
|
+
dataSource={[[{ text: 'A' }], [{ text: 'B' }]]}
|
|
111
|
+
dashed={false}
|
|
112
|
+
renderItem={(item) => <List.Item>{item.text}</List.Item>}
|
|
113
|
+
/>
|
|
114
|
+
|
|
115
|
+
// With radio group
|
|
116
|
+
<List
|
|
117
|
+
dataSource={[[{ value: 'a', label: 'Option A' }]]}
|
|
118
|
+
radio
|
|
119
|
+
options={{ defaultValue: 'a' }}
|
|
120
|
+
renderItem={(item) => (
|
|
121
|
+
<List.ItemWrapper>
|
|
122
|
+
<Radio value={item.value}>{item.label}</Radio>
|
|
123
|
+
</List.ItemWrapper>
|
|
124
|
+
)}
|
|
125
|
+
/>
|
|
126
|
+
|
|
127
|
+
// Standalone divider (e.g. between two separate List instances)
|
|
128
|
+
<List.Divider />
|
|
129
|
+
<List.Divider dashed={false} />
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Implementation notes
|
|
133
|
+
|
|
134
|
+
- `List` is a **functional component** (function declaration with statics attached). Items are keyed by `rowKey` (or the item index) — no `uuid`.
|
|
135
|
+
- **Nested detection:** `isNestedArray` (also a named export from `./List`) checks `Array.isArray(array[0])`. An array of arrays renders as multiple DS-native list sections separated by `ListDivider`; only the first section renders the `header`.
|
|
136
|
+
- **`renderItem` contract preserved:** it receives the flattened per-item value + index and may return any node (typically `List.Item`). When no `renderItem` is given, `children` render instead. There is no built-in empty state — when there are no items and no children, nothing is rendered (consumers supply their own).
|
|
137
|
+
- **`footer` is omitted** from `ListPropsType` — it cannot be passed to `List`.
|
|
138
|
+
- `List.Item` spreads all extra props onto the underlying `<li>` via `WithHTMLAttributes<HTMLLIElement, ..>`. Items sit directly under `<ul class="ant-list-items">`, so `.ant-list-items > li` selectors keep working.
|
|
139
|
+
- The `ListDivider` wrapping `div` has `padding: 0 20px` to inset the rule; the `ItemWrapper` `div` has `padding: 8px 12px`.
|
|
140
|
+
- Tests use **Vitest** (`pnpm --filter @synerise/ds-list test`).
|
|
141
|
+
|
|
142
|
+
## Key dependencies
|
|
143
|
+
|
|
144
|
+
| Package | Role |
|
|
145
|
+
|---------|------|
|
|
146
|
+
| `@synerise/ds-radio` | `Radio.Group` wrapping when `radio` is `true`; `RadioGroupProps` type |
|
|
147
|
+
| `@synerise/ds-divider` | Underlying divider in `ListDivider` |
|
|
148
|
+
| `@synerise/ds-loader` | Loading indicator for the `loading` prop |
|
|
149
|
+
| `@synerise/ds-utils` | `WithHTMLAttributes` utility type |
|
package/README.md
CHANGED
|
@@ -11,6 +11,11 @@ List UI Component
|
|
|
11
11
|
|
|
12
12
|
## API
|
|
13
13
|
|
|
14
|
+
> **Note:** As of the antd-removal migration, `@synerise/ds-list` is DS-native. The `grid`,
|
|
15
|
+
> `pagination`, and `locale` props are no longer supported (they had no consumer usage) — the
|
|
16
|
+
> default "No data" empty state was removed, so consumers now render their own empty state.
|
|
17
|
+
> `List.Item.Meta` is not implemented. All other props below are preserved.
|
|
18
|
+
|
|
14
19
|
### List
|
|
15
20
|
|
|
16
21
|
| Property | Description | Type | Default |
|
|
@@ -18,14 +23,11 @@ List UI Component
|
|
|
18
23
|
| bordered | Toggles rendering of the border around the list | boolean | `false` |
|
|
19
24
|
| dataSource | DataSource array or array of arrays for list | `T[] \| T[][]` | - |
|
|
20
25
|
| dashed | Define type of divider line | boolean | `true` |
|
|
21
|
-
| grid | The grid type of list. You can set grid to something like {gutter: 16, column: 4} | object | - |
|
|
22
26
|
| header | List header renderer | string | - |
|
|
23
27
|
| itemLayout | The layout of list, default is horizontal, If a vertical list is desired, set the itemLayout property to vertical | string | - |
|
|
24
28
|
| loading | Shows a loading indicator while the contents of the list are being fetched | boolean / object | `false` |
|
|
25
29
|
| loadMore | Shows a load more content | string / React.ReactNode | - |
|
|
26
|
-
| locale | i18n text including empty text | object | emptyText: 'No Data' |
|
|
27
30
|
| options | Options for radio group, if radio prop is provided | RadioGroupProps | - |
|
|
28
|
-
| pagination | Pagination config, hide it by setting it to`false` | boolean | object |
|
|
29
31
|
| split | Toggles rendering of the split under the list item | boolean | `true` |
|
|
30
32
|
| renderItem | Customize list item when using dataSource | item => ReactNode | - |
|
|
31
33
|
| rowKey | Item's unique key, could be a string or function that returns a string | string / (record) = > string | key |
|
package/dist/List.d.ts
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { default as React } from 'react';
|
|
2
|
-
import { ItemWrapper, ListDivider, TextItem } from './Elements';
|
|
1
|
+
import { default as React, ReactElement } from 'react';
|
|
3
2
|
import { ListPropsType } from './List.types';
|
|
4
3
|
export declare const isNestedArray: <V>(array: V[] | V[][]) => boolean;
|
|
5
|
-
declare
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
declare function List<T>({ dataSource, radio, options, dashed, ...rest }: ListPropsType<T>): ReactElement;
|
|
5
|
+
declare namespace List {
|
|
6
|
+
var Item: ({ disabled, icon, onSelect, danger, actions, children, size, ...htmlAttributes }: import(".").TextProps) => React.JSX.Element;
|
|
7
|
+
var ItemWrapper: ({ children }: {
|
|
8
|
+
children?: React.ReactNode;
|
|
9
|
+
}) => React.JSX.Element;
|
|
10
|
+
var Divider: React.FC<import("./Elements/Divider/Divider").DividerProps>;
|
|
12
11
|
}
|
|
13
12
|
export default List;
|
package/dist/List.js
CHANGED
|
@@ -1,58 +1,75 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { List as List$1 } from "antd";
|
|
3
2
|
import React from "react";
|
|
4
|
-
import
|
|
3
|
+
import Loader from "@synerise/ds-loader";
|
|
5
4
|
import Radio from "@synerise/ds-radio";
|
|
6
5
|
import Text from "./Elements/Text/Text.js";
|
|
7
6
|
import ItemWrapper from "./Elements/ItemWrapper/ItemWrapper.js";
|
|
8
7
|
import ListDivider from "./Elements/Divider/Divider.js";
|
|
9
|
-
import "./
|
|
10
|
-
const RadioGroupWrapper = ({
|
|
11
|
-
children,
|
|
12
|
-
options
|
|
13
|
-
}) => /* @__PURE__ */ jsx(Radio.Group, { ...options, children });
|
|
8
|
+
import { ListRoot, ListHeader, ListLoading, ListItems } from "./List.styles.js";
|
|
14
9
|
const isNestedArray = (array) => {
|
|
15
|
-
return !!array.length && array[0]
|
|
10
|
+
return !!array.length && Array.isArray(array[0]);
|
|
16
11
|
};
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return
|
|
42
|
-
|
|
43
|
-
!isLastItem && /* @__PURE__ */ jsx(ListDivider, { dashed: !!dashed, "data-testid": "divider" })
|
|
44
|
-
] }, v4());
|
|
45
|
-
});
|
|
46
|
-
} else {
|
|
47
|
-
ReadyList = /* @__PURE__ */ jsx(React.Fragment, { children: /* @__PURE__ */ jsx(List$1, { ...rest, dataSource }) }, this.uuidKey || v4());
|
|
12
|
+
const buildRootClassName = (props) => ["ant-list", "ds-list", props.size === "small" && "ant-list-sm", props.size === "large" && "ant-list-lg", props.split !== false && "ant-list-split", props.bordered && "ant-list-bordered", props.loading && "ant-list-loading", props.itemLayout && `ant-list-${props.itemLayout}`, props.className].filter(Boolean).join(" ");
|
|
13
|
+
const SingleList = ({
|
|
14
|
+
items,
|
|
15
|
+
renderItem,
|
|
16
|
+
header,
|
|
17
|
+
bordered,
|
|
18
|
+
split,
|
|
19
|
+
loading,
|
|
20
|
+
size,
|
|
21
|
+
itemLayout,
|
|
22
|
+
loadMore,
|
|
23
|
+
rowKey,
|
|
24
|
+
className,
|
|
25
|
+
style,
|
|
26
|
+
children,
|
|
27
|
+
...htmlAttributes
|
|
28
|
+
}) => {
|
|
29
|
+
const resolveKey = (item, index) => {
|
|
30
|
+
if (typeof rowKey === "function") {
|
|
31
|
+
return rowKey(item);
|
|
32
|
+
}
|
|
33
|
+
if (rowKey && item && typeof item === "object") {
|
|
34
|
+
const value = item[rowKey];
|
|
35
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
48
38
|
}
|
|
49
|
-
return
|
|
50
|
-
}
|
|
39
|
+
return index;
|
|
40
|
+
};
|
|
41
|
+
const hasItems = Boolean(renderItem) && items.length > 0;
|
|
42
|
+
return /* @__PURE__ */ jsxs(ListRoot, { ...htmlAttributes, className: buildRootClassName({
|
|
43
|
+
bordered,
|
|
44
|
+
split,
|
|
45
|
+
loading,
|
|
46
|
+
size,
|
|
47
|
+
itemLayout,
|
|
48
|
+
className
|
|
49
|
+
}), style, $bordered: bordered, children: [
|
|
50
|
+
header !== void 0 && header !== null && /* @__PURE__ */ jsx(ListHeader, { className: "ant-list-header ds-list-header", children: header }),
|
|
51
|
+
loading && /* @__PURE__ */ jsx(ListLoading, { className: "ant-list-loading ds-list-loading", children: /* @__PURE__ */ jsx(Loader, { size: "M" }) }),
|
|
52
|
+
!loading && hasItems && /* @__PURE__ */ jsx(ListItems, { className: "ant-list-items ds-list-items", children: items.map((item, index) => /* @__PURE__ */ jsx(React.Fragment, { children: renderItem?.(item, index) }, resolveKey(item, index))) }),
|
|
53
|
+
!loading && !hasItems && children,
|
|
54
|
+
loadMore
|
|
55
|
+
] });
|
|
51
56
|
};
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
57
|
+
function List({
|
|
58
|
+
dataSource,
|
|
59
|
+
radio,
|
|
60
|
+
options,
|
|
61
|
+
dashed,
|
|
62
|
+
...rest
|
|
63
|
+
}) {
|
|
64
|
+
const content = isNestedArray(dataSource) ? dataSource.map((group, index, groups) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
65
|
+
/* @__PURE__ */ jsx(SingleList, { ...rest, items: group, header: index === 0 ? rest.header : void 0 }),
|
|
66
|
+
index !== groups.length - 1 && /* @__PURE__ */ jsx(ListDivider, { dashed: Boolean(dashed) })
|
|
67
|
+
] }, index)) : /* @__PURE__ */ jsx(SingleList, { ...rest, items: dataSource });
|
|
68
|
+
return radio ? /* @__PURE__ */ jsx(Radio.Group, { ...options, children: content }) : /* @__PURE__ */ jsx(Fragment, { children: content });
|
|
69
|
+
}
|
|
70
|
+
List.Item = Text;
|
|
71
|
+
List.ItemWrapper = ItemWrapper;
|
|
72
|
+
List.Divider = ListDivider;
|
|
56
73
|
export {
|
|
57
74
|
List as default,
|
|
58
75
|
isNestedArray
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const ListRoot: import('styled-components').StyledComponent<"div", any, {
|
|
2
|
+
$bordered?: boolean;
|
|
3
|
+
}, never>;
|
|
4
|
+
/** Reproduces the `.ant-list-header` styling the migration kept in `list.mixin.less`. */
|
|
5
|
+
export declare const ListHeader: import('styled-components').StyledComponent<"div", any, {}, never>;
|
|
6
|
+
/** The `<ul class="ant-list-items">` — reset so items sit flush (antd parity). */
|
|
7
|
+
export declare const ListItems: import('styled-components').StyledComponent<"ul", any, {}, never>;
|
|
8
|
+
export declare const ListLoading: import('styled-components').StyledComponent<"div", any, {}, never>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import styled, { css } from "styled-components";
|
|
2
|
+
const ListRoot = /* @__PURE__ */ styled.div.withConfig({
|
|
3
|
+
displayName: "Liststyles__ListRoot",
|
|
4
|
+
componentId: "sc-jdmigs-0"
|
|
5
|
+
})(["position:relative;", ""], (props) => props.$bordered && css(["border:1px solid ", ";border-radius:3px;"], props.theme.palette["grey-300"]));
|
|
6
|
+
const ListHeader = /* @__PURE__ */ styled.div.withConfig({
|
|
7
|
+
displayName: "Liststyles__ListHeader",
|
|
8
|
+
componentId: "sc-jdmigs-1"
|
|
9
|
+
})(["text-transform:uppercase;font-size:13px;color:", ";padding:8px 12px;border:0;"], ({
|
|
10
|
+
theme
|
|
11
|
+
}) => theme.palette["grey-700"]);
|
|
12
|
+
const ListItems = /* @__PURE__ */ styled.ul.withConfig({
|
|
13
|
+
displayName: "Liststyles__ListItems",
|
|
14
|
+
componentId: "sc-jdmigs-2"
|
|
15
|
+
})(["margin:0;padding:0;list-style:none;"]);
|
|
16
|
+
const ListLoading = /* @__PURE__ */ styled.div.withConfig({
|
|
17
|
+
displayName: "Liststyles__ListLoading",
|
|
18
|
+
componentId: "sc-jdmigs-3"
|
|
19
|
+
})(["display:flex;align-items:center;justify-content:center;padding:16px;"]);
|
|
20
|
+
export {
|
|
21
|
+
ListHeader,
|
|
22
|
+
ListItems,
|
|
23
|
+
ListLoading,
|
|
24
|
+
ListRoot
|
|
25
|
+
};
|
package/dist/List.types.d.ts
CHANGED
|
@@ -1,8 +1,35 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CSSProperties, Key, ReactNode } from 'react';
|
|
2
2
|
import { RadioGroupProps } from '@synerise/ds-radio';
|
|
3
|
-
|
|
3
|
+
import { WithHTMLAttributes } from '@synerise/ds-utils';
|
|
4
|
+
export type ListSize = 'small' | 'default' | 'large';
|
|
5
|
+
export type ListItemLayout = 'horizontal' | 'vertical';
|
|
6
|
+
export type ListPropsType<T> = WithHTMLAttributes<HTMLDivElement, {
|
|
7
|
+
/** Flat list, or an array of groups rendered as separate lists split by a divider. */
|
|
4
8
|
dataSource: T[] | T[][];
|
|
9
|
+
/** Render a single item. Receives the flattened per-item value and its index. */
|
|
10
|
+
renderItem?: (item: T, index: number) => ReactNode;
|
|
11
|
+
/** Rendered once, above the (first) list. */
|
|
12
|
+
header?: ReactNode;
|
|
13
|
+
/** Wrap the list in a border. */
|
|
14
|
+
bordered?: boolean;
|
|
15
|
+
/** Keep the `ant-list-split` hook (borders between items). Defaults to `true`. */
|
|
16
|
+
split?: boolean;
|
|
17
|
+
/** Show a centered loading indicator instead of the items. */
|
|
18
|
+
loading?: boolean;
|
|
19
|
+
itemLayout?: ListItemLayout;
|
|
20
|
+
size?: ListSize;
|
|
21
|
+
/** Node rendered after the items (e.g. a "load more" button). */
|
|
22
|
+
loadMore?: ReactNode;
|
|
23
|
+
/** Key extractor for items. Defaults to the item index. */
|
|
24
|
+
rowKey?: keyof T | ((item: T) => Key);
|
|
25
|
+
className?: string;
|
|
26
|
+
style?: CSSProperties;
|
|
27
|
+
/** Rendered in place of `dataSource`/`renderItem` when no `renderItem` is given. */
|
|
28
|
+
children?: ReactNode;
|
|
29
|
+
/** Wrap the list in a `Radio.Group` (single-select list). */
|
|
5
30
|
radio?: boolean;
|
|
31
|
+
/** Props forwarded to the wrapping `Radio.Group` when `radio` is set. */
|
|
6
32
|
options?: RadioGroupProps;
|
|
33
|
+
/** Dashed divider between groups (nested `dataSource`). */
|
|
7
34
|
dashed?: boolean;
|
|
8
|
-
}
|
|
35
|
+
}>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@synerise/ds-list",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.43",
|
|
4
4
|
"description": "List UI Component for the Synerise Design System",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"repository": "Synerise/synerise-design",
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"files": [
|
|
18
18
|
"/dist",
|
|
19
19
|
"CHANGELOG.md",
|
|
20
|
+
"CLAUDE.md",
|
|
20
21
|
"README.md",
|
|
21
22
|
"package.json",
|
|
22
23
|
"LICENSE.md"
|
|
@@ -35,23 +36,19 @@
|
|
|
35
36
|
"check:circular-dependencies": "madge --circular --extensions ts,tsx,js,jsx --ts-config tsconfig.json src/ --exclude '/dist/'",
|
|
36
37
|
"upgrade:ds": "ncu -f \"@synerise/ds-*\" -u"
|
|
37
38
|
},
|
|
38
|
-
"sideEffects":
|
|
39
|
-
"dist/style/*",
|
|
40
|
-
"*.less"
|
|
41
|
-
],
|
|
39
|
+
"sideEffects": false,
|
|
42
40
|
"types": "dist/index.d.ts",
|
|
43
41
|
"dependencies": {
|
|
44
|
-
"@synerise/ds-divider": "^1.3.
|
|
45
|
-
"@synerise/ds-
|
|
46
|
-
"@synerise/ds-
|
|
47
|
-
"
|
|
42
|
+
"@synerise/ds-divider": "^1.3.16",
|
|
43
|
+
"@synerise/ds-loader": "^1.0.18",
|
|
44
|
+
"@synerise/ds-radio": "^1.1.18",
|
|
45
|
+
"@synerise/ds-utils": "^1.10.2"
|
|
48
46
|
},
|
|
49
47
|
"peerDependencies": {
|
|
50
48
|
"@synerise/ds-core": "*",
|
|
51
|
-
"antd": "4.24.16",
|
|
52
49
|
"react": ">=16.9.0 <= 18.3.1",
|
|
53
50
|
"styled-components": "^5.3.3",
|
|
54
51
|
"vitest": "4"
|
|
55
52
|
},
|
|
56
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "018414e0d7ffd102a07f8aa35fa2e2d3d4ed19e2"
|
|
57
54
|
}
|
|
File without changes
|
package/dist/style/index.css
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.ant-list{box-sizing:border-box;margin:0;padding:0;color:#6a7580;font-size:13px;font-variant:tabular-nums;line-height:1.38;list-style:none;font-feature-settings:'tnum';position:relative}.ant-list *{outline:0}.ant-list-pagination{margin-top:24px;text-align:right}.ant-list-pagination .ant-pagination-options{text-align:left}.ant-list-more{margin-top:12px;text-align:center}.ant-list-more button{padding-right:32px;padding-left:32px}.ant-list-spin{min-height:40px;text-align:center}.ant-list-empty-text{padding:16px;color:#b5bdc3;font-size:13px;text-align:center}.ant-list-items{margin:0;padding:0;list-style:none}.ant-list-item{display:flex;align-items:center;justify-content:space-between;padding:12px 0;color:#6a7580}.ant-list-item-meta{display:flex;flex:1;align-items:flex-start;max-width:100%}.ant-list-item-meta-avatar{margin-right:16px}.ant-list-item-meta-content{flex:1 0;width:0;color:#6a7580}.ant-list-item-meta-title{margin-bottom:4px;color:#6a7580;font-size:13px;line-height:1.38}.ant-list-item-meta-title>a{color:#6a7580;transition:all .3s}.ant-list-item-meta-title>a:hover{color:#0b68ff}.ant-list-item-meta-description{color:#232936;font-size:13px;line-height:1.38}.ant-list-item-action{flex:0 0 auto;margin-left:48px;padding:0;font-size:0;list-style:none}.ant-list-item-action>li{position:relative;display:inline-block;padding:0 8px;color:#232936;font-size:13px;line-height:1.38;text-align:center}.ant-list-item-action>li:first-child{padding-left:0}.ant-list-item-action-split{position:absolute;top:50%;right:0;width:1px;height:14px;margin-top:-7px;background-color:#e9edee}.ant-list-header{background:0 0}.ant-list-footer{background:0 0}.ant-list-footer,.ant-list-header{padding-top:12px;padding-bottom:12px}.ant-list-empty{padding:16px 0;color:#232936;font-size:12px;text-align:center}.ant-list-split .ant-list-item{border-bottom:1px solid #e9edee}.ant-list-split .ant-list-item:last-child{border-bottom:none}.ant-list-split .ant-list-header{border-bottom:1px solid #e9edee}.ant-list-split.ant-list-empty .ant-list-footer{border-top:1px solid #e9edee}.ant-list-loading .ant-list-spin-nested-loading{min-height:32px}.ant-list-split.ant-list-something-after-last-item .ant-spin-container>.ant-list-items>.ant-list-item:last-child{border-bottom:1px solid #e9edee}.ant-list-lg .ant-list-item{padding:16px 24px}.ant-list-sm .ant-list-item{padding:8px 16px}.ant-list-vertical .ant-list-item{align-items:initial}.ant-list-vertical .ant-list-item-main{display:block;flex:1}.ant-list-vertical .ant-list-item-extra{margin-left:40px}.ant-list-vertical .ant-list-item-meta{margin-bottom:16px}.ant-list-vertical .ant-list-item-meta-title{margin-bottom:12px;color:#384350;font-size:13px;line-height:24px}.ant-list-vertical .ant-list-item-action{margin-top:16px;margin-left:auto}.ant-list-vertical .ant-list-item-action>li{padding:0 16px}.ant-list-vertical .ant-list-item-action>li:first-child{padding-left:0}.ant-list-grid .ant-col>.ant-list-item{display:block;max-width:100%;margin-bottom:16px;padding-top:0;padding-bottom:0;border-bottom:none}.ant-list-item-no-flex{display:block}.ant-list:not(.ant-list-vertical) .ant-list-item-no-flex .ant-list-item-action{float:right}.ant-list-bordered{border:1px solid #dbe0e3;border-radius:3px}.ant-list-bordered .ant-list-header{padding-right:32px;padding-left:32px}.ant-list-bordered .ant-list-footer{padding-right:32px;padding-left:32px}.ant-list-bordered .ant-list-item{padding-right:32px;padding-left:32px}.ant-list-bordered .ant-list-pagination{margin:16px 24px}.ant-list-bordered.ant-list-sm .ant-list-item{padding:8px 16px}.ant-list-bordered.ant-list-sm .ant-list-footer,.ant-list-bordered.ant-list-sm .ant-list-header{padding:8px 16px}.ant-list-bordered.ant-list-lg .ant-list-item{padding:16px 24px}.ant-list-bordered.ant-list-lg .ant-list-footer,.ant-list-bordered.ant-list-lg .ant-list-header{padding:16px 24px}@media screen and (max-width:768px){.ant-list-item-action{margin-left:24px}.ant-list-vertical .ant-list-item-extra{margin-left:24px}}@media screen and (max-width:576px){.ant-list-item{flex-wrap:wrap}.ant-list-item-action{margin-left:12px}.ant-list-vertical .ant-list-item{flex-wrap:wrap-reverse}.ant-list-vertical .ant-list-item-main{min-width:220px}.ant-list-vertical .ant-list-item-extra{margin:auto auto 16px}}.ant-list-rtl{direction:rtl;text-align:right}.ant-list-rtl .ReactVirtualized__List .ant-list-item{direction:rtl}.ant-list-rtl .ant-list-pagination{text-align:left}.ant-list-rtl .ant-list-item-meta-avatar{margin-right:0;margin-left:16px}.ant-list-rtl .ant-list-item-action{margin-right:48px;margin-left:0}.ant-list.ant-list-rtl .ant-list-item-action>li:first-child{padding-right:0;padding-left:16px}.ant-list-rtl .ant-list-item-action-split{right:auto;left:0}.ant-list-rtl.ant-list-vertical .ant-list-item-extra{margin-right:40px;margin-left:0}.ant-list-rtl.ant-list-vertical .ant-list-item-action{margin-right:auto}.ant-list-rtl .ant-list-vertical .ant-list-item-action>li:first-child{padding-right:0;padding-left:16px}.ant-list-rtl .ant-list:not(.ant-list-vertical) .ant-list-item-no-flex .ant-list-item-action{float:left}@media screen and (max-width:768px){.ant-list-rtl .ant-list-item-action{margin-right:24px;margin-left:0}.ant-list-rtl .ant-list-vertical .ant-list-item-extra{margin-right:24px;margin-left:0}}@media screen and (max-width:576px){.ant-list-rtl .ant-list-item-action{margin-right:22px;margin-left:0}.ant-list-rtl.ant-list-vertical .ant-list-item-extra{margin:auto auto 16px}}.ant-dropdown-menu-items{padding:8px;margin:0}.ant-list-header{text-transform:uppercase;font-size:13px;color:#57616d;padding:8px 12px}.ant-list-header.ant-list-header{border:0}
|