@eyesee/ui-components 0.1.0 → 0.1.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/README.md CHANGED
@@ -1,37 +1,291 @@
1
- # @eyesee/ui-components
2
-
3
- Shared EyeSee React components and design tokens.
4
-
5
- ## Usage
6
-
7
- Import the package styles once at the application entry point:
8
-
9
- ```js
10
- import '@eyesee/ui-components/styles';
11
- ```
12
-
13
- Apply `alias--main` and exactly one application profile class (`mapped--internal`
14
- or `mapped--external`) on an ancestor that also contains portal content,
15
- preferably `body`.
16
-
17
- `Modal` uses `#modal` when it exists and otherwise falls back to `document.body`.
18
- Use its `portalContainer` prop to provide a different host and
19
- `loadingFallback` to customize its Suspense fallback. `Tooltip` also accepts
20
- `portalContainer` and otherwise renders into `document.body`.
21
-
22
- The consuming application must install the package peer dependencies listed in
23
- `package.json`. `Notifications` requires a single rendered toast host from
24
- `react-toastify`; use the exported `Notifications` component and
25
- `useNotifications` hook.
26
-
27
- ## Development
28
-
29
- ```bash
30
- npm run storybook
31
- npm run build
32
- npm run build-storybook
33
- npm run pack:check
34
- ```
35
-
36
- The Storybook toolbar switches between the Internal and External application
37
- style profiles.
1
+ # @eyesee/ui-components
2
+
3
+ Shared EyeSee React component library and design tokens.
4
+
5
+ **Live Storybook:** https://qa-test-components.eyesee-collab.com
6
+
7
+ ---
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npm install @eyesee/ui-components
13
+ ```
14
+
15
+ ### Peer dependencies
16
+
17
+ Install these in your consuming application if not already present:
18
+
19
+ ```bash
20
+ npm install react react-dom clsx react-hook-form react-toastify
21
+ ```
22
+
23
+ ---
24
+
25
+ ## Setup
26
+
27
+ ### 1. Import styles
28
+
29
+ Import the stylesheet **once** at your application entry point (e.g. `main.jsx` or `App.jsx`):
30
+
31
+ ```js
32
+ import '@eyesee/ui-components/styles';
33
+ ```
34
+
35
+ ### 2. Apply theme classes
36
+
37
+ Add `alias--main` and exactly one profile class to a common ancestor element — ideally `<body>`. The profile class controls the visual theme of the library:
38
+
39
+ | Class | Use for |
40
+ |---|---|
41
+ | `alias--main` | Always required |
42
+ | `mapped--internal` | Internal EyeSee tools |
43
+ | `mapped--external` | External-facing applications |
44
+
45
+ ```html
46
+ <body class="alias--main mapped--internal">
47
+ ...
48
+ </body>
49
+ ```
50
+
51
+ Or in React:
52
+
53
+ ```jsx
54
+ useEffect(() => {
55
+ document.body.classList.add('alias--main', 'mapped--internal');
56
+ }, []);
57
+ ```
58
+
59
+ The Storybook toolbar switches between the two profiles so you can preview both themes side by side.
60
+
61
+ ---
62
+
63
+ ## Usage
64
+
65
+ All components are exported from the package root:
66
+
67
+ ```jsx
68
+ import { Button, InputField, Modal, Toggle } from '@eyesee/ui-components';
69
+ ```
70
+
71
+ Icons are exported from a separate entry point to keep bundles lean:
72
+
73
+ ```jsx
74
+ import { PlusIcon, DeleteIcon, EditIcon } from '@eyesee/ui-components/icons';
75
+ ```
76
+
77
+ ---
78
+
79
+ ## Components
80
+
81
+ ### Layout & Feedback
82
+
83
+ | Component | Description |
84
+ |---|---|
85
+ | `Modal` | Dialog overlay with title, description, icon, and footer slots |
86
+ | `Infobox` | Inline status message with icon, title, and body text |
87
+ | `ProgressBar` | Determinate progress indicator with optional label and percentage |
88
+ | `ExpandableItem` | Collapsible `<details>`-based section with a summary title |
89
+
90
+ ### Navigation & Selection
91
+
92
+ | Component | Description |
93
+ |---|---|
94
+ | `Tabs` | Tab group managing selection state; wraps `Tab` |
95
+ | `Tab` | Individual tab rendered as a button or span |
96
+
97
+ ### Inputs & Form Fields
98
+
99
+ | Component | Description |
100
+ |---|---|
101
+ | `InputField` | Single-line text input with label, icons, error, and info text |
102
+ | `TextField` | Multi-line textarea with label, action buttons, error, and info text |
103
+ | `SelectField` | Dropdown select with label and error support |
104
+ | `Checkbox` | Checkbox with label, indeterminate state, and size variants |
105
+ | `Radio` | Radio button with label and size variants |
106
+ | `Toggle` | Switch (checkbox) with label and size variants |
107
+
108
+ ### Buttons & Actions
109
+
110
+ | Component | Description |
111
+ |---|---|
112
+ | `Button` | Primary action button with optional dropdown menu |
113
+ | `DropdownList` | Scrollable menu container; used by `Button` internally |
114
+
115
+ ### Display
116
+
117
+ | Component | Description |
118
+ |---|---|
119
+ | `Avatar` | User avatar as initials or photo with size and corner variants |
120
+ | `Badge` | Numeric or text badge in rectangle or pill shape |
121
+ | `Pill` | Status indicator with icon and color/status variants |
122
+ | `Tag` | Label chip with optional dismiss button |
123
+ | `ListItem` | Row with title, description, trailing action icons, and slots |
124
+ | `FileType` | File type icon indicator |
125
+ | `ImagePlaceholder` | Placeholder shown while an image loads |
126
+ | `ImageWithData` | Image with overlaid metadata |
127
+ | `TextHoverable` | Text that reveals additional content on hover |
128
+ | `Tooltip` | Floating label anchored to a trigger element |
129
+ | `EllipsisTooltip` | Tooltip that only activates when text is truncated |
130
+
131
+ ### Notifications
132
+
133
+ | Component | Description |
134
+ |---|---|
135
+ | `Notifications` | Toast notification card (title, text, type, actions) |
136
+ | `useNotifications` | Hook for triggering toasts imperatively |
137
+
138
+ Notifications require a single `<ToastContainer>` from `react-toastify` in your app:
139
+
140
+ ```jsx
141
+ import { ToastContainer } from 'react-toastify';
142
+ import { useNotifications } from '@eyesee/ui-components';
143
+
144
+ function App() {
145
+ return (
146
+ <>
147
+ <ToastContainer />
148
+ <YourApp />
149
+ </>
150
+ );
151
+ }
152
+
153
+ function SomeComponent() {
154
+ const { notify } = useNotifications();
155
+
156
+ return (
157
+ <button onClick={() => notify({ title: 'Saved!', text: 'Your changes were saved.', type: 'success' })}>
158
+ Save
159
+ </button>
160
+ );
161
+ }
162
+ ```
163
+
164
+ ---
165
+
166
+ ## Portals
167
+
168
+ `Modal` and `Tooltip` render into a portal. By default they target `document.body`. Use the `portalContainer` prop to override the host element:
169
+
170
+ ```jsx
171
+ <Modal visible portalContainer={document.getElementById('modal-root')} />
172
+ ```
173
+
174
+ If a `#modal` element exists in the DOM, `Modal` will prefer it automatically. Both components accept a `loadingFallback` prop to customise the Suspense fallback shown while lazy-loaded content resolves.
175
+
176
+ > **Important:** The `alias--main` and profile classes must be on an ancestor that also contains any portal containers, so that CSS custom properties are inherited correctly.
177
+
178
+ ---
179
+
180
+ ## Examples
181
+
182
+ ### Button with dropdown
183
+
184
+ ```jsx
185
+ import { Button } from '@eyesee/ui-components';
186
+ import { DeleteIcon, EditIcon } from '@eyesee/ui-components/icons';
187
+
188
+ const options = [
189
+ { value: 'edit', label: 'Edit', icon: <EditIcon /> },
190
+ { value: 'delete', label: 'Delete', icon: <DeleteIcon /> },
191
+ ];
192
+
193
+ <Button
194
+ text="Actions"
195
+ variant="primary"
196
+ options={options}
197
+ onClick={(option) => console.log(option.value)}
198
+ />
199
+ ```
200
+
201
+ ### Form fields
202
+
203
+ ```jsx
204
+ import { InputField, TextField, Toggle } from '@eyesee/ui-components';
205
+
206
+ <InputField
207
+ label="Email"
208
+ type="email"
209
+ required
210
+ value={email}
211
+ onChange={(e) => setEmail(e.target.value)}
212
+ error={errors.email}
213
+ infoText="We'll never share your email."
214
+ />
215
+
216
+ <TextField
217
+ label="Notes"
218
+ rows={4}
219
+ value={notes}
220
+ onChange={(e) => setNotes(e.target.value)}
221
+ actions={[{ id: 'save', text: 'Save', onClick: handleSave }]}
222
+ />
223
+
224
+ <Toggle
225
+ label="Enable notifications"
226
+ checked={enabled}
227
+ onChange={(e) => setEnabled(e.target.checked)}
228
+ />
229
+ ```
230
+
231
+ ### Modal with footer actions
232
+
233
+ ```jsx
234
+ import { Modal, Button } from '@eyesee/ui-components';
235
+
236
+ <Modal
237
+ visible={isOpen}
238
+ title="Delete item"
239
+ description="This action cannot be undone."
240
+ onClose={() => setIsOpen(false)}
241
+ footer={
242
+ <>
243
+ <Button text="Cancel" variant="neutral" type="outline" onClick={() => setIsOpen(false)} />
244
+ <Button text="Delete" variant="destructive" onClick={handleDelete} />
245
+ </>
246
+ }
247
+ />
248
+ ```
249
+
250
+ ### ListItem with trailing actions
251
+
252
+ ```jsx
253
+ import { ListItem } from '@eyesee/ui-components';
254
+ import { EditIcon, DeleteIcon } from '@eyesee/ui-components/icons';
255
+
256
+ <ListItem
257
+ title="Project Alpha"
258
+ description="Last updated 2 days ago"
259
+ item={project}
260
+ trailing={[
261
+ { type: 'edit', icon: <EditIcon />, onClick: (item) => handleEdit(item) },
262
+ { type: 'delete', icon: <DeleteIcon />, onClick: (item) => handleDelete(item) },
263
+ ]}
264
+ />
265
+ ```
266
+
267
+ ---
268
+
269
+ ## Development
270
+
271
+ ```bash
272
+ # Start Storybook dev server (port 6006)
273
+ npm run storybook
274
+
275
+ # Run unit tests
276
+ npm test
277
+
278
+ # Run tests in watch mode
279
+ npm run test:watch
280
+
281
+ # Build the library
282
+ npm run build
283
+
284
+ # Build Storybook
285
+ npm run build-storybook
286
+
287
+ # Preview what gets published to npm
288
+ npm run pack:check
289
+ ```
290
+
291
+ See [UI_LIBRARY_RELEASE_GUIDE.md](./UI_LIBRARY_RELEASE_GUIDE.md) for versioning, release flow, and CI/CD details.
@@ -1,10 +1,10 @@
1
- import { jsxs as c, jsx as n } from "react/jsx-runtime";
1
+ import { jsxs as m, jsx as n } from "react/jsx-runtime";
2
2
  import { useState as W, useRef as j } from "react";
