@epam/ai-dial-ui-kit 0.16.0-dev.67 → 0.16.0-dev.69

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.
@@ -1,29 +1,29 @@
1
- import { jsx as l, jsxs as N, Fragment as Ve } from "react/jsx-runtime";
2
- import { IconChevronDown as qe } from "@tabler/icons-react";
3
- import { useId as Ge, useState as U, useCallback as m, useMemo as u, useEffect as He, useImperativeHandle as Qe, Fragment as We } from "react";
4
- import { Checkbox as Ze } from "../Checkbox/Checkbox.js";
5
- import { Dropdown as Je } from "../Dropdown/Dropdown.js";
6
- import { EllipsisTooltip as Re } from "../EllipsisTooltip/EllipsisTooltip.js";
7
- import { InteractiveTooltip as Xe } from "../InteractiveTooltip/InteractiveTooltip.js";
8
- import { ErrorText as Ye, CaptionText as Pe } from "../CaptionText/CaptionText.js";
9
- import { GhostIconButton as el } from "../IconButton/IconButtonWrappers.js";
1
+ import { jsx as l, jsxs as N, Fragment as Ge } from "react/jsx-runtime";
2
+ import { IconChevronDown as He } from "@tabler/icons-react";
3
+ import { useId as Qe, useState as U, useCallback as u, useMemo as h, useEffect as We, useImperativeHandle as Ze, Fragment as Je } from "react";
4
+ import { Checkbox as Re } from "../Checkbox/Checkbox.js";
5
+ import { Dropdown as Xe } from "../Dropdown/Dropdown.js";
6
+ import { EllipsisTooltip as Ye } from "../EllipsisTooltip/EllipsisTooltip.js";
7
+ import { InteractiveTooltip as Pe } from "../InteractiveTooltip/InteractiveTooltip.js";
8
+ import { ErrorText as el, CaptionText as ll } from "../CaptionText/CaptionText.js";
9
+ import { GhostIconButton as tl } from "../IconButton/IconButtonWrappers.js";
10
10
  import { Input as se } from "../Input/Input.js";
11
- import { Label as ll } from "../Label/Label.js";
12
- import { NoDataContent as tl } from "../NoDataContent/NoDataContent.js";
13
- import { DIAL_KIT_ICON_STROKE as nl } from "../constants/icon.js";
11
+ import { Label as nl } from "../Label/Label.js";
12
+ import { NoDataContent as rl } from "../NoDataContent/NoDataContent.js";
13
+ import { DIAL_KIT_ICON_STROKE as il } from "../constants/icon.js";
14
14
  import { DIAL_ICON_SIZE as ce } from "../../../constants/icon.js";
15
15
  import { MenuItem as de } from "../MenuItem/MenuItem.js";
16
16
  import { MenuItemMark as V } from "../../../types/menu-item.js";
17
17
  import { ElementSize as D } from "../../../types/size.js";
18
- import { useIsMobileScreen as rl } from "../../../hooks/use-is-mobile-screen.js";
18
+ import { useIsMobileScreen as al } from "../../../hooks/use-is-mobile-screen.js";
19
19
  import { resolveAccessibleName as fe } from "../../../utils/accessible-name.js";
20
20
  import { mergeClasses as p } from "../../../utils/merge-classes.js";
