@phillips/seldon 1.176.1 → 1.177.0

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.
@@ -80,6 +80,11 @@ export interface ComboBoxProps {
80
80
  * Handler called when the combobox loses focus
81
81
  */
82
82
  onBlur?: React.FocusEventHandler<HTMLDivElement>;
83
+ /**
84
+ * Number of characters required in the input before the dropdown options are shown.
85
+ * @default 0
86
+ */
87
+ countOfCharsBeforeDropdown?: number;
83
88
  }
84
89
  /**
85
90
  * ## Overview
@@ -1,9 +1,9 @@
1
- import { jsxs as T, jsx as o } from "react/jsx-runtime";
2
- import { Root as dt, Trigger as ht, Portal as _t, Content as vt } from "../../node_modules/@radix-ui/react-popover/dist/index.js";
1
+ import { jsxs as x, jsx as i } from "react/jsx-runtime";
2
+ import { Root as ht, Trigger as _t, Portal as vt, Content as $t } from "../../node_modules/@radix-ui/react-popover/dist/index.js";
3
3
  import d from "../../node_modules/classnames/index.js";
4
- import { Command as $t, CommandInput as yt, CommandList as wt, CommandGroup as Ct, CommandItem as bt } from "../../node_modules/cmdk/dist/index.js";
5
- import gt, { useState as S, useCallback as b, useRef as k, useMemo as x } from "react";
6
- import { useOnClickOutside as Nt } from "../../node_modules/usehooks-ts/dist/index.js";
4
+ import { Command as yt, CommandInput as Ct, CommandList as bt, CommandGroup as wt, CommandItem as gt } from "../../node_modules/cmdk/dist/index.js";
5
+ import Nt, { useState as S, useCallback as g, useRef as O, useMemo as V } from "react";
6
+ import { useOnClickOutside as It } from "../../node_modules/usehooks-ts/dist/index.js";
7
7
  import "../../assets/formatted/AccountActive.js";
8
8
  import "../../assets/formatted/Account.js";
9
9
  import "../../assets/formatted/Add.js";
@@ -29,11 +29,11 @@ import "../../assets/formatted/ArrowRight.js";
29
29
  import "../../assets/formatted/ArrowUp.js";
30
30
  import "../../assets/formatted/Bag.js";
31
31
  import "../../assets/formatted/Calendar.js";
32
- import It from "../../assets/formatted/ChevronDown.js";
32
+ import Tt from "../../assets/formatted/ChevronDown.js";
33
33
  import "../../assets/formatted/ChevronLeft.js";
34
34
  import "../../assets/formatted/ChevronRight.js";
35
35
  import "../../assets/formatted/ChevronUp.js";
36
- import Ot from "../../assets/formatted/CloseX.js";
36
+ import kt from "../../assets/formatted/CloseX.js";
37
37
  import "../../assets/formatted/ConditionReport.js";
38
38
  import "../../assets/formatted/Delete.js";
39
39
  import "../../assets/formatted/Download.js";
@@ -83,133 +83,135 @@ import "../../assets/formatted/VolumeMaximum.js";
83
83
  import "../../assets/formatted/VolumeMid.js";
84
84
  import "../../assets/formatted/VolumeMinimum.js";
85
85
  import "../../assets/formatted/WeChat.js";
86
- import { getCommonProps as Tt, useNormalizedInputProps as kt } from "../../utils/index.js";
87
- import X from "../IconButton/IconButton.js";
88
- import { ButtonVariants as H } from "../Button/types.js";
89
- import { usePrevious as xt } from "../../utils/usePrevious.js";
90
- const Vt = gt.forwardRef(function({
86
+ import { getCommonProps as xt, useNormalizedInputProps as Ot } from "../../utils/index.js";
87
+ import H from "../IconButton/IconButton.js";
88
+ import { ButtonVariants as J } from "../Button/types.js";
89
+ import { usePrevious as Vt } from "../../utils/usePrevious.js";
90
+ const Dt = Nt.forwardRef(function({
91
91
  options: a = [],
92
- className: J,
93
- id: i,
94
- labelText: Q,
95
- placeholder: Y,
96
- name: V,
92
+ className: Q,
93
+ id: l,
94
+ labelText: Y,
95
+ placeholder: Z,
96
+ name: D,
97
97
  value: p,
98
98
  onChange: u,
99
- onBlur: Z,
99
+ onBlur: tt,
100
100
  renderOption: j,
101
- ariaLabelDropdown: g,
101
+ ariaLabelDropdown: N,
102
102
  ariaLabelInput: q,
103
- ariaLabelClear: N,
103
+ ariaLabelClear: I,
104
104
  ariaLabelContent: z,
105
- hideLabel: tt = !1,
106
- popoverContainerRef: et,
107
- noOptionsMessage: rt = "No Options.",
108
- invalid: I = !1,
109
- invalidText: ot,
110
- ...it
111
- }, D) {
112
- const { className: e, ...st } = Tt({ id: i }, "ComboBox"), lt = It, nt = Ot, G = kt({
113
- id: i,
114
- invalid: I,
115
- invalidText: ot,
105
+ hideLabel: et = !1,
106
+ popoverContainerRef: rt,
107
+ noOptionsMessage: ot = "No Options.",
108
+ invalid: T = !1,
109
+ invalidText: it,
110
+ countOfCharsBeforeDropdown: G = 0,
111
+ ...lt
112
+ }, M) {
113
+ const { className: e, ...st } = xt({ id: l }, "ComboBox"), nt = Tt, at = kt, K = Ot({
114
+ id: l,
115
+ invalid: T,
116
+ invalidText: it,
116
117
  type: "text"
117
- }), [f, K] = S(!1), [at, mt] = S(""), U = xt(p), R = b((t) => t.label || t.value, []), [s, $] = S(() => {
118
+ }), [f, U] = S(!1), [mt, ct] = S(""), W = Vt(p), R = g((t) => t.label || t.value, []), [o, $] = S(() => {
118
119
  if (p !== void 0) {
119
120
  const t = a.find((r) => r.value === p);
120
121
  return t ? t.displayValue || R(t) : "";
121
122
  }
122
123
  return "";
123
- }), y = k(null), w = k(null), C = k(!1), E = k(null), m = b((t) => R(t), [R]), h = p !== void 0, F = h ? p : at, l = x(() => a.find((t) => t.value === F) || null, [a, F]), _ = x(() => l ? l.displayValue || m(l) : "", [l, m]), c = x(() => {
124
- if (!s || l && s === _)
124
+ }), y = O(null), C = O(null), b = O(!1), E = O(null), m = g((t) => R(t), [R]), h = p !== void 0, F = h ? p : mt, s = V(() => a.find((t) => t.value === F) || null, [a, F]), _ = V(() => s ? s.displayValue || m(s) : "", [s, m]), c = V(() => {
125
+ if (!o || s && o === _)
125
126
  return a;
126
- const t = s.toLowerCase().trim();
127
+ const t = o.toLowerCase().trim();
127
128
  return a.filter((r) => {
128
- const B = m(r).toLowerCase().includes(t), L = r.value.toLowerCase().includes(t), A = r.displayValue?.toLowerCase().includes(t) || !1;
129
+ const w = m(r).toLowerCase().includes(t), A = r.value.toLowerCase().includes(t), B = r.displayValue?.toLowerCase().includes(t) || !1;
129
130
  let v = !1;
130
- return r.filterTerms && r.filterTerms.length > 0 && (v = r.filterTerms.some((ft) => ft.toLowerCase().includes(t))), B || L || A || v;
131
+ return r.filterTerms && r.filterTerms.length > 0 && (v = r.filterTerms.some((dt) => dt.toLowerCase().includes(t))), w || A || B || v;
131
132
  });
132
- }, [s, _, l, m, a]), n = b(
133
- (t) => {
134
- K(t), t && l && c.length > 5 && requestAnimationFrame(() => {
133
+ }, [o, _, s, m, a]), n = g(
134
+ (t, r) => {
135
+ const w = (r?.length || o.length) >= G;
136
+ (!t || t && w) && U(t), t && s && c.length > 5 && requestAnimationFrame(() => {
135
137
  E.current && E.current.scrollIntoView({
136
138
  block: "nearest",
137
139
  behavior: "auto"
138
140
  });
139
141
  });
140
142
  },
141
- [l, c.length]
142
- ), O = b(
143
+ [G, o.length, s, c.length]
144
+ ), k = g(
143
145
  (t) => {
144
- h || mt(t.value);
146
+ h || ct(t.value);
145
147
  const r = t.displayValue || m(t);
146
- $(r), u && u(t.value, t), n(!1), C.current = !0, requestAnimationFrame(() => {
147
- C.current = !1;
148
+ $(r), u && u(t.value, t), n(!1), b.current = !0, requestAnimationFrame(() => {
149
+ b.current = !1;
148
150
  });
149
151
  },
150
152
  [h, u, n, m]
151
- ), ct = (t) => {
152
- n(!1), C.current = !0, t.preventDefault(), t.stopPropagation(), u && h && u("", null), $(""), w.current?.focus(), requestAnimationFrame(() => {
153
- C.current = !1;
153
+ ), pt = (t) => {
154
+ n(!1), b.current = !0, t.preventDefault(), t.stopPropagation(), u && h && u("", null), $(""), C.current?.focus(), requestAnimationFrame(() => {
155
+ b.current = !1;
154
156
  });
155
- }, pt = () => {
156
- K(!f), w.current?.focus();
157
- }, ut = (t) => {
158
- $(t), t !== "" && c.length > 0 && n(!0);
159
- }, W = x(() => {
157
+ }, ut = () => {
158
+ U(!f), C.current?.focus();
159
+ }, ft = (t) => {
160
+ $(t), t !== "" && c.length > 0 && n(!0, t);
161
+ }, X = V(() => {
160
162
  if (h) {
161
- if (p !== U)
162
- return l ? _ : s;
163
- if (l) {
163
+ if (p !== W)
164
+ return s ? _ : o;
165
+ if (s) {
164
166
  const t = _;
165
- return t !== s ? s : t;
167
+ return t !== o ? o : t;
166
168
  } else
167
- return s;
169
+ return o;
168
170
  }
169
- return s;
170
- }, [h, s, p, U, l, _]), M = (t) => {
171
- if (l) {
171
+ return o;
172
+ }, [h, o, p, W, s, _]), P = (t) => {
173
+ if (s) {
172
174
  const r = _;
173
- r !== W && !t && $(r);
175
+ r !== X && !t && $(r);
174
176
  } else
175
177
  $("");
176
- }, P = b(() => {
178
+ }, L = g(() => {
177
179
  const t = a.filter((r) => {
178
- const B = m(r).toLowerCase(), L = r.value.toLowerCase(), A = r.displayValue?.toLowerCase(), v = s.toLowerCase();
179
- return B === v || L === v || A === v;
180
+ const w = m(r).toLowerCase(), A = r.value.toLowerCase(), B = r.displayValue?.toLowerCase(), v = o.toLowerCase();
181
+ return w === v || A === v || B === v;
180
182
  });
181
- t.length === 1 && O(t[0]);
182
- }, [s, a, O, m]);
183
- return Nt(y, (t) => {
184
- t.target.closest(`.${e}__item`) || t.target.closest(`.${e}__content`) || y.current?.contains(t.target) || t.target === y.current || (P(), M(), n(!1));
185
- }), /* @__PURE__ */ T("div", { ref: D, className: d(e, J), id: i, ...st, ...it, children: [
186
- V && /* @__PURE__ */ o(
183
+ t.length === 1 && k(t[0]);
184
+ }, [o, a, k, m]);
185
+ return It(y, (t) => {
186
+ t.target.closest(`.${e}__item`) || t.target.closest(`.${e}__content`) || y.current?.contains(t.target) || t.target === y.current || (L(), P(), n(!1));
187
+ }), /* @__PURE__ */ x("div", { ref: M, className: d(e, Q), id: l, ...st, ...lt, children: [
188
+ D && /* @__PURE__ */ i(
187
189
  "input",
188
190
  {
189
191
  type: "hidden",
190
- name: V,
191
- id: V,
192
+ name: D,
193
+ id: D,
192
194
  value: F || "",
193
195
  ref: (t) => {
194
- typeof D == "function" && t && D(t);
196
+ typeof M == "function" && t && M(t);
195
197
  }
196
198
  }
197
199
  ),
198
- /* @__PURE__ */ T("div", { ref: y, className: `${e}__wrapper`, children: [
199
- /* @__PURE__ */ o(
200
+ /* @__PURE__ */ x("div", { ref: y, className: `${e}__wrapper`, children: [
201
+ /* @__PURE__ */ i(
200
202
  "label",
201
203
  {
202
- htmlFor: `${i}-input`,
204
+ htmlFor: `${l}-input`,
203
205
  className: d(`${e}__label`, {
204
- [`${e}__label--hidden`]: tt,
205
- [`${e}__label--invalid`]: I
206
+ [`${e}__label--hidden`]: et,
207
+ [`${e}__label--invalid`]: T
206
208
  }),
207
- "data-testid": `${i}-label`,
208
- children: Q
209
+ "data-testid": `${l}-label`,
210
+ children: Y
209
211
  }
210
212
  ),
211
- /* @__PURE__ */ o(
212
- $t,
213
+ /* @__PURE__ */ i(
214
+ yt,
213
215
  {
214
216
  loop: !0,
215
217
  onKeyDown: (t) => {
@@ -219,80 +221,80 @@ const Vt = gt.forwardRef(function({
219
221
  },
220
222
  shouldFilter: !1,
221
223
  className: `${e}__command-wrapper`,
222
- children: /* @__PURE__ */ T(dt, { open: f, modal: !1, children: [
223
- /* @__PURE__ */ o(ht, { asChild: !0, children: /* @__PURE__ */ T(
224
+ children: /* @__PURE__ */ x(ht, { open: f, modal: !1, children: [
225
+ /* @__PURE__ */ i(_t, { asChild: !0, children: /* @__PURE__ */ x(
224
226
  "div",
225
227
  {
226
228
  className: d(`${e}__input-wrapper`, {
227
- [`${e}__input-wrapper--invalid`]: I
229
+ [`${e}__input-wrapper--invalid`]: T
228
230
  }),
229
231
  children: [
230
- /* @__PURE__ */ o(
231
- yt,
232
+ /* @__PURE__ */ i(
233
+ Ct,
232
234
  {
233
- id: `${i}-input`,
234
- placeholder: Y,
235
- value: W,
236
- onValueChange: ut,
235
+ id: `${l}-input`,
236
+ placeholder: Z,
237
+ value: X,
238
+ onValueChange: ft,
237
239
  tabIndex: 0,
238
240
  onFocus: () => {
239
- c.length > 0 && !C.current && !f && n(!0);
241
+ c.length > 0 && !b.current && !f && n(!0);
240
242
  },
241
243
  onClick: (t) => {
242
244
  n(!0), t.preventDefault(), t.currentTarget.focus();
243
245
  },
244
246
  onKeyDown: (t) => {
245
- t.key === "Tab" ? (n(!1), P(), M()) : t.key === "Enter" && !f ? (u && u(s, null), c.length === 1 && O(c[0])) : t.key === "Escape" ? (n(!1), t.preventDefault(), P(), M()) : (t.key === "ArrowDown" || t.key === "ArrowUp") && !f && c.length > 0 && (n(!0), t.preventDefault());
247
+ t.key === "Tab" ? (n(!1), L(), P()) : t.key === "Enter" && !f ? (u && u(o, null), c.length === 1 && k(c[0])) : t.key === "Escape" ? (n(!1), t.preventDefault(), L(), P()) : (t.key === "ArrowDown" || t.key === "ArrowUp") && !f && c.length > 0 && (n(!0), t.preventDefault());
246
248
  },
247
- onBlur: Z,
249
+ onBlur: tt,
248
250
  className: d(`${e}__input`, {
249
- [`${e}__input--invalid`]: I
251
+ [`${e}__input--invalid`]: T
250
252
  }),
251
- "aria-label": q || `${i}-input`,
252
- "data-testid": `${i}-input`,
253
- ref: w
253
+ "aria-label": q || `${l}-input`,
254
+ "data-testid": `${l}-input`,
255
+ ref: C
254
256
  }
255
257
  ),
256
- s && /* @__PURE__ */ o(
257
- X,
258
+ o && /* @__PURE__ */ i(
259
+ H,
258
260
  {
259
261
  className: `${e}__close-button`,
260
- "data-testid": `${i}-clear-button`,
261
- onClick: ct,
262
- "aria-label": N || `${i}-clear`,
262
+ "data-testid": `${l}-clear-button`,
263
+ onClick: pt,
264
+ "aria-label": I || `${l}-clear`,
263
265
  tabIndex: -1,
264
- variant: H.tertiary,
265
- children: /* @__PURE__ */ o(
266
- nt,
266
+ variant: J.tertiary,
267
+ children: /* @__PURE__ */ i(
268
+ at,
267
269
  {
268
270
  color: "currentColor",
269
271
  height: 18,
270
272
  width: 18,
271
273
  className: `${e}__icon-button`,
272
- title: N || `${i}-clear`
274
+ title: I || `${l}-clear`
273
275
  }
274
276
  )
275
277
  }
276
278
  ),
277
- /* @__PURE__ */ o(
278
- X,
279
+ /* @__PURE__ */ i(
280
+ H,
279
281
  {
280
- "aria-label": g || `${i}-dropdown`,
282
+ "aria-label": N || `${l}-dropdown`,
281
283
  className: d(`${e}__dropdown-button`, {
282
284
  [`${e}__dropdown-button--open`]: f
283
285
  }),
284
- onClick: pt,
285
- "data-testid": `${i}-dropdown`,
286
+ onClick: ut,
287
+ "data-testid": `${l}-dropdown`,
286
288
  tabIndex: -1,
287
- variant: H.tertiary,
288
- children: /* @__PURE__ */ o(
289
- lt,
289
+ variant: J.tertiary,
290
+ children: /* @__PURE__ */ i(
291
+ nt,
290
292
  {
291
293
  color: "currentColor",
292
294
  height: 18,
293
295
  width: 18,
294
296
  className: `${e}__icon-button`,
295
- title: g || `${i}-dropdown`
297
+ title: N || `${l}-dropdown`
296
298
  }
297
299
  )
298
300
  }
@@ -300,44 +302,44 @@ const Vt = gt.forwardRef(function({
300
302
  ]
301
303
  }
302
304
  ) }),
303
- f && /* @__PURE__ */ o(_t, { container: et?.current || document.body, children: /* @__PURE__ */ o(
304
- vt,
305
+ f && /* @__PURE__ */ i(vt, { container: rt?.current || document.body, children: /* @__PURE__ */ i(
306
+ $t,
305
307
  {
306
308
  className: `${e}__content`,
307
- "aria-label": z || `${i}-content`,
309
+ "aria-label": z || `${l}-content`,
308
310
  side: "bottom",
309
311
  sideOffset: -5,
310
312
  align: "start",
311
313
  alignOffset: 0,
312
314
  onFocus: () => {
313
- document.activeElement !== w.current && w.current?.focus();
315
+ document.activeElement !== C.current && C.current?.focus();
314
316
  },
315
317
  style: {
316
318
  width: y.current?.offsetWidth || "100%"
317
319
  },
318
- children: /* @__PURE__ */ o(wt, { className: `${e}__list`, children: c.length > 0 ? /* @__PURE__ */ o(Ct, { className: `${e}__group`, children: c.map((t) => /* @__PURE__ */ o(
319
- bt,
320
+ children: /* @__PURE__ */ i(bt, { className: `${e}__list`, children: c.length > 0 ? /* @__PURE__ */ i(wt, { className: `${e}__group`, children: c.map((t) => /* @__PURE__ */ i(
321
+ gt,
320
322
  {
321
323
  className: d(`${e}__item`, {
322
- [`${e}__item--selected`]: l?.value === t.value
324
+ [`${e}__item--selected`]: s?.value === t.value
323
325
  }),
324
326
  value: t.value,
325
- onSelect: () => O(t),
326
- ...l?.value === t.value ? { ref: E } : {},
327
+ onSelect: () => k(t),
328
+ ...s?.value === t.value ? { ref: E } : {},
327
329
  children: j ? j(t) : m(t)
328
330
  },
329
331
  t.value
330
- )) }) : /* @__PURE__ */ o("div", { className: `${e}__no-options`, children: rt }) })
332
+ )) }) : /* @__PURE__ */ i("div", { className: `${e}__no-options`, children: ot }) })
331
333
  }
332
334
  ) })
333
335
  ] })
334
336
  }
335
337
  ),
336
- G.validation ? G.validation : /* @__PURE__ */ o("p", { className: d(`${e}__validation`), children: " " })
338
+ K.validation ? K.validation : /* @__PURE__ */ i("p", { className: d(`${e}__validation`), children: " " })
337
339
  ] })
338
340
  ] });
339
341
  });
340
- Vt.displayName = "ComboBox";
342
+ Dt.displayName = "ComboBox";
341
343
  export {
342
- Vt as default
344
+ Dt as default
343
345
  };
@@ -12,6 +12,7 @@ export declare const Playground: {
12
12
  options: ComboBoxOption[];
13
13
  id: string;
14
14
  labelText: string;
15
+ noOptionsMessage: string;
15
16
  };
16
17
  argTypes: {
17
18
  options: {
@@ -53,6 +54,12 @@ export declare const Playground: {
53
54
  value: {
54
55
  control: boolean;
55
56
  };
57
+ countOfCharsBeforeDropdown: {
58
+ control: string;
59
+ };
60
+ noOptionsMessage: {
61
+ control: string;
62
+ };
56
63
  };
57
64
  };
58
65
  export declare const ComboBoxInDrawer: () => import("react/jsx-runtime").JSX.Element;
@@ -1,10 +1,14 @@
1
- import { useToastContext as s } from "./useToastContext.js";
2
- const l = () => {
3
- const { addToast: e } = s();
4
- return (t) => {
5
- typeof t == "object" && t !== null && "title" in t ? e(t) : e({ title: t });
6
- };
1
+ import { useToastContext as a } from "./useToastContext.js";
2
+ import { useCallback as o } from "react";
3
+ const c = () => {
4
+ const { addToast: e } = a();
5
+ return o(
6
+ (t) => {
7
+ typeof t == "object" && t !== null && "title" in t ? e(t) : e({ title: t });
8
+ },
9
+ [e]
10
+ );
7
11
  };
8
12
  export {
9
- l as useToast
13
+ c as useToast
10
14
  };
@@ -176,6 +176,10 @@
176
176
  margin-top: $spacing-xsm;
177
177
  }
178
178
 
179
+ &__no-options {
180
+ padding-left: $padding-xsm;
181
+ }
182
+
179
183
  @keyframes fade-in {
180
184
  from {
181
185
  opacity: 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phillips/seldon",
3
- "version": "1.176.1",
3
+ "version": "1.177.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/PhillipsAuctionHouse/seldon"