3
- import m from "clsx";
3
+ import c from "clsx";
4
4
  import { ChevronDownIcon as B } from "../icons-v2/ChevronDownIcon.js";
5
5
  import { ChevronUpIcon as L } from "../icons-v2/ChevronUpIcon.js";
6
6
  import R from "../../hooks/useClickOutside.js";
7
- import t from "./Button.module.scss.js";
7
+ import e from "./Button.module.scss.js";
8
8
  import { ListItem as S } from "../ListItem/ListItem.js";
9
9
  import { DropdownList as A } from "../DropdownList/DropdownList.js";
10
10
  import { Tooltip as E } from "../Tooltip/Tooltip.js";
@@ -29,62 +29,63 @@ const Q = ({
29
29
  }) => {
30
30
  const [s, o] = W(!1), h = j(null);
31
31
  R(h, () => o(!1));
32
- const x = (e) => {
33
- i(e), o(!1);
34
- }, D = a && !l && r.length === 0, k = a && !l, T = !!u, f = /* @__PURE__ */ c(
32
+ const x = (t) => {
33
+ i(t), o(!1);
34
+ }, D = a && !l && r.length === 0, k = a && !l, T = !!u, f = /* @__PURE__ */ m(
35
35
  "div",
36
36
  {
37
37
  ref: h,
38
38
  "data-button-wrapper": !0,
39
- className: m(t.wrapper, d, C && t.fullWidth),
39
+ className: c(e.wrapper, d, C && e.fullWidth),
40
40
  ...y,
41
41
  children: [
42
- /* @__PURE__ */ c(
42
+ /* @__PURE__ */ m(
43
43
  "button",
44
44
  {
45
45
  type: "button",
46
- className: m(
47
- t.button,
48
- t[b],
49
- t[g],
50
- t[w],
51
- r.length > 0 && t.hasDropdown,
52
- D && t.iconOnly,
53
- k && t.isIcon
46
+ className: c(
47
+ e.button,
48
+ e[b],
49
+ e[g],
50
+ e[w],
51
+ r.length > 0 && e.hasDropdown,
52
+ D && e.iconOnly,
53
+ k && e.isIcon
54
54
  ),
55
- onClick: () => r.length > 0 ? o((e) => !e) : i(),
55
+ onClick: () => r.length > 0 ? o((t) => !t) : i(),
56
56
  "aria-expanded": s,
57
57
  "aria-haspopup": "menu",
58
58
  disabled: v,
59
59
  children: [
60
- /* @__PURE__ */ c(
60
+ /* @__PURE__ */ m(
61
61
  "span",
62
62
  {
63
- className: m(
64
- t.buttonContent,
65
- r.length > 0 && t.buttonContentDropdown
63
+ className: c(
64
+ e.buttonContent,
65
+ r.length > 0 && e.buttonContentDropdown
66
66
  ),
67
67
  children: [
68
- a && /* @__PURE__ */ n("span", { className: t.icon, children: a }),
69
- l && /* @__PURE__ */ n("span", { className: t.buttonText, children: l })
68
+ a && /* @__PURE__ */ n("span", { className: e.icon, children: a }),
69
+ l && /* @__PURE__ */ n("span", { className: e.buttonText, children: l })
70
70
  ]
71
71
  }
72
72
  ),
73
- r.length > 0 && /* @__PURE__ */ n("span", { className: t.buttonArrow, children: s ? /* @__PURE__ */ n(L, { iconSize: p }) : /* @__PURE__ */ n(B, { iconSize: p }) })
73
+ r.length > 0 && /* @__PURE__ */ n("span", { className: e.buttonArrow, children: s ? /* @__PURE__ */ n(L, { iconSize: p }) : /* @__PURE__ */ n(B, { iconSize: p }) })
74
74
  ]
75
75
  }
76
76
  ),
77
- s && r.length > 0 && /* @__PURE__ */ n(A, { align: N, children: r.map((e) => /* @__PURE__ */ n(
77
+ s && r.length > 0 && /* @__PURE__ */ n(A, { align: N, children: r.map((t) => /* @__PURE__ */ n(
78
78
  S,
79
79
  {
80
- title: e.label,
81
- controlItem: e == null ? void 0 : e.icon,
80
+ role: "menuitem",
81
+ title: t.label,
82
+ controlItem: t == null ? void 0 : t.icon,
82
83
  horizontalSpacing: "xs",
83
84
  verticalSpacing: "none",
84
- ...e,
85
- onClick: () => x(e)
85
+ ...t,
86
+ onClick: () => x(t)
86
87
  },
87
- e.value
88
+ t.value
88
89
  )) })
89
90
  ]
90
91
  }
@@ -1,51 +1,53 @@
1
- const n = "_fullWidth_1l23j_1", t = "_button_1l23j_4", o = "_wrapper_1l23j_8", _ = "_buttonContent_1l23j_25", l = "_icon_1l23j_25", s = "_buttonArrow_1l23j_26", c = "_buttonText_1l23j_34", r = "_iconOnly_1l23j_58", u = "_buttonContentDropdown_1l23j_61", e = "_hasDropdown_1l23j_67", j = "_lg_1l23j_83", x = "_isIcon_1l23j_86", i = "_md_1l23j_90", a = "_sm_1l23j_97", b = "_xs_1l23j_104", d = "_xxs_1l23j_111", p = "_xxxs_1l23j_118", w = "_primary_1l23j_128", y = "_fill_1l23j_128", m = "_outline_1l23j_159", f = "_blank_1l23j_172", h = "_secondary_1l23j_219", C = "_neutral_1l23j_310", D = {
2
- fullWidth: n,
3
- button: t,
1
+ const t = "_fullWidth_1bpdq_1", n = "_button_1bpdq_4", o = "_wrapper_1bpdq_8", _ = "_buttonContent_1bpdq_25", s = "_icon_1bpdq_25", d = "_buttonArrow_1bpdq_26", b = "_buttonText_1bpdq_34", c = "_iconOnly_1bpdq_58", p = "_buttonContentDropdown_1bpdq_61", r = "_hasDropdown_1bpdq_67", e = "_lg_1bpdq_83", l = "_isIcon_1bpdq_86", u = "_md_1bpdq_90", i = "_sm_1bpdq_97", q = "_xs_1bpdq_104", x = "_xxs_1bpdq_111", a = "_xxxs_1bpdq_118", w = "_primary_1bpdq_128", y = "_fill_1bpdq_128", m = "_outline_1bpdq_159", f = "_blank_1bpdq_172", h = "_secondary_1bpdq_219", C = "_destructive_1bpdq_310", D = "_neutral_1bpdq_401", g = {
2
+ fullWidth: t,
3
+ button: n,
4
4
  wrapper: o,
5
5
  buttonContent: _,
6
- icon: l,
7
- buttonArrow: s,
8
- buttonText: c,
9
- iconOnly: r,
10
- buttonContentDropdown: u,
11
- hasDropdown: e,
12
- lg: j,
13
- isIcon: x,
14
- md: i,
15
- sm: a,
16
- xs: b,
17
- xxs: d,
18
- xxxs: p,
6
+ icon: s,
7
+ buttonArrow: d,
8
+ buttonText: b,
9
+ iconOnly: c,
10
+ buttonContentDropdown: p,
11
+ hasDropdown: r,
12
+ lg: e,
13
+ isIcon: l,
14
+ md: u,
15
+ sm: i,
16
+ xs: q,
17
+ xxs: x,
18
+ xxxs: a,
19
19
  primary: w,
20
20
  fill: y,
21
21
  outline: m,
22
22
  blank: f,
23
23
  secondary: h,
24
- neutral: C
24
+ destructive: C,
25
+ neutral: D
25
26
  };
26
27
  export {
27
28
  f as blank,
28
- t as button,
29
- s as buttonArrow,
29
+ n as button,
30
+ d as buttonArrow,
30
31
  _ as buttonContent,
31
- u as buttonContentDropdown,
32
- c as buttonText,
33
- D as default,
32
+ p as buttonContentDropdown,
33
+ b as buttonText,
34
+ g as default,
35
+ C as destructive,
34
36
  y as fill,
35
- n as fullWidth,
36
- e as hasDropdown,
37
- l as icon,
38
- r as iconOnly,
39
- x as isIcon,
40
- j as lg,
41
- i as md,
42
- C as neutral,
37
+ t as fullWidth,
38
+ r as hasDropdown,
39
+ s as icon,
40
+ c as iconOnly,
41
+ l as isIcon,
42
+ e as lg,
43
+ u as md,
44
+ D as neutral,
43
45
  m as outline,
44
46
  w as primary,
45
47
  h as secondary,
46
- a as sm,
48
+ i as sm,
47
49
  o as wrapper,
48
- b as xs,
49
- d as xxs,
50
- p as xxxs
50
+ q as xs,
51
+ x as xxs,
52
+ a as xxxs
51
53
  };
@@ -1,51 +1,50 @@
1
1
  import { jsxs as z, jsx as r } from "react/jsx-runtime";
2
2
  import { useId as C } from "react";
3
- import t from "clsx";
3
+ import n from "clsx";
4
4
  import o from "./Checkbox.module.scss.js";
5
5
  import { CheckmarkLargeIcon as I } from "../icons-v2/CheckmarkLargeIcon.js";
6
6
  import { MinusIcon as y } from "../icons-v2/MinusIcon.js";
7
7
  import { iconSizes as a } from "../icons-v2/constants.js";
8
- const N = (e) => e === "lg" ? "m" : "s", M = ({
8
+ const N = (e) => e === "lg" ? "m" : "s", W = ({
9
9
  label: e,
10
10
  checked: c = !1,
11
- indeterminate: m = !1,
12
- onChange: p = () => {
11
+ indeterminate: t = !1,
12
+ onChange: m = () => {
13
13
  },
14
14
  disabled: i = !1,
15
- size: x = "md",
16
- id: d,
17
- name: f,
18
- value: h,
19
- "aria-label": k
15
+ size: p = "md",
16
+ id: x,
17
+ name: d,
18
+ value: f,
19
+ "aria-label": h
20
20
  }) => {
21
- const b = C(), l = d ?? b, s = N(x), u = a[s] ?? a.m, n = "var(--color--icon--on-color--on-color)";
21
+ const k = C(), b = x ?? k, s = N(p), u = a[s] ?? a.m, l = "var(--color--icon--on-color--on-color)";
22
22
  return /* @__PURE__ */ z(
23
23
  "label",
24
24
  {
25
- className: t(o.checkboxWrapper, i && o.disabled),
25
+ className: n(o.checkboxWrapper, i && o.disabled),
26
26
  style: { "--checkbox-size": u },
27
- htmlFor: l,
28
27
  children: [
29
28
  /* @__PURE__ */ r(
30
29
  "input",
31
30
  {
32
- id: l,
31
+ id: b,
33
32
  type: "checkbox",
34
- name: f,
35
- value: h,
33
+ name: d,
34
+ value: f,
36
35
  className: o.input,
37
36
  checked: c,
38
37
  disabled: i,
39
- "aria-label": k ?? (e ? void 0 : "checkbox"),
40
- onChange: p
38
+ "aria-label": h ?? (e ? void 0 : "checkbox"),
39
+ onChange: m
41
40
  }
42
41
  ),
43
- /* @__PURE__ */ r("span", { className: t(o.checkbox, c && o.filled), "aria-hidden": !0, children: c && (m ? /* @__PURE__ */ r(y, { iconSize: s, strokeColor: n }) : /* @__PURE__ */ r(I, { iconSize: s, strokeColor: n })) }),
42
+ /* @__PURE__ */ r("span", { className: n(o.checkbox, c && o.filled), "aria-hidden": !0, children: c && (t ? /* @__PURE__ */ r(y, { iconSize: s, strokeColor: l }) : /* @__PURE__ */ r(I, { iconSize: s, strokeColor: l })) }),
44
43
  e ? /* @__PURE__ */ r("span", { className: o.labelText, children: e }) : null
45
44
  ]
46
45
  }
47
46
  );
48
47
  };
49
48
  export {
50
- M as Checkbox
49
+ W as Checkbox
51
50
  };
@@ -1,37 +1,40 @@
1
- import { jsx as u } from "react/jsx-runtime";
2
- import f from "clsx";
1
+ import { jsx as g } from "react/jsx-runtime";
2
+ import w from "clsx";
3
3
  import r from "./DropdownList.module.scss.js";
4
- const h = ({
4
+ const a = ({
5
5
  children: e,
6
- align: n = "start",
7
- className: s,
6
+ align: s = "start",
7
+ className: n,
8
8
  dir: o = "down",
9
9
  id: c,
10
- maxWidth: p = "320px",
11
- maxHeight: i,
12
- onLoadMore: t
10
+ listRef: p,
11
+ maxWidth: i = "320px",
12
+ maxHeight: m,
13
+ onLoadMore: t,
14
+ style: d
13
15
  }) => {
14
- const m = (d) => {
15
- const l = d.currentTarget;
16
+ const f = (u) => {
17
+ const l = u.currentTarget;
16
18
  l.scrollHeight - l.scrollTop - l.clientHeight < 48 && (t == null || t());
17
19
  };
18
- return /* @__PURE__ */ u(
20
+ return /* @__PURE__ */ g(
19
21
  "ul",
20
22
  {
23
+ ref: p,
21
24
  id: c,
22
- className: f(
25
+ className: w(
23
26
  r.dropdown,
24
27
  o === "up" && r.dropdownUp,
25
- n === "end" && r.alignEnd,
26
- s
28
+ s === "end" && r.alignEnd,
29
+ n
27
30
  ),
28
31
  role: "menu",
29
- style: { maxWidth: p, maxHeight: i },
30
- onScroll: m,
32
+ style: { maxWidth: i, maxHeight: m, ...d },
33
+ onScroll: f,
31
34
  children: e
32
35
  }
33
36
  );
34
37
  };
35
38
  export {
36
- h as DropdownList
39
+ a as DropdownList
37
40
  };