@synerise/ds-ordered-list 1.1.38 → 1.1.40

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,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.40](https://github.com/Synerise/synerise-design/compare/@synerise/ds-ordered-list@1.1.39...@synerise/ds-ordered-list@1.1.40) (2026-03-24)
7
+
8
+ **Note:** Version bump only for package @synerise/ds-ordered-list
9
+
10
+ ## [1.1.39](https://github.com/Synerise/synerise-design/compare/@synerise/ds-ordered-list@1.1.38...@synerise/ds-ordered-list@1.1.39) (2026-03-20)
11
+
12
+ **Note:** Version bump only for package @synerise/ds-ordered-list
13
+
6
14
  ## [1.1.38](https://github.com/Synerise/synerise-design/compare/@synerise/ds-ordered-list@1.1.37...@synerise/ds-ordered-list@1.1.38) (2026-03-09)
7
15
 
8
16
  **Note:** Version bump only for package @synerise/ds-ordered-list
package/CLAUDE.md ADDED
@@ -0,0 +1,94 @@
1
+ # OrderedList (`@synerise/ds-ordered-list`)
2
+ > Recursive ordered list component supporting arbitrary nesting, custom index formatting, and optional prefixel/suffixel slots per item.
3
+
4
+ ## Package structure
5
+ ```
6
+ src/
7
+ Ordered-list.tsx — root component; renders <ol> with optional header label, maps data to Item
8
+ Ordered-list.types.ts — OrderedListItem, OrderedListProps, ListProps (deprecated alias)
9
+ Ordered-list.styles.ts — styled <ol> (OrderedList) and header wrapper (ContentAbove)
10
+ index.ts — public exports
11
+ Elements/
12
+ Item/
13
+ Item.tsx — memoized list item; renders index, prefixel, label, suffixel, and recursive NestedList
14
+ Item.styles.ts — ItemWrapper (<li>), IndexFormatterWrapper (<span>)
15
+ __specs__/
16
+ Ordered-list.spec.tsx — Jest tests (nested items, indexFormatter, prefix/suffix)
17
+ ```
18
+
19
+ ## Public exports
20
+ ```ts
21
+ export { default } from './Ordered-list'; // default export: OrderedList component
22
+ export type { OrderedListItem, OrderedListProps }; // named type exports
23
+ ```
24
+
25
+ `ListProps` is exported from the types file but **not** re-exported from `index.ts`. It is marked `@deprecated` — use `OrderedListProps` instead.
26
+
27
+ ### `OrderedList` (default export)
28
+ | Prop | Type | Default | Description |
29
+ |------|------|---------|-------------|
30
+ | `data` | `OrderedListItem[]` | — (required) | Array of items to render |
31
+ | `indexFormatter` | `(index: number) => ReactNode` | `undefined` | Custom renderer for the item index; falls back to the raw zero-based number |
32
+ | `listStyle` | `string` | `undefined` | CSS `list-style-type` value applied to `<ol>` and all nested `<ol>` elements; defaults to `'none'` when omitted |
33
+ | `text` | `ReactNode` | `undefined` | Optional label rendered above the list via `FormFieldLabel` |
34
+
35
+ ### `OrderedListItem`
36
+ | Field | Type | Required | Description |
37
+ |-------|------|----------|-------------|
38
+ | `id` | `string` | yes | Used as React `key` |
39
+ | `label` | `ReactNode` | yes | Item content |
40
+ | `index` | `number` | yes | Passed to `indexFormatter`; **ignored** in the root component — the map index `i` is used instead |
41
+ | `prefixel` | `ReactNode` | no | Rendered before the label |
42
+ | `suffixel` | `ReactNode` | no | Rendered after the label |
43
+ | `subMenu` | `OrderedListItem[]` | no | Child items; triggers a recursive `OrderedList` |
44
+ | `subMenuProps` | `Omit<OrderedListProps, 'data'>` | no | Props forwarded to the nested `OrderedList` (overrides inherited `text`, `indexFormatter`, `listStyle`) |
45
+ | `listStyle` | `string` | no | Per-item list style (forwarded to the nested list) |
46
+ | `text` | `ReactNode` | no | Header label for the nested list |
47
+
48
+ ## Usage patterns
49
+ ```tsx
50
+ import OrderedList from '@synerise/ds-ordered-list';
51
+ import type { OrderedListItem } from '@synerise/ds-ordered-list';
52
+
53
+ const items: OrderedListItem[] = [
54
+ { id: '1', index: 0, label: 'First item' },
55
+ { id: '2', index: 1, label: 'Second item' },
56
+ {
57
+ id: '3',
58
+ index: 2,
59
+ label: 'Parent item',
60
+ subMenu: [
61
+ { id: '4', index: 0, label: 'Child item' },
62
+ ],
63
+ },
64
+ ];
65
+
66
+ // Basic usage with a decimal formatter
67
+ <OrderedList
68
+ data={items}
69
+ text="List Header"
70
+ indexFormatter={(i) => `${i + 1}. `}
71
+ />
72
+
73
+ // Without index display
74
+ <OrderedList data={items} indexFormatter={() => ''} />
75
+
76
+ // Native browser list counters via listStyle
77
+ <OrderedList data={items} listStyle="decimal" />
78
+ ```
79
+
80
+ ## Styling
81
+ - Styled-components only; no Less/CSS files at runtime.
82
+ - `listStyle` maps directly to the CSS `list-style-type` property. When omitted, `list-style-type: none` is set at every level; custom index rendering via `indexFormatter` is then the only numbering mechanism.
83
+ - Nested `<ol>` elements receive `margin-left: 10px` and `padding: 5px 0 5px 12px`.
84
+ - `ContentAbove` wrapper has `margin-bottom: 8px; min-height: 18px`.
85
+
86
+ ## Key dependencies
87
+ - `@synerise/ds-form-field` — `FormFieldLabel` used for the optional `text` header
88
+ - `@synerise/ds-icon` — listed as a dependency in `package.json` but not imported in any source file (likely a transitive or leftover dependency)
89
+
90
+ ## Implementation notes
91
+ - **Recursive rendering without circular imports:** `OrderedList` passes itself as a `NestedList` prop to `Item`, avoiding a direct circular import between the two files.
92
+ - **`index` field on `OrderedListItem` is effectively unused at the root level** — the component uses the map iteration index `i` instead of `item.index`. The field is still passed through to nested levels via `subMenu` items.
93
+ - `Item` is wrapped in `React.memo`.
94
+ - Tests use Jest (not Vitest) — `jest.config.js` is present and the `test` script calls `jest` directly.
package/README.md CHANGED
@@ -11,6 +11,8 @@ OrderedList UI Component
11
11
  npm i @synerise/ds-ordered-list
12
12
  or
13
13
  yarn add @synerise/ds-ordered-list
14
+ or
15
+ pnpm add @synerise/ds-ordered-list
14
16
  ```
15
17
 
16
18
  ## Usage
@@ -28,12 +30,25 @@ import OrderedList from '@synerise/ds-ordered-list'
28
30
 
29
31
  ## API
30
32
 
31
- | Property | Description | Type | Default |
32
- | --------- | ---------------------------- | ----------------- | ------- |
33
- | listStyle | style to pick unordered list | string | - |
34
- | index | set number of ordered list | number | - |
35
- | id | name of the item | string | - |
36
- | subMenu | items list | OrderedListItem[] | - |
37
- | label | label contains text | string | - |
38
- | suffixel | place to set item | React.ReactNode | - |
39
- | prefixel | place to set item | React.ReactNode | - |
33
+ ### OrderedList
34
+
35
+ | Property | Description | Type | Default |
36
+ | -------------- | ---------------------------------------------------------------- | ------------------------------- | ------- |
37
+ | data | Array of items to render | OrderedListItem[] | - |
38
+ | indexFormatter | Custom renderer for the item index; falls back to the raw index | (index: number) => ReactNode | - |
39
+ | listStyle | CSS list-style-type value; defaults to `none` when not provided | string | - |
40
+ | text | Optional label rendered above the list | React.ReactNode | - |
41
+
42
+ ### OrderedListItem
43
+
44
+ | Property | Description | Type | Default |
45
+ | ------------ | -------------------------------------------------------- | ----------------------------------- | ------- |
46
+ | id | Unique item identifier (used as React key) | string | - |
47
+ | index | Index value passed to indexFormatter | number | - |
48
+ | label | Item content | React.ReactNode | - |
49
+ | prefixel | Content rendered before the label | React.ReactNode | - |
50
+ | suffixel | Content rendered after the label | React.ReactNode | - |
51
+ | subMenu | Nested child items | OrderedListItem[] | - |
52
+ | subMenuProps | Props forwarded to the nested OrderedList (except data) | Omit\<OrderedListProps, 'data'\> | - |
53
+ | listStyle | CSS list-style-type for the nested list | string | - |
54
+ | text | Header label for the nested list | React.ReactNode | - |
@@ -1,5 +1,5 @@
1
- import React, { type ReactElement } from 'react';
2
- import { type OrderedListItem, type OrderedListProps } from '../../Ordered-list.types';
1
+ import { default as React, ReactElement } from 'react';
2
+ import { OrderedListItem, OrderedListProps } from '../../Ordered-list.types';
3
3
  declare const _default: React.MemoExoticComponent<({ label, suffixel, prefixel, subMenu, indexFormatter, index, listStyle, subMenuProps, text, NestedList, }: OrderedListItem & Pick<OrderedListProps, "indexFormatter"> & {
4
4
  NestedList?: (props: OrderedListProps) => ReactElement;
5
5
  }) => React.JSX.Element>;
@@ -1,22 +1,29 @@
1
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
- import React from 'react';
3
- import * as S from './Item.styles';
4
- var Item = function Item(_ref) {
5
- var label = _ref.label,
6
- suffixel = _ref.suffixel,
7
- prefixel = _ref.prefixel,
8
- subMenu = _ref.subMenu,
9
- indexFormatter = _ref.indexFormatter,
10
- index = _ref.index,
11
- listStyle = _ref.listStyle,
12
- subMenuProps = _ref.subMenuProps,
13
- text = _ref.text,
14
- NestedList = _ref.NestedList;
15
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(S.ItemWrapper, null, /*#__PURE__*/React.createElement(S.IndexFormatterWrapper, null, indexFormatter ? indexFormatter(index) : index), prefixel, label, suffixel), !!subMenu && (subMenu == null ? void 0 : subMenu.length) > 0 && NestedList && /*#__PURE__*/React.createElement(NestedList, _extends({
16
- text: text,
17
- indexFormatter: indexFormatter,
18
- data: subMenu,
19
- listStyle: listStyle
20
- }, subMenuProps)));
1
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { ItemWrapper, IndexFormatterWrapper } from "./Item.styles.js";
4
+ const Item = ({
5
+ label,
6
+ suffixel,
7
+ prefixel,
8
+ subMenu,
9
+ indexFormatter,
10
+ index,
11
+ listStyle,
12
+ subMenuProps,
13
+ text,
14
+ NestedList
15
+ }) => {
16
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
17
+ /* @__PURE__ */ jsxs(ItemWrapper, { children: [
18
+ /* @__PURE__ */ jsx(IndexFormatterWrapper, { children: indexFormatter ? indexFormatter(index) : index }),
19
+ prefixel,
20
+ label,
21
+ suffixel
22
+ ] }),
23
+ !!subMenu && subMenu?.length > 0 && NestedList && /* @__PURE__ */ jsx(NestedList, { text, indexFormatter, data: subMenu, listStyle, ...subMenuProps })
24
+ ] });
25
+ };
26
+ const Item$1 = React.memo(Item);
27
+ export {
28
+ Item$1 as default
21
29
  };
22
- export default /*#__PURE__*/React.memo(Item);
@@ -1,2 +1,2 @@
1
- export declare const ItemWrapper: import("styled-components").StyledComponent<"li", any, {}, never>;
2
- export declare const IndexFormatterWrapper: import("styled-components").StyledComponent<"span", any, {}, never>;
1
+ export declare const ItemWrapper: import('styled-components').StyledComponent<"li", any, {}, never>;
2
+ export declare const IndexFormatterWrapper: import('styled-components').StyledComponent<"span", any, {}, never>;
@@ -1,9 +1,13 @@
1
- import styled from 'styled-components';
2
- export var ItemWrapper = styled.li.withConfig({
1
+ import styled from "styled-components";
2
+ const ItemWrapper = /* @__PURE__ */ styled.li.withConfig({
3
3
  displayName: "Itemstyles__ItemWrapper",
4
4
  componentId: "sc-11469x5-0"
5
5
  })(["margin:5px 0 5px 0;display:list-item;justify-content:flex-start;align-items:center;"]);
6
- export var IndexFormatterWrapper = styled.span.withConfig({
6
+ const IndexFormatterWrapper = /* @__PURE__ */ styled.span.withConfig({
7
7
  displayName: "Itemstyles__IndexFormatterWrapper",
8
8
  componentId: "sc-11469x5-1"
9
- })([""]);
9
+ })([""]);
10
+ export {
11
+ IndexFormatterWrapper,
12
+ ItemWrapper
13
+ };
@@ -1,4 +1,4 @@
1
- import React from 'react';
2
- import { type OrderedListProps } from './Ordered-list.types';
1
+ import { default as React } from 'react';
2
+ import { OrderedListProps } from './Ordered-list.types';
3
3
  declare const OrderedList: ({ data, indexFormatter, listStyle, text, }: OrderedListProps) => React.JSX.Element;
4
4
  export default OrderedList;
@@ -1,31 +1,31 @@
1
- var _excluded = ["index"];
2
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
3
- function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
4
- import React from 'react';
5
- import { FormFieldLabel } from '@synerise/ds-form-field';
6
- import Item from './Elements/Item/Item';
7
- import * as S from './Ordered-list.styles';
8
- var _OrderedList = function OrderedList(_ref) {
9
- var data = _ref.data,
10
- indexFormatter = _ref.indexFormatter,
11
- listStyle = _ref.listStyle,
12
- text = _ref.text;
13
- return /*#__PURE__*/React.createElement("div", null, text && /*#__PURE__*/React.createElement(S.ContentAbove, null, /*#__PURE__*/React.createElement(FormFieldLabel, {
14
- label: text
15
- })), /*#__PURE__*/React.createElement(S.OrderedList, {
16
- listStyle: listStyle
17
- }, data.map(function (_ref2, i) {
18
- var index = _ref2.index,
19
- item = _objectWithoutPropertiesLoose(_ref2, _excluded);
20
- return /*#__PURE__*/React.createElement(Item, _extends({
21
- listStyle: listStyle,
22
- index: i,
23
- key: String(item == null ? void 0 : item.id),
24
- indexFormatter: indexFormatter
25
- }, item, {
26
- // pass the component to avoid circular dependencies
27
- NestedList: _OrderedList
28
- }));
29
- })));
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { FormFieldLabel } from "@synerise/ds-form-field";
3
+ import Item from "./Elements/Item/Item.js";
4
+ import { ContentAbove, OrderedList as OrderedList$1 } from "./Ordered-list.styles.js";
5
+ const OrderedList = ({
6
+ data,
7
+ indexFormatter,
8
+ listStyle,
9
+ text
10
+ }) => {
11
+ return /* @__PURE__ */ jsxs("div", { children: [
12
+ text && /* @__PURE__ */ jsx(ContentAbove, { children: /* @__PURE__ */ jsx(FormFieldLabel, { label: text }) }),
13
+ /* @__PURE__ */ jsx(OrderedList$1, { listStyle, children: data.map(({
14
+ index,
15
+ ...item
16
+ }, i) => /* @__PURE__ */ jsx(
17
+ Item,
18
+ {
19
+ listStyle,
20
+ index: i,
21
+ indexFormatter,
22
+ ...item,
23
+ NestedList: OrderedList
24
+ },
25
+ String(item?.id)
26
+ )) })
27
+ ] });
28
+ };
29
+ export {
30
+ OrderedList as default
30
31
  };
31
- export default _OrderedList;
@@ -1,4 +1,4 @@
1
- export declare const OrderedList: import("styled-components").StyledComponent<"ol", any, {
1
+ export declare const OrderedList: import('styled-components').StyledComponent<"ol", any, {
2
2
  listStyle?: string;
3
3
  }, never>;
4
- export declare const ContentAbove: import("styled-components").StyledComponent<"div", any, {}, never>;
4
+ export declare const ContentAbove: import('styled-components').StyledComponent<"div", any, {}, never>;
@@ -1,15 +1,13 @@
1
- import styled from 'styled-components';
2
- export var OrderedList = styled.ol.withConfig({
1
+ import styled from "styled-components";
2
+ const OrderedList = /* @__PURE__ */ styled.ol.withConfig({
3
3
  displayName: "Ordered-liststyles__OrderedList",
4
4
  componentId: "sc-smxtrj-0"
5
- })(["display:flex;flex-direction:column;padding:0;list-style-type:", ";list-style-position:inside;ol{margin-left:10px;padding:5px 0 5px 12px;list-style-type:", ";}li{margin-right:4px;list-style-type:", ";}"], function (props) {
6
- return props.listStyle ? props.listStyle : 'none';
7
- }, function (props) {
8
- return props.listStyle ? props.listStyle : 'none';
9
- }, function (props) {
10
- return props.listStyle ? props.listStyle : 'none';
11
- });
12
- export var ContentAbove = styled.div.withConfig({
5
+ })(["display:flex;flex-direction:column;padding:0;list-style-type:", ";list-style-position:inside;ol{margin-left:10px;padding:5px 0 5px 12px;list-style-type:", ";}li{margin-right:4px;list-style-type:", ";}"], (props) => props.listStyle ? props.listStyle : "none", (props) => props.listStyle ? props.listStyle : "none", (props) => props.listStyle ? props.listStyle : "none");
6
+ const ContentAbove = /* @__PURE__ */ styled.div.withConfig({
13
7
  displayName: "Ordered-liststyles__ContentAbove",
14
8
  componentId: "sc-smxtrj-1"
15
- })(["margin-bottom:8px;min-height:18px;"]);
9
+ })(["margin-bottom:8px;min-height:18px;"]);
10
+ export {
11
+ ContentAbove,
12
+ OrderedList
13
+ };
@@ -1,4 +1,4 @@
1
- import type { ReactNode } from 'react';
1
+ import { ReactNode } from 'react';
2
2
  export type OrderedListItem = {
3
3
  id: string;
4
4
  label: ReactNode;
@@ -1 +1 @@
1
- export {};
1
+
package/dist/index.js CHANGED
@@ -1 +1,4 @@
1
- export { default } from './Ordered-list';
1
+ import { default as default2 } from "./Ordered-list.js";
2
+ export {
3
+ default2 as default
4
+ };
package/dist/modules.d.js CHANGED
@@ -1 +1 @@
1
- import '@testing-library/jest-dom';
1
+ import "@testing-library/jest-dom";
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synerise/ds-ordered-list",
3
- "version": "1.1.38",
3
+ "version": "1.1.40",
4
4
  "description": "OrderedList UI Component for the Synerise Design System",
5
5
  "license": "ISC",
6
6
  "repository": "Synerise/synerise-design",
@@ -9,10 +9,10 @@
9
9
  "access": "public"
10
10
  },
11
11
  "scripts": {
12
- "build": "pnpm run build:js && pnpm run build:css && pnpm run defs",
12
+ "build": "vite build",
13
13
  "build:css": "node ../../../scripts/style/less.js",
14
14
  "build:js": "babel --delete-dir-on-start --root-mode upward src --out-dir dist --extensions '.js,.ts,.tsx'",
15
- "build:watch": "pnpm run build:js -- --watch",
15
+ "build:watch": "vite build --watch",
16
16
  "defs": "tsc --declaration --outDir dist/ --emitDeclarationOnly",
17
17
  "pack:ci": "pnpm pack --pack-destination ../../storybook/storybook-static/static",
18
18
  "prepublish": "pnpm run build",
@@ -28,13 +28,13 @@
28
28
  ],
29
29
  "types": "dist/index.d.ts",
30
30
  "dependencies": {
31
- "@synerise/ds-form-field": "^1.3.8",
32
- "@synerise/ds-icon": "^1.14.1"
31
+ "@synerise/ds-form-field": "^1.3.10",
32
+ "@synerise/ds-icon": "^1.15.1"
33
33
  },
34
34
  "peerDependencies": {
35
35
  "@synerise/ds-core": "*",
36
36
  "react": ">=16.9.0 <= 18.3.1",
37
37
  "styled-components": "^5.3.3"
38
38
  },
39
- "gitHead": "8dfafc5d7278f09d430f1e7499782d05c76b47c0"
39
+ "gitHead": "e4ecca8944fc9b41c1b9d59c8bcad5e5e2013225"
40
40
  }
package/vite.config.ts ADDED
@@ -0,0 +1,6 @@
1
+ import { lessCompilePlugin } from '../../../scripts/vite/less-plugin';
2
+ import { createViteConfig } from '../../../vite.config.base';
3
+
4
+ export default createViteConfig('@synerise/ds-ordered-list', {
5
+ plugins: [lessCompilePlugin()],
6
+ });