@epam/ai-dial-skills 1.1.0-dev.432

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.
@@ -0,0 +1,5 @@
1
+ import { FC } from 'react';
2
+ import { FavoriteSkillsPanelProps } from '../../models/favorite-skills-panel-props';
3
+ /** Second-level "My Collection" panel: the user's favorite skills, or an empty-state hint, plus a "Browse" action. */
4
+ export declare const FavoriteSkillsPanel: FC<FavoriteSkillsPanelProps>;
5
+ //# sourceMappingURL=FavoriteSkillsPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FavoriteSkillsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/FavoriteSkillsPanel/FavoriteSkillsPanel.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAKL,KAAK,EAAE,EAER,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAqCzF,sHAAsH;AACtH,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,wBAAwB,CA4Q5D,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { FC } from 'react';
2
+ import { SkillCatalogModalProps } from '../../models/skill-catalog-modal-props';
3
+ /** "Use skill" browse-modal shell: a large popup hosting host-rendered picker content, mounted only while open. */
4
+ export declare const SkillCatalogModal: FC<SkillCatalogModalProps>;
5
+ //# sourceMappingURL=SkillCatalogModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillCatalogModal.d.ts","sourceRoot":"","sources":["../../../src/components/SkillCatalogModal/SkillCatalogModal.tsx"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAErF,mHAAmH;AACnH,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CAoBxD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { FC } from 'react';
2
+ import { SkillDetailsSidePanelProps } from '../../models/skill-details-side-panel-props';
3
+ /**
4
+ * Right-anchored side panel showing one skill's details, composed from
5
+ * `@epam/ai-dial-catalog`'s `DetailsPanel` — the skills-scoped composition
6
+ * point for hosts that surface skill details outside the Catalog page,
7
+ * without its page chrome.
8
+ */
9
+ export declare const SkillDetailsSidePanel: FC<SkillDetailsSidePanelProps>;
10
+ //# sourceMappingURL=SkillDetailsSidePanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillDetailsSidePanel.d.ts","sourceRoot":"","sources":["../../../src/components/SkillDetailsSidePanel/SkillDetailsSidePanel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AAE9F;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,0BAA0B,CAEjC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { UseSkillSelectorOverlayOptions, UseSkillSelectorOverlayResult } from '../../models/skill-selector-overlay';
2
+ /**
3
+ * Owns the Skills Add-menu flow: the favorites overlay with lazily resolved
4
+ * row descriptions, the "Use skill" browse modal's open state, the skill
5
+ * details side panel's open state, and the single selected skill shown as an
6
+ * input chip. The host injects the listing data, favorites state, the
7
+ * description fetch, labels, and the modal/panel components.
8
+ */
9
+ export declare const useSkillSelectorOverlay: ({ isEnabled, skills, sharedWithMe, publicSkills, favoriteIds, onToggleFavorite, fetchSkillDescription, labels, renderCatalogContent, detailsPanelComponent: DetailsPanelComponent, }: UseSkillSelectorOverlayOptions) => UseSkillSelectorOverlayResult;
10
+ //# sourceMappingURL=useSkillSelectorOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSkillSelectorOverlay.d.ts","sourceRoot":"","sources":["../../../src/hooks/useSkillSelectorOverlay/useSkillSelectorOverlay.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EACV,8BAA8B,EAC9B,6BAA6B,EAC9B,MAAM,qCAAqC,CAAC;AAE7C;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,GAAI,sLAWrC,8BAA8B,KAAG,6BAyNnC,CAAC"}
package/index.css ADDED
@@ -0,0 +1,2 @@
1
+ ._row_1ovug_1:hover,._row_1ovug_1:focus-visible{background:var(--fs-row-hover-bg,var(--bg-layer-sunken,#eef1f7))}._header_1ovug_5{color:var(--fs-header-text,var(--text-tertiary,#848e9c))}._emptyHint_1ovug_9{color:var(--fs-empty-hint-text,var(--text-icon-tertiary,#848e9c))}._star_1ovug_13{color:var(--fs-star-color,var(--text-warning-icon,#eec840))}._footer_1ovug_17{border-top-color:var(--fs-footer-border,var(--stroke-tertiary,#e0e6f0))}._rowEnter_1ovug_25{animation:.2s ease-out _rowFadeIn_1ovug_1}._rowLeaving_1ovug_29{pointer-events:none;animation:.18s ease-out forwards _rowFadeOut_1ovug_1}@keyframes _rowFadeIn_1ovug_1{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes _rowFadeOut_1ovug_1{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.96)}}._listContent_1ovug_57{transition:max-height .2s}@media (prefers-reduced-motion:reduce){._rowEnter_1ovug_25,._rowLeaving_1ovug_29{animation:none}._listContent_1ovug_57{transition:none}}
2
+ /*$vite$:1*/
package/index.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ export { FavoriteSkillsPanel } from './components/FavoriteSkillsPanel/FavoriteSkillsPanel';
2
+ export { SkillCatalogModal } from './components/SkillCatalogModal/SkillCatalogModal';
3
+ export { SkillDetailsSidePanel } from './components/SkillDetailsSidePanel/SkillDetailsSidePanel';
4
+ export { useSkillSelectorOverlay } from './hooks/useSkillSelectorOverlay/useSkillSelectorOverlay';
5
+ export { buildFavoriteSkillItem } from './models/favorite-skill-item';
6
+ export type { FavoriteSkillItem, SkillListingEntry, } from './models/favorite-skill-item';
7
+ export type { FavoriteSkillsPanelColors, FavoriteSkillsPanelLabels, FavoriteSkillsPanelProps, } from './models/favorite-skills-panel-props';
8
+ export type { SkillCatalogModalProps } from './models/skill-catalog-modal-props';
9
+ export type { SkillDetailsSidePanelProps } from './models/skill-details-side-panel-props';
10
+ export type { SkillDetailsPanelComponentProps, SkillSelectorOverlayLabels, UseSkillSelectorOverlayOptions, UseSkillSelectorOverlayResult, } from './models/skill-selector-overlay';
11
+ //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sDAAsD,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0DAA0D,CAAC;AACjG,OAAO,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AAClG,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,YAAY,EACV,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACjF,YAAY,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AAC1F,YAAY,EACV,+BAA+B,EAC/B,0BAA0B,EAC1B,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC"}
package/index.js ADDED
@@ -0,0 +1,280 @@
1
+ import { DeploymentIcon as e, buildCssVars as t, mergeClasses as n } from "@epam/ai-dial-chat-shared";
2
+ import { BASE_ICON_SIZE as r, Button as i, ButtonAppearance as a, ButtonVariant as o, DIAL_ICON_SIZE as s, DIAL_KIT_ICON_STROKE as c, GhostButton as l, InteractiveTooltip as u, Popup as d, PopupSize as f, Spinner as p, ToggleIconButton as m } from "@epam/ai-dial-ui-kit";
3
+ import { IconBlocks as h, IconEye as g, IconStarFilled as _ } from "@tabler/icons-react";
4
+ import { Suspense as v, useCallback as y, useEffect as b, useLayoutEffect as x, useMemo as S, useRef as C, useState as w } from "react";
5
+ import { jsx as T, jsxs as E } from "react/jsx-runtime";
6
+ import { DetailsPanel as D } from "@epam/ai-dial-catalog";
7
+ var O = {
8
+ row: "_row_1ovug_1",
9
+ header: "_header_1ovug_5",
10
+ emptyHint: "_emptyHint_1ovug_9",
11
+ star: "_star_1ovug_13",
12
+ footer: "_footer_1ovug_17",
13
+ rowEnter: "_rowEnter_1ovug_25",
14
+ rowFadeIn: "_rowFadeIn_1ovug_1",
15
+ rowLeaving: "_rowLeaving_1ovug_29",
16
+ rowFadeOut: "_rowFadeOut_1ovug_1",
17
+ listContent: "_listContent_1ovug_57"
18
+ }, k = "px-3 pb-0.5 pt-2", A = 180, j = 288, M = 300, N = ({ onOpen: e }) => {
19
+ let t = C(e);
20
+ return t.current = e, b(() => {
21
+ t.current();
22
+ }, []), null;
23
+ }, P = ({ favorites: r, onSelect: d, onToggleFavorite: f, onBrowse: h, onViewDetails: v, onItemTooltipOpen: y, labels: S = {}, colors: D, nameClassName: P = "dial-small-text", headerClassName: F = "dial-tiny-lead-semi-text", emptyHintClassName: I = "dial-small-text" }) => {
24
+ let { myCollectionLabel: L = "My Collection", emptyHintLabel: R = "Star a skill to pin it here", browseLabel: z = "Browse", removeFromFavoritesLabel: B = "Remove from favorites", viewDetailsLabel: V = "View details" } = S, H = t({
25
+ "--fs-row-hover-bg": D?.rowHoverBackground,
26
+ "--fs-header-text": D?.headerText,
27
+ "--fs-empty-hint-text": D?.emptyHintText,
28
+ "--fs-star-color": D?.starColor,
29
+ "--fs-footer-border": D?.footerBorder
30
+ }), [U, W] = w(/* @__PURE__ */ new Set()), G = C(/* @__PURE__ */ new Map()), [K, q] = w(null), J = C(void 0), Y = () => {
31
+ clearTimeout(J.current), J.current = void 0;
32
+ }, X = (e) => {
33
+ Y(), q(e);
34
+ }, Z = () => {
35
+ Y(), J.current = setTimeout(() => {
36
+ q(null), J.current = void 0;
37
+ }, M);
38
+ };
39
+ b(() => {
40
+ let e = G.current;
41
+ return () => {
42
+ e.forEach((e) => clearTimeout(e)), e.clear(), clearTimeout(J.current);
43
+ };
44
+ }, []);
45
+ let Q = C(null), [$, ee] = w();
46
+ x(() => {
47
+ Q.current && ee(Math.min(Q.current.scrollHeight, j));
48
+ }, [r]);
49
+ let te = (e, t) => {
50
+ e.target === e.currentTarget && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), d(t));
51
+ }, ne = (e) => {
52
+ W((t) => new Set(t).add(e));
53
+ let t = setTimeout(() => {
54
+ f(e), W((t) => {
55
+ let n = new Set(t);
56
+ return n.delete(e), n;
57
+ }), G.current.delete(e);
58
+ }, A);
59
+ G.current.set(e, t);
60
+ };
61
+ return /* @__PURE__ */ E("div", {
62
+ className: "flex min-w-[240px] flex-col",
63
+ style: H,
64
+ children: [
65
+ /* @__PURE__ */ T("p", {
66
+ className: n(F, k, O.header),
67
+ children: L
68
+ }),
69
+ /* @__PURE__ */ T("div", {
70
+ className: n("max-h-72 min-h-0 flex-1 overflow-y-auto", O.listContent),
71
+ style: { maxHeight: $ },
72
+ children: /* @__PURE__ */ T("div", {
73
+ ref: Q,
74
+ children: r.length > 0 ? /* @__PURE__ */ T("ul", {
75
+ className: "flex flex-col gap-1 px-1 pb-1",
76
+ children: r.map((t) => {
77
+ let r = /* @__PURE__ */ E("div", {
78
+ role: "button",
79
+ tabIndex: 0,
80
+ className: n("flex cursor-pointer items-center gap-2 rounded-lg border border-transparent px-2 py-1.5 transition-colors", O.row),
81
+ onClick: () => d(t),
82
+ onKeyDown: (e) => te(e, t),
83
+ onMouseEnter: () => X(t.id),
84
+ onMouseLeave: Z,
85
+ onFocus: () => X(t.id),
86
+ onBlur: Z,
87
+ children: [
88
+ /* @__PURE__ */ T(e, {
89
+ size: s.MD,
90
+ initialsName: t.name
91
+ }),
92
+ /* @__PURE__ */ T("span", {
93
+ className: n(P, "min-w-0 flex-1 truncate text-start"),
94
+ children: t.name
95
+ }),
96
+ /* @__PURE__ */ T(m, {
97
+ icon: /* @__PURE__ */ T(_, {
98
+ size: s.SM,
99
+ className: O.star,
100
+ "aria-hidden": !0
101
+ }),
102
+ "aria-label": B,
103
+ isSelected: !0,
104
+ onClick: (e) => {
105
+ e.stopPropagation(), ne(t.id);
106
+ }
107
+ })
108
+ ]
109
+ }), l = t.description != null && t.description !== "";
110
+ return /* @__PURE__ */ T("li", {
111
+ className: U.has(t.id) ? O.rowLeaving : O.rowEnter,
112
+ children: /* @__PURE__ */ T(u, {
113
+ asChild: !0,
114
+ open: K === t.id,
115
+ contentClassName: "max-w-[550px]",
116
+ content: /* @__PURE__ */ E("div", {
117
+ className: "flex flex-col gap-3",
118
+ onMouseEnter: Y,
119
+ onMouseLeave: Z,
120
+ onFocus: Y,
121
+ onBlur: Z,
122
+ children: [
123
+ /* @__PURE__ */ T(N, { onOpen: () => y?.(t.id) }),
124
+ t.isDescriptionLoading && /* @__PURE__ */ T(p, { size: s.SM }),
125
+ !t.isDescriptionLoading && l && /* @__PURE__ */ T("p", {
126
+ className: "text-start",
127
+ children: t.description
128
+ }),
129
+ /* @__PURE__ */ T(i, {
130
+ variant: o.Primary,
131
+ appearance: a.Link,
132
+ label: V,
133
+ iconBefore: /* @__PURE__ */ T(g, {
134
+ size: s.SM,
135
+ stroke: c,
136
+ "aria-hidden": !0
137
+ }),
138
+ onClick: () => v(t)
139
+ })
140
+ ]
141
+ }),
142
+ children: r
143
+ })
144
+ }, t.id);
145
+ })
146
+ }) : /* @__PURE__ */ T("p", {
147
+ className: n(I, "px-4 py-4 text-start", O.emptyHint),
148
+ children: R
149
+ })
150
+ })
151
+ }),
152
+ /* @__PURE__ */ T("div", {
153
+ className: n("border-t px-2 py-3", O.footer),
154
+ children: /* @__PURE__ */ T(l, {
155
+ label: z,
156
+ className: "w-full justify-center",
157
+ onClick: h
158
+ })
159
+ })
160
+ ]
161
+ });
162
+ }, F = ({ isOpen: e, onClose: t, onSelect: n, title: r, renderContent: i }) => /* @__PURE__ */ T(d, {
163
+ open: e,
164
+ header: r,
165
+ size: f.Lg,
166
+ className: "h-[min(90vh,860px)] !max-w-[min(95vw,1200px)] overflow-hidden",
167
+ onClose: t,
168
+ children: /* @__PURE__ */ T("div", {
169
+ className: "h-[min(80vh,840px)] overflow-auto",
170
+ children: /* @__PURE__ */ T(v, {
171
+ fallback: null,
172
+ children: e && i(n, t)
173
+ })
174
+ })
175
+ }), I = (e) => /* @__PURE__ */ T(D, { ...e }), L = (e, t, n) => ({
176
+ id: e.url,
177
+ name: e.name,
178
+ description: t.get(e.url) ?? void 0,
179
+ isDescriptionLoading: n.has(e.url)
180
+ }), R = ({ isEnabled: t, skills: n, sharedWithMe: i, publicSkills: a, favoriteIds: o, onToggleFavorite: l, fetchSkillDescription: u, labels: d, renderCatalogContent: f, detailsPanelComponent: p }) => {
181
+ let { addMenuLabel: m = "Skills", backLabel: g = "Back", catalogModalTitleLabel: _ = "Use skill", panelLabels: b } = d ?? {}, [x, E] = w(!1), [D, O] = w(null), [k, A] = w(null), [j, M] = w(/* @__PURE__ */ new Map()), [N, I] = w(/* @__PURE__ */ new Set()), R = C(/* @__PURE__ */ new Set()), z = S(() => [
182
+ ...n,
183
+ ...i ?? [],
184
+ ...a ?? []
185
+ ], [
186
+ n,
187
+ i,
188
+ a
189
+ ]), B = S(() => z.filter((e) => o.has(e.url)).map((e) => L(e, j, N)), [
190
+ z,
191
+ o,
192
+ j,
193
+ N
194
+ ]), V = S(() => z.find((e) => e.url === k) ?? null, [z, k]), H = y((e) => {
195
+ A(e);
196
+ }, []), U = y(() => {
197
+ A(null);
198
+ }, []), W = S(() => V == null ? [] : [{
199
+ id: V.url,
200
+ label: V.name,
201
+ icon: /* @__PURE__ */ T(e, {
202
+ size: s.SM,
203
+ initialsName: V.name
204
+ }),
205
+ onRemove: U
206
+ }], [V, U]), G = y((e) => {
207
+ j.has(e) || R.current.has(e) || (R.current.add(e), I((t) => new Set(t).add(e)), u(e).then((t) => {
208
+ R.current.delete(e), I((t) => {
209
+ let n = new Set(t);
210
+ return n.delete(e), n;
211
+ }), M((n) => new Map(n).set(e, t));
212
+ }));
213
+ }, [j, u]), K = y((e) => /* @__PURE__ */ T(P, {
214
+ favorites: B,
215
+ onSelect: (t) => {
216
+ H(t.id), e();
217
+ },
218
+ onToggleFavorite: l,
219
+ onBrowse: () => {
220
+ e(), E(!0);
221
+ },
222
+ onViewDetails: (t) => {
223
+ e(), O(t.id);
224
+ },
225
+ onItemTooltipOpen: G,
226
+ labels: b
227
+ }), [
228
+ B,
229
+ H,
230
+ l,
231
+ G,
232
+ b
233
+ ]), q = S(() => ({
234
+ key: "skills",
235
+ title: m,
236
+ icon: /* @__PURE__ */ T(h, {
237
+ size: r,
238
+ "aria-hidden": !0,
239
+ stroke: c
240
+ }),
241
+ renderOverlay: K,
242
+ backLabel: g
243
+ }), [
244
+ m,
245
+ g,
246
+ K
247
+ ]);
248
+ return t ? {
249
+ skillMenuOverlay: q,
250
+ skillCatalogModal: /* @__PURE__ */ T(F, {
251
+ isOpen: x,
252
+ onClose: () => E(!1),
253
+ onSelect: (e) => {
254
+ H(e), E(!1);
255
+ },
256
+ title: _,
257
+ renderContent: f
258
+ }),
259
+ skillDetailsPanel: /* @__PURE__ */ T(v, {
260
+ fallback: null,
261
+ children: /* @__PURE__ */ T(p, {
262
+ skillId: D,
263
+ onClose: () => O(null),
264
+ onUseInChat: (e) => {
265
+ H(e), O(null);
266
+ }
267
+ })
268
+ }),
269
+ selectedSkillChips: W,
270
+ selectSkill: H
271
+ } : {
272
+ skillMenuOverlay: void 0,
273
+ skillCatalogModal: null,
274
+ skillDetailsPanel: null,
275
+ selectedSkillChips: [],
276
+ selectSkill: () => void 0
277
+ };
278
+ };
279
+ //#endregion
280
+ export { P as FavoriteSkillsPanel, F as SkillCatalogModal, I as SkillDetailsSidePanel, L as buildFavoriteSkillItem, R as useSkillSelectorOverlay };
@@ -0,0 +1,35 @@
1
+ /** A single favorited skill as shown in {@link FavoriteSkillsPanelProps}. */
2
+ export interface FavoriteSkillItem {
3
+ /**
4
+ * Stable identifier for the skill: the `skills/{bucket}/{path}` resource
5
+ * URL, identical to the skill's `CatalogItem` id.
6
+ */
7
+ id: string;
8
+ /** Display name. */
9
+ name: string;
10
+ /** Short description shown in a tooltip on hover. Omitted when empty. */
11
+ description?: string;
12
+ /**
13
+ * Whether the description is still being resolved by the host. While
14
+ * `true` the tooltip shows a spinner in the description's place.
15
+ */
16
+ isDescriptionLoading?: boolean;
17
+ }
18
+ /**
19
+ * The listing-entry fields needed to build a favorite row — satisfied by the
20
+ * host's skill listing DTO or any `{ url, name }` object.
21
+ */
22
+ export interface SkillListingEntry {
23
+ /** Stable identifier for the skill: the `skills/{bucket}/{path}` resource URL. */
24
+ url: string;
25
+ /** Display name. */
26
+ name: string;
27
+ }
28
+ /**
29
+ * Builds a {@link FavoriteSkillItem} from a listing entry and the host's
30
+ * resolved description cache. A cached `null` (no description or a failed
31
+ * fetch) and a not-yet-fetched id both yield no description paragraph; ids
32
+ * in `pendingIds` are marked as loading so the row's tooltip shows a spinner.
33
+ */
34
+ export declare const buildFavoriteSkillItem: (skill: SkillListingEntry, descriptions: ReadonlyMap<string, string | null>, pendingIds: ReadonlySet<string>) => FavoriteSkillItem;
35
+ //# sourceMappingURL=favorite-skill-item.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"favorite-skill-item.d.ts","sourceRoot":"","sources":["../../src/models/favorite-skill-item.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GACjC,OAAO,iBAAiB,EACxB,cAAc,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAChD,YAAY,WAAW,CAAC,MAAM,CAAC,KAC9B,iBAKD,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { FavoriteSkillItem } from './favorite-skill-item';
2
+ /** Localizable string labels for {@link FavoriteSkillsPanelProps}'s component. */
3
+ export interface FavoriteSkillsPanelLabels {
4
+ /** Header above the favorites list. Defaults to `'My Collection'`. */
5
+ myCollectionLabel?: string;
6
+ /** Hint shown when there are no favorites. Defaults to `'Star a skill to pin it here'`. */
7
+ emptyHintLabel?: string;
8
+ /** Label for the footer action button. Defaults to `'Browse'`. */
9
+ browseLabel?: string;
10
+ /** Accessible label for a row's remove-from-favorites star button. Defaults to `'Remove from favorites'`. */
11
+ removeFromFavoritesLabel?: string;
12
+ /** Label for a row tooltip's "View details" action. Defaults to `'View details'`. */
13
+ viewDetailsLabel?: string;
14
+ }
15
+ /** CSS custom-property overrides for the favorites panel. */
16
+ export interface FavoriteSkillsPanelColors {
17
+ /** Background color of a row on hover. Defaults to `--bg-layer-sunken`. */
18
+ rowHoverBackground?: string;
19
+ /** Text color of the "My Collection" header. Defaults to `--text-tertiary`. */
20
+ headerText?: string;
21
+ /** Text color of the empty-favorites hint. Defaults to `--text-icon-tertiary`. */
22
+ emptyHintText?: string;
23
+ /** Fill color of a row's star icon. Defaults to `--text-warning-icon`. */
24
+ starColor?: string;
25
+ /** Border color above the footer's Browse button. Defaults to `--stroke-tertiary`. */
26
+ footerBorder?: string;
27
+ }
28
+ /** Props for the favorites panel component. */
29
+ export interface FavoriteSkillsPanelProps {
30
+ /** The user's favorited skills, already resolved by the host. */
31
+ favorites: FavoriteSkillItem[];
32
+ /** Called when a row is activated (click, Enter, or Space). */
33
+ onSelect: (item: FavoriteSkillItem) => void;
34
+ /** Called with a skill's id when its row's star button is clicked to remove it from favorites. */
35
+ onToggleFavorite: (id: string) => void;
36
+ /** Called when the "Browse" button is clicked. */
37
+ onBrowse: () => void;
38
+ /** Called when a row tooltip's "View details" button is clicked. */
39
+ onViewDetails: (item: FavoriteSkillItem) => void;
40
+ /** Called with a skill's id each time one of its row's interactive tooltips opens (hover or focus). */
41
+ onItemTooltipOpen?: (id: string) => void;
42
+ /** Localizable string overrides. */
43
+ labels?: FavoriteSkillsPanelLabels;
44
+ /** Color overrides applied as CSS custom properties. */
45
+ colors?: FavoriteSkillsPanelColors;
46
+ /** CSS class applied to a row's skill name. Defaults to `'dial-small-text'`. */
47
+ nameClassName?: string;
48
+ /** CSS class applied to the "My Collection" header. Defaults to `'dial-tiny-lead-semi-text'`, which uppercases the label itself. */
49
+ headerClassName?: string;
50
+ /** CSS class applied to the empty-favorites hint. Defaults to `'dial-small-text'`. */
51
+ emptyHintClassName?: string;
52
+ }
53
+ //# sourceMappingURL=favorite-skills-panel-props.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"favorite-skills-panel-props.d.ts","sourceRoot":"","sources":["../../src/models/favorite-skills-panel-props.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,kFAAkF;AAClF,MAAM,WAAW,yBAAyB;IACxC,sEAAsE;IACtE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6GAA6G;IAC7G,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,6DAA6D;AAC7D,MAAM,WAAW,yBAAyB;IACxC,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,+CAA+C;AAC/C,MAAM,WAAW,wBAAwB;IACvC,iEAAiE;IACjE,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,+DAA+D;IAC/D,QAAQ,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC5C,kGAAkG;IAClG,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,kDAAkD;IAClD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,oEAAoE;IACpE,aAAa,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,uGAAuG;IACvG,iBAAiB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,oCAAoC;IACpC,MAAM,CAAC,EAAE,yBAAyB,CAAC;IACnC,wDAAwD;IACxD,MAAM,CAAC,EAAE,yBAAyB,CAAC;IACnC,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oIAAoI;IACpI,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B"}
@@ -0,0 +1,18 @@
1
+ import { ReactNode } from 'react';
2
+ /** Props for the SkillCatalogModal component. */
3
+ export interface SkillCatalogModalProps {
4
+ /** Whether the modal is open. */
5
+ isOpen: boolean;
6
+ /** Called when the modal should close (close button or backdrop click). */
7
+ onClose: () => void;
8
+ /** Called with the selected skill's resource URL when the content picks one. */
9
+ onSelect: (id: string) => void;
10
+ /** Header title. */
11
+ title: string;
12
+ /**
13
+ * Renders the modal body's picker content, mounted only while the modal is
14
+ * open; receives the selection and close callbacks to wire into it.
15
+ */
16
+ renderContent: (onSelect: (id: string) => void, onClose: () => void) => ReactNode;
17
+ }
18
+ //# sourceMappingURL=skill-catalog-modal-props.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-catalog-modal-props.d.ts","sourceRoot":"","sources":["../../src/models/skill-catalog-modal-props.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,iDAAiD;AACjD,MAAM,WAAW,sBAAsB;IACrC,iCAAiC;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gFAAgF;IAChF,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,aAAa,EAAE,CACb,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,EAC9B,OAAO,EAAE,MAAM,IAAI,KAChB,SAAS,CAAC;CAChB"}
@@ -0,0 +1,52 @@
1
+ import { CatalogContentFilePreview, CatalogItem, ItemDetailsStyles, ItemDetailsTexts } from '@epam/ai-dial-catalog';
2
+ import { ReactNode } from 'react';
3
+ /**
4
+ * Props for {@link SkillDetailsSidePanel} — the skill-scoped surface of
5
+ * `@epam/ai-dial-catalog`'s `DetailsPanelProps`, narrowed to the actions a
6
+ * skill details surface offers. Publish, share, credentials, and download
7
+ * stay with the Catalog page: omitting them hides those actions.
8
+ */
9
+ export interface SkillDetailsSidePanelProps {
10
+ /** The skill catalog item to display in the panel. */
11
+ item: CatalogItem;
12
+ /** Controls whether the panel is visible. */
13
+ isOpen: boolean;
14
+ /** Initial starred state for the skill. Default: `false`. */
15
+ isStarred?: boolean;
16
+ /**
17
+ * When `true`, a fetch for the structured Overview tab is pending; the
18
+ * panel shows a small loading indicator next to the tab row.
19
+ */
20
+ isDetailsLoading?: boolean;
21
+ /** Called when the panel should close (close button or backdrop click). */
22
+ onClose: () => void;
23
+ /** Called when the star/favorite button is toggled. */
24
+ onToggleFavorite?: (id: string, isStarred: boolean) => void;
25
+ /** Called when the header's "Use in chat" button is clicked. */
26
+ onUseInChat?: (item: CatalogItem) => void;
27
+ /** Controls whether the header's primary action button is shown for the skill. */
28
+ isPrimaryActionVisible?: (item: CatalogItem) => boolean;
29
+ /**
30
+ * Resolves the text of a file picked in the Content tab, given its opaque
31
+ * `id`. Superseded by `onLoadContentFilePreview` and
32
+ * `renderContentFilePreview` when those are supplied.
33
+ */
34
+ onLoadContentFile?: (fileId: string) => Promise<string | undefined>;
35
+ /**
36
+ * Resolves a picked file's typed preview, given its opaque `id`. Takes
37
+ * precedence over `onLoadContentFile`; superseded by
38
+ * `renderContentFilePreview` when that is supplied.
39
+ */
40
+ onLoadContentFilePreview?: (fileId: string) => Promise<CatalogContentFilePreview | undefined>;
41
+ /**
42
+ * Renders a picked file through a host-owned preview surface. Takes
43
+ * precedence over both loading callbacks. The file id is opaque to the
44
+ * panel; `fileName` is the basename resolved from the supplied tree.
45
+ */
46
+ renderContentFilePreview?: (fileId: string, fileName: string) => ReactNode;
47
+ /** Text overrides for the panel's user-visible strings. */
48
+ texts?: ItemDetailsTexts;
49
+ /** Grouped style overrides. */
50
+ styles?: ItemDetailsStyles;
51
+ }
52
+ //# sourceMappingURL=skill-details-side-panel-props.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-details-side-panel-props.d.ts","sourceRoot":"","sources":["../../src/models/skill-details-side-panel-props.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC,sDAAsD;IACtD,IAAI,EAAE,WAAW,CAAC;IAClB,6CAA6C;IAC7C,MAAM,EAAE,OAAO,CAAC;IAChB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,2EAA2E;IAC3E,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5D,gEAAgE;IAChE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAC1C,kFAAkF;IAClF,sBAAsB,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC;IACxD;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACpE;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,CACzB,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAAC;IACpD;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,SAAS,CAAC;IAC3E,2DAA2D;IAC3D,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B"}
@@ -0,0 +1,91 @@
1
+ import { MenuOverlayConfig, SelectedEntityChip } from '@epam/ai-dial-conversation-input';
2
+ import { ComponentType, ReactNode } from 'react';
3
+ import { SkillListingEntry } from './favorite-skill-item';
4
+ import { FavoriteSkillsPanelLabels } from './favorite-skills-panel-props';
5
+ /** Props accepted by the details-panel component injected into `useSkillSelectorOverlay`. */
6
+ export interface SkillDetailsPanelComponentProps {
7
+ /** Resource URL of the skill whose details are shown; `null` renders nothing. */
8
+ skillId: string | null;
9
+ /** Called when the panel should close (close button or backdrop click). */
10
+ onClose: () => void;
11
+ /**
12
+ * Called with the skill's resource URL when the panel's "Use in chat" is
13
+ * clicked; the hook also closes the panel.
14
+ */
15
+ onUseInChat: (skillId: string) => void;
16
+ }
17
+ /** Localizable string labels for the skill selector overlay flow. */
18
+ export interface SkillSelectorOverlayLabels {
19
+ /** Add-menu entry label and mobile sheet title. Defaults to `'Skills'`. */
20
+ addMenuLabel?: string;
21
+ /** Accessible label for the mobile sheet's back arrow. Defaults to `'Back'`. */
22
+ backLabel?: string;
23
+ /** Header title of the "Use skill" browse modal. Defaults to `'Use skill'`. */
24
+ catalogModalTitleLabel?: string;
25
+ /** Labels forwarded to the favorites panel rendered as the overlay. */
26
+ panelLabels?: FavoriteSkillsPanelLabels;
27
+ }
28
+ /** Options accepted by `useSkillSelectorOverlay`. */
29
+ export interface UseSkillSelectorOverlayOptions {
30
+ /**
31
+ * Whether the skill flow is enabled. While `false` the hook returns empty
32
+ * outputs: no menu entry, no modal, no panel, no chips.
33
+ */
34
+ isEnabled: boolean;
35
+ /** The user's own skills. */
36
+ skills: SkillListingEntry[];
37
+ /** Skills shared with the user, when the host distinguishes them. */
38
+ sharedWithMe?: SkillListingEntry[];
39
+ /** Public skills, when the host distinguishes them. */
40
+ publicSkills?: SkillListingEntry[];
41
+ /** Ids (`skills/{bucket}/{path}` URLs) of the user's favorited skills. */
42
+ favoriteIds: ReadonlySet<string>;
43
+ /** Removes a skill from favorites; fired by a row's star button. */
44
+ onToggleFavorite: (id: string) => void;
45
+ /**
46
+ * Resolves a skill's manifest description for its row tooltip. Returning
47
+ * `null` marks the skill as description-less for the rest of the session.
48
+ */
49
+ fetchSkillDescription: (skillId: string) => Promise<string | null>;
50
+ /** Localizable string overrides. */
51
+ labels?: SkillSelectorOverlayLabels;
52
+ /**
53
+ * Renders the browse modal's picker content (e.g. a host catalog view);
54
+ * receives the selection and close callbacks to wire into it, and is
55
+ * mounted only while the modal is open.
56
+ */
57
+ renderCatalogContent: (onSelect: (id: string) => void, onClose: () => void) => ReactNode;
58
+ /** The skill details side panel; may be a lazily loaded component. */
59
+ detailsPanelComponent: ComponentType<SkillDetailsPanelComponentProps>;
60
+ }
61
+ /** Returned by `useSkillSelectorOverlay`. */
62
+ export interface UseSkillSelectorOverlayResult {
63
+ /**
64
+ * The Skills entry for the `menuOverlays` prop of
65
+ * `ConversationInput`/`Input`. `undefined` while `isEnabled` is `false`: the
66
+ * host omits the entry entirely when this is `undefined`, so a stub renderer
67
+ * would leave the menu item in place with nothing behind it.
68
+ */
69
+ skillMenuOverlay?: MenuOverlayConfig;
70
+ /**
71
+ * The browse modal element. Render at a stable level outside the popover
72
+ * (e.g. next to the input); `null` while `isEnabled` is `false`.
73
+ */
74
+ skillCatalogModal: ReactNode;
75
+ /**
76
+ * The skill details side panel opened by a row tooltip's "View details".
77
+ * `null` while `isEnabled` is `false`.
78
+ */
79
+ skillDetailsPanel: ReactNode;
80
+ /**
81
+ * The selected skill as input chip data — at most one entry, replaced on
82
+ * every selection. Empty while `isEnabled` is `false` or nothing is selected.
83
+ */
84
+ selectedSkillChips: SelectedEntityChip[];
85
+ /**
86
+ * Selects a skill by its resource URL (`skills/{bucket}/{path}`), replacing
87
+ * any prior selection.
88
+ */
89
+ selectSkill: (skillId: string) => void;
90
+ }
91
+ //# sourceMappingURL=skill-selector-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-selector-overlay.d.ts","sourceRoot":"","sources":["../../src/models/skill-selector-overlay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAE/E,6FAA6F;AAC7F,MAAM,WAAW,+BAA+B;IAC9C,iFAAiF;IACjF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB;;;OAGG;IACH,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,qEAAqE;AACrE,MAAM,WAAW,0BAA0B;IACzC,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,uEAAuE;IACvE,WAAW,CAAC,EAAE,yBAAyB,CAAC;CACzC;AAED,qDAAqD;AACrD,MAAM,WAAW,8BAA8B;IAC7C;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,6BAA6B;IAC7B,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,qEAAqE;IACrE,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC,uDAAuD;IACvD,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC,0EAA0E;IAC1E,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,oEAAoE;IACpE,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC;;;OAGG;IACH,qBAAqB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnE,oCAAoC;IACpC,MAAM,CAAC,EAAE,0BAA0B,CAAC;IACpC;;;;OAIG;IACH,oBAAoB,EAAE,CACpB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,EAC9B,OAAO,EAAE,MAAM,IAAI,KAChB,SAAS,CAAC;IACf,sEAAsE;IACtE,qBAAqB,EAAE,aAAa,CAAC,+BAA+B,CAAC,CAAC;CACvE;AAED,6CAA6C;AAC7C,MAAM,WAAW,6BAA6B;IAC5C;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;IACrC;;;OAGG;IACH,iBAAiB,EAAE,SAAS,CAAC;IAC7B;;;OAGG;IACH,iBAAiB,EAAE,SAAS,CAAC;IAC7B;;;OAGG;IACH,kBAAkB,EAAE,kBAAkB,EAAE,CAAC;IACzC;;;OAGG;IACH,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@epam/ai-dial-skills",
3
+ "description": "Host-agnostic UI for picking a favorite skill to attach to a chat input",
4
+ "version": "1.1.0-dev.432",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "main": "./index.js",
8
+ "module": "./index.js",
9
+ "types": "./index.d.ts",
10
+ "exports": {
11
+ "./package.json": "./package.json",
12
+ ".": {
13
+ "types": "./index.d.ts",
14
+ "import": "./index.js",
15
+ "default": "./index.js"
16
+ }
17
+ },
18
+ "peerDependencies": {
19
+ "@epam/ai-dial-catalog": "1.1.0-dev.432",
20
+ "@epam/ai-dial-chat-shared": "1.1.0-dev.432",
21
+ "@epam/ai-dial-conversation-input": "1.1.0-dev.432",
22
+ "@epam/ai-dial-ui-kit": "*",
23
+ "@tabler/icons-react": "^3.0.0",
24
+ "react": "^19.0.0"
25
+ },
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/epam/ai-dial-chat.git",
29
+ "directory": "libs/skills"
30
+ }
31
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=test-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-setup.d.ts","sourceRoot":"","sources":["../src/test-setup.ts"],"names":[],"mappings":""}