@synerise/ds-list 1.1.42 → 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 CHANGED
@@ -3,6 +3,10 @@
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
+
6
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)
7
11
 
8
12
  **Note:** Version bump only for package @synerise/ds-list
package/CLAUDE.md CHANGED
@@ -1,11 +1,12 @@
1
1
  # List (`@synerise/ds-list`)
2
- > A generic list component built on Ant Design's List, supporting nested/sectioned data sources, optional radio group wrapping, and styled sub-components for text items, item wrappers, and dividers.
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
3
 
4
4
  ## Package structure
5
5
  ```
6
6
  src/
7
- List.tsx — class component (PureComponent), renders flat or nested (sectioned) AntdList
8
- List.types.ts — ListPropsType<T> type definition
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)
9
10
  index.ts — public entry point
10
11
  modules.d.ts — CSS/Less module declarations
11
12
  Elements/
@@ -19,9 +20,6 @@ src/
19
20
  Divider/
20
21
  Divider.tsx — thin wrapper around @synerise/ds-divider with horizontal padding
21
22
  Divider.styles.ts — styled-components for Divider
22
- style/
23
- index.less — Less entry point (imported via side-effect in List.tsx)
24
- list.mixin.less — Less mixins for list styles
25
23
  __spec__/
26
24
  List.spec.tsx — Vitest tests
27
25
  ```
@@ -29,7 +27,7 @@ src/
29
27
  ## Public exports
30
28
 
31
29
  ```ts
32
- export { default } from './List'; // List class component (default)
30
+ export { default } from './List'; // List functional component (default)
33
31
  export type { ListPropsType } from './List.types';
34
32
  export type { TextProps } from './Elements/Text/Text';
35
33
  ```
@@ -45,16 +43,16 @@ export type { TextProps } from './Elements/Text/Text';
45
43
 
46
44
  ### `List<T>` (default export)
47
45
 
48
- Extends Ant Design `ListProps<T>` — omits `dataSource` and `footer`, adds:
46
+ Hand-written props (`ListPropsType<T>`, no antd). Core props:
49
47
 
50
48
  | Prop | Type | Default | Description |
51
49
  |------|------|---------|-------------|