21
- import { CollapsedSelectTags as il } from "./CollapsedSelectTags.js";
22
- import { MultiSelectTags as al } from "./MultiSelectTags.js";
23
- import { SelectSubMenuItem as ol } from "./SelectSubMenuItem.js";
24
- import { selectFieldIconClassName as sl, selectListWidthClassName as cl, selectOverlayBaseClassName as dl, selectSearchThreshold as fl, selectSearchIcon as ml, selectCloseIcon as ul, selectOptionBaseClassName as hl, selectOptionsScrollClassName as pl } from "./constants.js";
25
- import { DIAL_KIT_CLASS as vl } from "../../../constants/public-class-names.js";
26
- const Vl = ({
21
+ import { CollapsedSelectTags as ol } from "./CollapsedSelectTags.js";
22
+ import { MultiSelectTags as sl } from "./MultiSelectTags.js";
23
+ import { SelectSubMenuItem as cl } from "./SelectSubMenuItem.js";
24
+ import { selectFieldIconClassName as dl, selectListWidthClassName as fl, selectOverlayBaseClassName as ml, selectSearchThreshold as ul, selectSearchIcon as hl, selectCloseIcon as pl, selectOptionBaseClassName as vl, selectOptionsScrollClassName as bl } from "./constants.js";
25
+ import { DIAL_KIT_CLASS as Cl } from "../../../constants/public-class-names.js";
26
+ const Gl = ({
27
27
  options: i,
28
28
  multiple: n = !1,
29
29
  id: me,
@@ -49,96 +49,98 @@ const Vl = ({
49
49
  emptyStateTitle: Ie = "No options available",
50
50
  emptyStateDescription: Ne,
51
51
  emptyStateIcon: Se,
52
+ filteredEmptyStateTitle: xe,
53
+ filteredEmptyStateDescription: we,
52
54
  disabled: b = !1,
53
- className: xe,
54
- fieldClassName: we,
55
- listClassName: ye,
55
+ className: ye,
56
+ fieldClassName: Te,
57
+ listClassName: Ae,
56
58
  closable: L = !1,
57
59
  header: x,
58
60
  footer: w,
59
61
  onClose: Y,
60
62
  onChange: P,
61
- dismissRef: Te,
63
+ dismissRef: ke,
62
64
  onFooterClick: ee,
63
65
  open: le,
64
66
  onOpenChange: te,
65
67
  onSearchQueryChange: ne,
66
68
  customMultiSelectTagsRenderer: $
67
69
  }) => {
68
- const Ae = Ge(), c = me || Ae, re = `list-${c}`, ie = v ? `${c}-error` : void 0, ae = !v && Q ? `${c}-caption` : void 0, oe = q === D.Small, [ke, Oe] = U(!1), M = le !== void 0, f = M ? !!le : ke, d = m(
70
+ const Oe = Qe(), d = me || Oe, re = `list-${d}`, ie = v ? `${d}-error` : void 0, ae = !v && Q ? `${d}-caption` : void 0, oe = q === D.Small, [De, Fe] = U(!1), M = le !== void 0, m = M ? !!le : De, f = u(
69
71
  (e) => {
70
- M || Oe(e), te?.(e);
72
+ M || Fe(e), te?.(e);
71
73
  },
72
74
  [M, te]
73
- ), [h, De] = U(""), B = m(
75
+ ), [s, Le] = U(""), B = u(
74
76
  (e) => {
75
- e !== h && (De(e || ""), ne?.(e || ""));
77
+ e !== s && (Le(e || ""), ne?.(e || ""));
76
78
  },
77
- [ne, h]
78
- ), E = F !== void 0, [Fe, Le] = U(ue), C = E ? F : Fe, r = u(() => n ? Array.isArray(C) ? C : [] : typeof C == "string" ? [C] : [], [C, n]), y = u(() => {
79
- const e = h.trim().toLowerCase();
79
+ [ne, s]
80
+ ), E = F !== void 0, [$e, Me] = U(ue), C = E ? F : $e, r = h(() => n ? Array.isArray(C) ? C : [] : typeof C == "string" ? [C] : [], [C, n]), y = h(() => {
81
+ const e = s.trim().toLowerCase();
80
82
  return e ? i.filter((t) => t.label.toLowerCase().includes(e)) : i;
81
- }, [i, h]);
82
- He(() => {
83
- f || B("");
84
- }, [f, B]);
85
- const s = m(
83
+ }, [i, s]);
84
+ We(() => {
85
+ m || B("");
86
+ }, [m, B]);
87
+ const c = u(
86
88
  (e) => {
87
- E || Le(e), P?.(e);
89
+ E || Me(e), P?.(e);
88
90
  },
89
91
  [E, P]
90
- ), _ = m(
92
+ ), _ = u(
91
93
  (e) => {
92
94
  if (n) {
93
95
  const t = new Set(r);
94
- t.has(e) ? t.delete(e) : t.add(e), s(Array.from(t));
96
+ t.has(e) ? t.delete(e) : t.add(e), c(Array.from(t));
95
97
  return;
96
98
  }
97
- s(e), d(!1);
99
+ c(e), f(!1);
98
100
  },
99
- [n, s, d, r]
100
- ), T = m(
101
+ [n, c, f, r]
102
+ ), T = u(
101
103
  (e, t) => {
102
104
  if (e.stopPropagation(), !n) {
103
- s("");
105
+ c("");
104
106
  return;
105
107
  }
106
- const O = r.filter((Ue) => Ue !== t);
107
- s(O);
108
+ const O = r.filter((qe) => qe !== t);
109
+ c(O);
108
110
  },
109
- [n, r, s]
110
- ), o = u(
111
+ [n, r, c]
112
+ ), o = h(
111
113
  () => y.filter((e) => !e.disabled),
112
114
  [y]
113
- ), j = u(
115
+ ), j = h(
114
116
  () => o.filter((e) => r.includes(e.value)).length,
115
117
  [o, r]
116
- ), { allSelectedInFiltered: K, someSelectedInFiltered: $e } = u(() => {
118
+ ), { allSelectedInFiltered: K, someSelectedInFiltered: Be } = h(() => {
117
119
  const e = o.length > 0 && j === o.length;
118
120
  return {
119
121
  allSelectedInFiltered: e,
120
122
  someSelectedInFiltered: j > 0 && !e
121
123
  };
122
- }, [o, j]), Me = m(() => {
124
+ }, [o, j]), Ee = u(() => {
123
125
  if (!(!n || o.length === 0))
124
126
  if (K) {
125
127
  const e = new Set(o.map((t) => t.value));
126
- s(r.filter((t) => !e.has(t)));
128
+ c(r.filter((t) => !e.has(t)));
127
129
  } else {
128
130
  const e = new Set(r);
129
- o.forEach((t) => e.add(t.value)), s(Array.from(e));
131
+ o.forEach((t) => e.add(t.value)), c(Array.from(e));
130
132
  }
131
133
  }, [
132
134
  K,
133
135
  n,
134
136
  o,
135
137
  r,
136
- s
137
- ]), A = r.length > 0, k = !n && A ? r[0] : void 0, a = u(
138
+ c
139
+ ]), A = r.length > 0, k = !n && A ? r[0] : void 0, a = h(
138
140
  () => k ? i.find((e) => e.value === k) ?? i.flatMap((e) => e.children ?? []).find((e) => e.value === k) : void 0,
139
141
  [i, k]
140
- ), g = a ? G ? `${G} ${a.label}` : a.label : void 0, Be = rl(), z = n && ge && !$ && !Be, I = u(() => n ? A ? z ? /* @__PURE__ */ l(
141
- il,
142
+ ), g = a ? G ? `${G} ${a.label}` : a.label : void 0, _e = al(), z = n && ge && !$ && !_e, I = h(() => n ? A ? z ? /* @__PURE__ */ l(
143
+ ol,
142
144
  {
143
145
  options: i,
144
146
  selectedValues: r,
@@ -149,7 +151,7 @@ const Vl = ({
149
151
  r,
150
152
  T
151
153
  ) ?? /* @__PURE__ */ l(
152
- al,
154
+ sl,
153
155
  {
154
156
  options: i,
155
157
  selectedValues: r,
@@ -157,7 +159,7 @@ const Vl = ({
157
159
  }
158
160
  ) }) : null : !a || !a.labelNode && !a.description ? null : /* @__PURE__ */ N("span", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
159
161
  /* @__PURE__ */ l(
160
- Re,
162
+ Ye,
161
163
  {
162
164
  text: a.labelNode ?? g
163
165
  }
@@ -173,78 +175,79 @@ const Vl = ({
173
175
  g,
174
176
  r,
175
177
  a
176
- ]), Ee = n || I ? "" : g || (H && F ? H : ""), _e = typeof S?.label == "string" ? S.label : void 0, je = I ? [
177
- fe(W, _e),
178
+ ]), je = n || I ? "" : g || (H && F ? H : ""), Ke = typeof S?.label == "string" ? S.label : void 0, ze = I ? [
179
+ fe(W, Ke),
178
180
  n ? r.map((e) => i.find((t) => t.value === e)?.label ?? e).join(", ") : g
179
181
  ].filter(Boolean).join(", ") || void 0 : fe(W);
180
- Qe(Te, () => ({
182
+ Ze(ke, () => ({
181
183
  dismiss: () => {
182
- d(!1);
184
+ f(!1);
183
185
  }
184
186
  }));
185
- const Ke = m(
187
+ const Ue = u(
186
188
  (e) => {
187
- b || (e.key === "ArrowDown" || e.key === "ArrowUp") && (e.preventDefault(), f || d(!0));
189
+ b || (e.key === "ArrowDown" || e.key === "ArrowUp") && (e.preventDefault(), m || f(!0));
188
190
  },
189
- [b, f, d]
190
- ), ze = () => /* @__PURE__ */ N(
191
+ [b, m, f]
192
+ ), Ve = () => /* @__PURE__ */ N(
191
193
  "div",
192
194
  {
193
195
  id: re,
194
196
  role: "listbox",
195
197
  "aria-multiselectable": n || void 0,
196
- className: dl,
198
+ className: ml,
197
199
  children: [
198
- x && /* @__PURE__ */ l(Ve, { children: typeof x == "function" ? x() : x }),
199
- (Z || L) && (i.length > fl || !!h) && /* @__PURE__ */ N("div", { className: "flex items-center gap-2 px-2 pt-2", children: [
200
+ x && /* @__PURE__ */ l(Ge, { children: typeof x == "function" ? x() : x }),
201
+ (Z || L) && (i.length > ul || !!s) && /* @__PURE__ */ N("div", { className: "flex items-center gap-2 px-2 pt-2", children: [
200
202
  Z && /* @__PURE__ */ l(
201
203
  se,
202
204
  {
203
- id: `search-${c}`,
205
+ id: `search-${d}`,
204
206
  size: ve,
205
207
  placeholder: J,
206
208
  "aria-label": J || "Search options",
207
209
  onChange: (e) => B(e),
208
- value: h,
209
- iconBefore: ml,
210
+ value: s,
211
+ iconBefore: hl,
210
212
  containerClassName: "w-full"
211
213
  }
212
214
  ),
213
215
  L && /* @__PURE__ */ l(
214
- el,
216
+ tl,
215
217
  {
216
218
  "aria-label": "Close select",
217
219
  className: "shrink-0",
218
220
  size: D.Small,
219
- icon: ul,
221
+ icon: pl,
220
222
  onClick: (e) => {
221
- Y?.(e), d(!1);
223
+ Y?.(e), f(!1);
222
224
  }
223
225
  }
224
226
  )
225
227
  ] }),
226
- n && be && o.length > 0 && /* @__PURE__ */ l("div", { className: p(hl, "mt-2"), children: /* @__PURE__ */ l(
227
- Ze,
228
+ n && be && o.length > 0 && /* @__PURE__ */ l("div", { className: p(vl, "mt-2"), children: /* @__PURE__ */ l(
229
+ Re,
228
230
  {
229
- id: `${c}-selectAll`,
231
+ id: `${d}-selectAll`,
230
232
  labelProps: { label: Ce },
231
233
  isSelected: K,
232
- isIndeterminate: $e,
233
- onChange: Me
234
+ isIndeterminate: Be,
235
+ onChange: Ee
234
236
  }
235
237
  ) }),
236
- /* @__PURE__ */ l("div", { role: "none", className: pl, children: y.length === 0 ? /* @__PURE__ */ l("div", { className: "px-2 py-3", children: /* @__PURE__ */ l(
237
- tl,
238
+ /* @__PURE__ */ l("div", { role: "none", className: bl, children: y.length === 0 ? /* @__PURE__ */ l("div", { className: "px-2 py-3", children: /* @__PURE__ */ l(
239
+ rl,
238
240
  {
241
+ live: !!s,
239
242
  icon: Se,
240
- title: Ie,
241
- description: Ne
243
+ title: s && xe || Ie,
244
+ description: s && we || Ne
242
245
  }
243
246
  ) }) : y.map((e) => {
244
247
  const t = r.includes(e.value);
245
248
  if (e.children?.length)
246
249
  return /* @__PURE__ */ l(
247
- ol,
250
+ cl,
248
251
  {
249
252
  opt: e,
250
253
  selectedValues: r,
@@ -264,7 +267,7 @@ const Vl = ({
264
267
  /* @__PURE__ */ l(
265
268
  de,
266
269
  {
267
- id: `${c}-${e.value}`,
270
+ id: `${d}-${e.value}`,
268
271
  role: "option",
269
272
  "aria-selected": t,
270
273
  "aria-disabled": !!e.disabled,
@@ -295,8 +298,8 @@ const Vl = ({
295
298
  onClick: () => !e.disabled && _(e.value)
296
299
  }
297
300
  );
298
- return /* @__PURE__ */ l(We, { children: e.interactiveTooltip ? /* @__PURE__ */ l(
299
- Xe,
301
+ return /* @__PURE__ */ l(Je, { children: e.interactiveTooltip ? /* @__PURE__ */ l(
302
+ Pe,
300
303
  {
301
304
  asChild: !0,
302
305
  placement: e.interactiveTooltip.placement,
@@ -310,7 +313,7 @@ const Vl = ({
310
313
  "div",
311
314
  {
312
315
  onClick: (e) => {
313
- ee?.(e), ee && d(!1);
316
+ ee?.(e), ee && f(!1);
314
317
  },
315
318
  children: typeof w == "function" ? w() : w
316
319
  }
@@ -323,54 +326,54 @@ const Vl = ({
323
326
  {
324
327
  className: p(
325
328
  "flex w-full flex-col gap-2",
326
- xe,
327
- vl.select
329
+ ye,
330
+ Cl.select
328
331
  ),
329
332
  children: [
330
- S && /* @__PURE__ */ l(ll, { ...S, htmlFor: c }),
333
+ S && /* @__PURE__ */ l(nl, { ...S, htmlFor: d }),
331
334
  /* @__PURE__ */ N("div", { className: "flex flex-col gap-1", children: [
332
335
  /* @__PURE__ */ l(
333
- Je,
336
+ Xe,
334
337
  {
335
- open: f,
336
- onOpenChange: d,
338
+ open: m,
339
+ onOpenChange: f,
337
340
  disabled: b,
338
341
  closable: L,
339
342
  onClose: Y,
340
343
  placement: "bottom-start",
341
344
  allowedPlacements: ["bottom-start", "top-start"],
342
- listClassName: p(cl, ye),
345
+ listClassName: p(fl, Ae),
343
346
  className: "w-full",
344
- renderOverlay: ze,
347
+ renderOverlay: Ve,
345
348
  children: /* @__PURE__ */ l(
346
349
  se,
347
350
  {
348
- id: c,
351
+ id: d,
349
352
  size: q,
350
353
  disabled: b,
351
354
  invalid: R,
352
- value: Ee,
355
+ value: je,
353
356
  placeholder: I ? void 0 : he,
354
357
  readOnly: !0,
355
358
  iconBefore: n ? void 0 : a?.icon,
356
359
  iconAfter: /* @__PURE__ */ l(
357
- qe,
360
+ He,
358
361
  {
359
362
  size: oe ? ce.SM : ce.MD,
360
- stroke: nl,
363
+ stroke: il,
361
364
  "aria-hidden": "true",
362
365
  className: p(
363
- sl,
364
- f && "rotate-180"
366
+ dl,
367
+ m && "rotate-180"
365
368
  )
366
369
  }
367
370
  ),
368
371
  role: "combobox",
369
372
  "aria-haspopup": "listbox",
370
- "aria-expanded": f,
373
+ "aria-expanded": m,
371
374
  "aria-controls": re,
372
375
  "aria-autocomplete": "none",
373
- "aria-label": je,
376
+ "aria-label": ze,
374
377
  "aria-describedby": [pe, ie, ae].filter(Boolean).join(" ") || void 0,
375
378
  "aria-invalid": v || R ? !0 : void 0,
376
379
  containerClassName: "w-full",
@@ -380,25 +383,25 @@ const Vl = ({
380
383
  "!h-auto flex-wrap py-2",
381
384
  oe ? "min-h-[24px]" : "min-h-[40px]"
382
385
  ],
383
- we
386
+ Te
384
387
  ),
385
388
  className: p(
386
389
  "cursor-pointer",
387
390
  I && "w-0 min-w-0 flex-none p-0"
388
391
  ),
389
- onKeyDown: Ke,
392
+ onKeyDown: Ue,
390
393
  children: I
391
394
  }
392
395
  )
393
396
  }
394
397
  ),
395
- /* @__PURE__ */ l(Ye, { id: ie, text: v }),
396
- !v && /* @__PURE__ */ l(Pe, { id: ae, text: Q })
398
+ /* @__PURE__ */ l(el, { id: ie, text: v }),
399
+ !v && /* @__PURE__ */ l(ll, { id: ae, text: Q })
397
400
  ] })
398
401
  ]
399
402
  }
400
403
  );
401
404
  };
402
405
  export {
403
- Vl as Select
406
+ Gl as Select
404
407
  };
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.16.0-dev.67",
3
- "generatedAt": "2026-11-02T20:30:14.289Z",
2
+ "version": "0.16.0-dev.69",
3
+ "generatedAt": "2026-11-03T14:32:39.360Z",
4
4
  "kit": {
5
5
  "name": "@epam/ai-dial-ui-kit",
6
6
  "description": "A modern UI kit for building AI DIAL interfaces with React",
@@ -640,7 +640,7 @@
640
640
  "name": "Breadcrumbs",
641
641
  "category": "Components_2_0",
642
642
  "generation": "2.0",
643
- "description": "A navigation trail: where the user is, and every level they can step back to.\naliases: Breadcrumb|NavigationPath|BreadcrumbTrail\nDesign system 2.0\n\nThe last item is the current page — drawn semibold and primary, and never a\ncontrol, since a link to the page you are already on does nothing. Every\nearlier item with an `href` or an `onClick` is a link; one with neither is\ndrawn as plain text, which is how a read-only location path is built.\n\nThe trail never wraps. Segments truncate instead, each revealing its full\nlabel in a tooltip only once it is actually clipped, and a trail longer than\n`maxVisibleItems` collapses its middle behind an ellipsis menu — the root and\nthe current page, the two segments that carry the most meaning, always stay\non screen.\n\na11y: an `<ol>` inside a named `<nav>`, with `aria-current=\"page\"` on the last\nsegment. Separators are decorative and hidden from assistive tech, so the\ntrail is announced as a list of links rather than a string of chevrons.\n\nThe trail is drawn at `dial-small-text` by default; `size` switches it to\n`dial-h2-text` for a trail that doubles as the page heading, where the\ntoken's own semibold weight applies to every segment.\n\nLabels are the caller's to translate; the two accessible names default to\nEnglish and take an override.",
643
+ "description": "A navigation trail: where the user is, and every level they can step back to.\naliases: Breadcrumb|NavigationPath|BreadcrumbTrail\nDesign system 2.0\n\nThe last item is the current page — drawn semibold and primary, and never a\ncontrol, since a link to the page you are already on does nothing. Every\nearlier item with an `href` or an `onClick` is a link; one with neither is\ndrawn as plain text, which is how a read-only location path is built.\n\nThe trail never wraps. Segments truncate instead, each revealing its full\nlabel in a tooltip only once it is actually clipped, and a trail longer than\n`maxVisibleItems` collapses its middle behind an ellipsis menu — the root and\nthe current page, the two segments that carry the most meaning, always stay\non screen.\n\na11y: an `<ol>` inside a named `<nav>`, with `aria-current=\"page\"` on the last\nsegment. Separators are decorative and hidden from assistive tech, so the\ntrail is announced as a list of links rather than a string of chevrons.\n\nThe trail is drawn at `dial-small-text` by default; `size` switches it to\n`dial-tiny-text` for a dense header — a trail that never clips, so a focus\nring stays whole, and caps no segment, so its current page takes the free\nwidth — or to `dial-h2-text` for a trail that doubles as the page heading,\nwhere the token's own semibold weight applies to every segment.\n\nLabels are the caller's to translate; the two accessible names default to\nEnglish and take an override.",
644
644
  "props": [
645
645
  {
646
646
  "name": "items",
@@ -660,7 +660,7 @@
660
660
  "type": "BreadcrumbsSize",
661
661
  "required": false,
662
662
  "defaultValue": "BreadcrumbsSize.Small",
663
- "description": "The trail's type scale: `dial-small-text` or `dial-h2-text`"
663
+ "description": "The trail's type scale: `dial-small-text`, `dial-tiny-text` or `dial-h2-text`"
664
664
  },
665
665
  {
666
666
  "name": "separator",
@@ -1383,6 +1383,18 @@
1383
1383
  "required": false,
1384
1384
  "description": "Icon to display when there are no options."
1385
1385
  },
1386
+ {
1387
+ "name": "filteredEmptyStateTitle",
1388
+ "type": "string",
1389
+ "required": false,
1390
+ "description": "Title when the search leaves no options, as \"No [entities] found\". Falls back to `emptyStateTitle`; the message is announced."
1391
+ },
1392
+ {
1393
+ "name": "filteredEmptyStateDescription",
1394
+ "type": "string",
1395
+ "required": false,
1396
+ "description": "Description when the search leaves no options, as \"Try a different search term\". Falls back to `emptyStateDescription`."
1397
+ },
1386
1398
  {
1387
1399
  "name": "disabled",
1388
1400
  "type": "boolean",
@@ -5774,7 +5786,7 @@
5774
5786
  "name": "NoDataContent",
5775
5787
  "category": "Components_2_0",
5776
5788
  "generation": "2.0",
5777
- "description": "Message shown in place of a list, table or grid that has nothing to show.\naliases: EmptyState|NoResults|ZeroState\nDesign system 2.0\n\nFills its container and centres an illustration, a headline, an optional\nsecondary line and an optional action. The icon is decorative, so it is\nhidden from assistive tech and the text carries the message on its own.",
5789
+ "description": "Message shown in place of a list, table or grid that has nothing to show.\naliases: EmptyState|NoResults|ZeroState\nDesign system 2.0\n\nFills its container and centres an illustration, a headline, an optional\nsecondary line and an optional action. The icon is decorative, so it is\nhidden from assistive tech and the text carries the message on its own.\n\nCopy follows the Patterns 2.0 empty-state behaviour:\n- default: \"No [entities] yet\" / \"[Entities] will appear here once [condition].\"\n- Shared with me: \"No [entities] yet\" / \"[Entities] other people share with you will show up here.\"\n- after a search or filter: \"No [entities] found\" / \"Try a different search\n term or check your filters.\" — drop the part the list does not have — with `live`.\n\nLeave `icon` unset in a list, so every empty list shows the same card.",
5778
5790
  "props": [
5779
5791
  {
5780
5792
  "name": "title",
@@ -6197,7 +6209,7 @@
6197
6209
  "name": "Grid",
6198
6210
  "category": "Components_2_0",
6199
6211
  "generation": "2.0",
6200
- "description": "A data grid built on ag-Grid, wired to the 2.0 tokens and controls.\naliases: DataTable|TableGrid|DataGrid\nDesign system 2.0\n\nComes preconfigured with case-insensitive sorting, floating column filters,\ncolumns sized to the available width, a row context menu, truncation\ntooltips, and an empty state.\n\nThe selection column renders the 2.0 `Checkbox` and `Radio` instead of\nag-Grid's own inputs, so selection looks and behaves like every other control\nin the kit and the select-all reaches the `mixed` state when the selection is\npartial. The column stays faded out until the row is hovered, something is\nselected, or the keyboard reaches it.\n\nSelection works controlled or uncontrolled: pass `selectedRowIds` to own it,\nor read `onSelectionChange` and let the grid keep its own. A `sort` declared\non a column is honoured — 1.0 stripped it on startup.",
6212
+ "description": "A data grid built on ag-Grid, wired to the 2.0 tokens and controls.\naliases: DataTable|TableGrid|DataGrid\nDesign system 2.0\n\nComes preconfigured with case-insensitive sorting, floating column filters,\ncolumns sized to the available width, a row context menu, truncation\ntooltips, and an empty state.\n\nThe empty state follows the Patterns 2.0 empty-state behaviour and has two\nforms. A grid with no rows says \"No [entities] yet\" and can offer an action;\na grid whose column filters leave nothing says \"No [entities] found\" and is\nannounced, since the user has just changed a filter. A host that filters\n`rowData` itself passes the \"found\" copy as `emptyStateTitle` and sets\n`emptyStateLive`.\n\nThe selection column renders the 2.0 `Checkbox` and `Radio` instead of\nag-Grid's own inputs, so selection looks and behaves like every other control\nin the kit and the select-all reaches the `mixed` state when the selection is\npartial. The column stays faded out until the row is hovered, something is\nselected, or the keyboard reaches it.\n\nSelection works controlled or uncontrolled: pass `selectedRowIds` to own it,\nor read `onSelectionChange` and let the grid keep its own. A `sort` declared\non a column is honoured — 1.0 stripped it on startup.",
6201
6213
  "props": [
6202
6214
  {
6203
6215
  "name": "columnDefs",
@@ -6291,21 +6303,48 @@
6291
6303
  "name": "emptyStateIcon",
6292
6304
  "type": "ReactNode",
6293
6305
  "required": false,
6294
- "description": "Illustration of the empty state."
6306
+ "description": "Illustration of both empty states. Defaults to the shared placeholder-list card."
6295
6307
  },
6296
6308
  {
6297
6309
  "name": "emptyStateTitle",
6298
6310
  "type": "string",
6299
6311
  "required": false,
6300
- "defaultValue": "'No results found'",
6301
- "description": "Headline of the empty state."
6312
+ "defaultValue": "'No items yet'",
6313
+ "description": "Headline when there are no rows."
6302
6314
  },
6303
6315
  {
6304
6316
  "name": "emptyStateDescription",
6305
6317
  "type": "string",
6306
6318
  "required": false,
6307
- "defaultValue": "\"Sorry, we couldn't find any results for your search.\"",
6308
- "description": "Secondary line of the empty state."
6319
+ "defaultValue": "'Items will appear here once they are added.'",
6320
+ "description": "Secondary line when there are no rows."
6321
+ },
6322
+ {
6323
+ "name": "emptyStateAction",
6324
+ "type": "ReactNode",
6325
+ "required": false,
6326
+ "description": "Way forward when there are no rows."
6327
+ },
6328
+ {
6329
+ "name": "emptyStateLive",
6330
+ "type": "boolean",
6331
+ "required": false,
6332
+ "defaultValue": "false",
6333
+ "description": "Announce the no-rows message; for a host that filters `rowData` itself."
6334
+ },
6335
+ {
6336
+ "name": "filteredEmptyStateTitle",
6337
+ "type": "string",
6338
+ "required": false,
6339
+ "defaultValue": "'No items found'",
6340
+ "description": "Headline when the column filters leave no rows."
6341
+ },
6342
+ {
6343
+ "name": "filteredEmptyStateDescription",
6344
+ "type": "string",
6345
+ "required": false,
6346
+ "defaultValue": "'Try a different search term or check your filters.'",
6347
+ "description": "Secondary line when the column filters leave no rows."
6309
6348
  },
6310
6349
  {
6311
6350
  "name": "loading",
@@ -6370,7 +6409,7 @@
6370
6409
  }
6371
6410
  ],
6372
6411
  "examples": [
6373
- "interface Product { id: string; name: string; price: number }\n\nconst columns: ColDef<Product>[] = [\n { field: 'name', headerName: 'Product', flex: 1 },\n { field: 'price', headerName: 'Price', width: 120 },\n];\n\n<Grid<Product> columnDefs={columns} rowData={products} />\n\n// With selection and a context menu\n<Grid<Product>\n columnDefs={columns}\n rowData={products}\n selectionMode={GridSelectionMode.MULTIPLE}\n selectedRowIds={selectedIds}\n onSelectionChange={(ids) => setSelectedIds(ids)}\n selectRowLabel={(row) => `Select ${row.name}`}\n getContextMenuItems={(row) => [{ key: 'edit', label: 'Edit' }]}\n/>\n\n// Dark native controls, including the date-filter calendar\n<Grid<Product> columnDefs={columns} rowData={products} colorScheme={GridColorScheme.Dark} />"
6412
+ "interface Product { id: string; name: string; price: number }\n\nconst columns: ColDef<Product>[] = [\n { field: 'name', headerName: 'Product', flex: 1 },\n { field: 'price', headerName: 'Price', width: 120 },\n];\n\n<Grid<Product> columnDefs={columns} rowData={products} />\n\n// With selection and a context menu\n<Grid<Product>\n columnDefs={columns}\n rowData={products}\n selectionMode={GridSelectionMode.MULTIPLE}\n selectedRowIds={selectedIds}\n onSelectionChange={(ids) => setSelectedIds(ids)}\n selectRowLabel={(row) => `Select ${row.name}`}\n getContextMenuItems={(row) => [{ key: 'edit', label: 'Edit' }]}\n/>\n\n// An empty grid with a way forward\n<Grid<Product>\n columnDefs={columns}\n rowData={[]}\n emptyStateTitle=\"No products yet\"\n emptyStateDescription=\"Products will appear here once you add one.\"\n emptyStateAction={<OutlinedButton label=\"Add product\" onClick={addProduct} />}\n filteredEmptyStateTitle=\"No products found\"\n/>\n\n// Dark native controls, including the date-filter calendar\n<Grid<Product> columnDefs={columns} rowData={products} colorScheme={GridColorScheme.Dark} />"
6374
6413
  ],
6375
6414
  "sourceFile": "components/New/Grid/Grid.tsx"
6376
6415
  },
@@ -9062,6 +9101,11 @@
9062
9101
  "value": "'small'",
9063
9102
  "comment": "14px `dial-small-text`, with a `dial-small-semi-text` current page."
9064
9103
  },
9104
+ {
9105
+ "name": "Tiny",
9106
+ "value": "'tiny'",
9107
+ "comment": "12px `dial-tiny-text`, with a `dial-tiny-semi-text` current page: a 16px\ntrail for a dense header. It never clips, so a focus ring stays whole, and\nnothing is capped: the middle truncates first, the current page last."
9108
+ },
9065
9109
  {
9066
9110
  "name": "Heading",
9067
9111
  "value": "'heading'",
@@ -9968,7 +10012,7 @@
9968
10012
  {
9969
10013
  "name": "DIAL_KIT_ICON_STROKE",
9970
10014
  "sourceFile": "components/New/constants/icon.ts",
9971
- "description": "Icon stroke (1.5px) from the 2.0 stroke scale. Tabler renders every outline\nicon at `stroke={2}` unless told otherwise, so the token has to be passed\nexplicitly — a 2.0 component that omits it draws a heavier icon than the\ndesign system asks for.\n\nIt is a number rather than a Tailwind utility because an icon's weight is an\nSVG `stroke-width` attribute on the glyph, not a border on its box. The\nborder half of the same scale stays on plain Tailwind widths — `border`,\n`border-2`, `border-4`, and `border-[0.5px]` for a table divider.\n\nExported publicly so icons a consumer passes into a 2.0 component — a button\nicon, a menu item, a segmented-control segment — can match the ones the\ncomponents draw themselves.\n\nTwo deliberate departures inside the library: the empty-state illustrations\n(`NoDataContent`, the grid's no-rows overlay) use a much lighter stroke,\nsince a 1.5px line reads as a drawing at 16px and as a fence at 100px; and\nthe checkbox glyph uses a heavier one, because it is a control mark sized to\na 14px box rather than an icon from the set.",
10015
+ "description": "Icon stroke (1.5px) from the 2.0 stroke scale. Tabler renders every outline\nicon at `stroke={2}` unless told otherwise, so the token has to be passed\nexplicitly — a 2.0 component that omits it draws a heavier icon than the\ndesign system asks for.\n\nIt is a number rather than a Tailwind utility because an icon's weight is an\nSVG `stroke-width` attribute on the glyph, not a border on its box. The\nborder half of the same scale stays on plain Tailwind widths — `border`,\n`border-2`, `border-4`, and `border-[0.5px]` for a table divider.\n\nExported publicly so icons a consumer passes into a 2.0 component — a button\nicon, a menu item, a segmented-control segment — can match the ones the\ncomponents draw themselves.\n\nTwo deliberate departures inside the library: an icon passed as an\nempty-state illustration (`NoDataContent`'s `icon`) uses a much lighter stroke,\nsince a 1.5px line reads as a drawing at 16px and as a fence at 100px; and\nthe checkbox glyph uses a heavier one, because it is a control mark sized to\na 14px box rather than an icon from the set.",
9972
10016
  "signature": "DIAL_KIT_ICON_STROKE = 1.5"
9973
10017
  },
9974
10018
  {