52
- | `dataSource` | `T[] \| T[][]` | — | Flat array OR nested array of arrays. A nested array renders multiple `AntdList` sections separated by `ListDivider`. Only the first section renders the `header`. |
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`. |
53
51
  | `radio` | `boolean` | `undefined` | Wraps the entire rendered list in `Radio.Group` |
54
52
  | `options` | `RadioGroupProps` | `undefined` | Props forwarded to the `Radio.Group` wrapper; only used when `radio` is `true` |
55
53
  | `dashed` | `boolean` | `undefined` | Controls the dashed style of the auto-rendered `ListDivider` between sections. Note: `ListDivider` defaults `dashed` to `true` when not supplied |
56
54
 
57
- All other `ListProps<T>` from antd (e.g. `bordered`, `header`, `renderItem`, `split`, `grid`, `pagination`, `loading`, `loadMore`, `locale`, `rowKey`, `itemLayout`) are forwarded directly to `AntdList`.
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).
58
56
 
59
57
  ---
60
58
 
@@ -133,19 +131,19 @@ import List from '@synerise/ds-list';
133
131
 
134
132
  ## Implementation notes
135
133
 
136
- - `List` is a **class component** (`React.PureComponent`) — not a functional component. A stable `uuid` key is generated in the constructor for the single-section render path.
137
- - **Nested detection:** `isNestedArray` (also a named export from `./List`) checks `array[0] instanceof Array`. An array of arrays is rendered as multiple `AntdList` instances; subsequent sections have `header` forced to `null`.
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).
138
137
  - **`footer` is omitted** from `ListPropsType` — it cannot be passed to `List`.
139
- - `List.Item` spreads all extra props onto the underlying `<li>` via `WithHTMLAttributes<HTMLLIElement, ..>`.
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.
140
139
  - The `ListDivider` wrapping `div` has `padding: 0 20px` to inset the rule; the `ItemWrapper` `div` has `padding: 8px 12px`.
141
- - Tests use **Jest** (not Vitest) — see `jest.config.js`.
140
+ - Tests use **Vitest** (`pnpm --filter @synerise/ds-list test`).
142
141
 
143
142
  ## Key dependencies
144
143
 
145
144
  | Package | Role |
146
145
  |---------|------|
147
- | `antd` (peer) | `AntdList`, `RadioGroupProps` base types |
148
- | `@synerise/ds-radio` | `Radio.Group` wrapping when `radio` is `true` |
146
+ | `@synerise/ds-radio` | `Radio.Group` wrapping when `radio` is `true`; `RadioGroupProps` type |
149
147
  | `@synerise/ds-divider` | Underlying divider in `ListDivider` |
148
+ | `@synerise/ds-loader` | Loading indicator for the `loading` prop |
150
149
  | `@synerise/ds-utils` | `WithHTMLAttributes` utility type |
151
- | `uuid` | Stable + per-render keys for `React.Fragment` nodes |
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 class List<T> extends React.PureComponent<ListPropsType<T>> {
6
- static ItemWrapper: typeof ItemWrapper;
7
- static Item: typeof TextItem;
8
- static Divider: typeof ListDivider;
9
- private uuidKey;
10
- constructor(props: ListPropsType<T>);
11
- render(): React.ReactNode;
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 { v4 } from "uuid";
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 "./style/index.css";
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] instanceof Array;
10
+ return !!array.length && Array.isArray(array[0]);
16
11
  };
17
- const _List = class _List extends React.PureComponent {
18
- constructor(props) {
19
- super(props);
20
- this.uuidKey = v4();
21
- }
22
- render() {
23
- const {
24
- dataSource,
25
- radio,
26
- options,
27
- dashed,
28
- ...rest
29
- } = this.props;
30
- let ReadyList;
31
- if (isNestedArray(dataSource)) {
32
- ReadyList = !!dataSource && // @ts-expect-error type mismatch
33
- dataSource.map((singleDataSource, index) => {
34
- const isLastItem = dataSource.length === index + 1;
35
- if (index === 0) {
36
- return /* @__PURE__ */ jsxs(React.Fragment, { children: [
37
- /* @__PURE__ */ jsx(List$1, { ...rest, dataSource: singleDataSource }),
38
- !isLastItem && /* @__PURE__ */ jsx(ListDivider, { dashed: !!dashed, "data-testid": "divider" })
39
- ] }, v4());
40
- }
41
- return /* @__PURE__ */ jsxs(React.Fragment, { children: [
42
- /* @__PURE__ */ jsx(List$1, { ...rest, header: null, dataSource: singleDataSource }),
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 /* @__PURE__ */ jsx(Fragment, { children: radio ? /* @__PURE__ */ jsx(RadioGroupWrapper, { options, children: ReadyList }) : ReadyList });
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
- _List.ItemWrapper = ItemWrapper;
53
- _List.Item = Text;
54
- _List.Divider = ListDivider;
55
- let List = _List;
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
+ };
@@ -1,8 +1,35 @@
1
- import { ListProps } from 'antd';
1
+ import { CSSProperties, Key, ReactNode } from 'react';
2
2
  import { RadioGroupProps } from '@synerise/ds-radio';
3
- export type ListPropsType<T> = Omit<ListProps<T>, 'dataSource' | 'footer'> & {
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.42",
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",
@@ -36,23 +36,19 @@
36
36
  "check:circular-dependencies": "madge --circular --extensions ts,tsx,js,jsx --ts-config tsconfig.json src/ --exclude '/dist/'",
37
37
  "upgrade:ds": "ncu -f \"@synerise/ds-*\" -u"
38
38
  },
39
- "sideEffects": [
40
- "dist/style/*",
41
- "*.less"
42
- ],
39
+ "sideEffects": false,
43
40
  "types": "dist/index.d.ts",
44
41
  "dependencies": {
45
42
  "@synerise/ds-divider": "^1.3.16",
43
+ "@synerise/ds-loader": "^1.0.18",
46
44
  "@synerise/ds-radio": "^1.1.18",
47
- "@synerise/ds-utils": "^1.10.2",
48
- "uuid": "^8.3.2"
45
+ "@synerise/ds-utils": "^1.10.2"
49
46
  },
50
47
  "peerDependencies": {
51
48
  "@synerise/ds-core": "*",
52
- "antd": "4.24.16",
53
49
  "react": ">=16.9.0 <= 18.3.1",
54
50
  "styled-components": "^5.3.3",
55
51
  "vitest": "4"
56
52
  },
57
- "gitHead": "d0a43cc43d8528a36f105aceea52ab470edb71d9"
53
+ "gitHead": "018414e0d7ffd102a07f8aa35fa2e2d3d4ed19e2"
58
54
  }
File without changes
@@ -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}