@epam/ai-dial-skills 1.2.0-dev.1 → 1.2.0-dev.101

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 +1 @@
1
- {"version":3,"file":"ChatSkill.d.ts","sourceRoot":"","sources":["../../../src/components/ChatSkill/ChatSkill.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAY,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAGpE;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CAmFxC,CAAC"}
1
+ {"version":3,"file":"ChatSkill.d.ts","sourceRoot":"","sources":["../../../src/components/ChatSkill/ChatSkill.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAY,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAGpE;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CAmFxC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"FavoriteSkillsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/FavoriteSkillsPanel/FavoriteSkillsPanel.tsx"],"names":[],"mappings":"AAaA,OAAO,EAKL,KAAK,EAAE,EAER,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAYzF,sHAAsH;AACtH,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,wBAAwB,CA2P5D,CAAC"}
1
+ {"version":3,"file":"FavoriteSkillsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/FavoriteSkillsPanel/FavoriteSkillsPanel.tsx"],"names":[],"mappings":"AAaA,OAAO,EAKL,KAAK,EAAE,EAER,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAYzF,sHAAsH;AACtH,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,wBAAwB,CAiQ5D,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { FC } from 'react';
2
+ import { SkillArchiveUploadDialogProps } from '../../models/skill-archive-upload-dialog-props';
3
+ /**
4
+ * Dialog presenting the drop area and supported formats for a skill-archive upload, so the host
5
+ * can start the flow before the native file picker appears. Presentation only — the host wires
6
+ * selection/rejection/close to its own import controller.
7
+ */
8
+ export declare const SkillArchiveUploadDialog: FC<SkillArchiveUploadDialogProps>;
9
+ //# sourceMappingURL=SkillArchiveUploadDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillArchiveUploadDialog.d.ts","sourceRoot":"","sources":["../../../src/components/SkillArchiveUploadDialog/SkillArchiveUploadDialog.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,gDAAgD,CAAC;AAIpG;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,EAAE,CAAC,6BAA6B,CA4CtE,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare const SKILLS_CLASS: {
2
+ /** The favorite-skills panel root, which carries the themed CSS variables. */
3
+ readonly favoritesPanel: "dial-skills-favorites-panel";
4
+ /**
5
+ * The `/name` chip a `ChatSkill` renders inside the composer, additive to
6
+ * the `dial-kit-base-button` that `@epam/ai-dial-ui-kit` draws. The chip's
7
+ * height is its label line, so a host changing its padding should keep the
8
+ * vertical padding at zero or the chip stops aligning with the input's first
9
+ * text line.
10
+ */
11
+ readonly chip: "dial-skills-chip";
12
+ };
13
+ //# sourceMappingURL=public-class-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-class-names.d.ts","sourceRoot":"","sources":["../../src/constants/public-class-names.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,YAAY;IACvB,8EAA8E;;IAE9E;;;;;;OAMG;;CAEK,CAAC"}
package/index.css CHANGED
@@ -1,2 +1,2 @@
1
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*/
2
+ /*$vite$:1*/.visible{visibility:visible}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.hidden{display:none}.h-\[24px\]{height:24px}.h-\[40px\]{height:40px}.h-\[min\(80vh\2c 840px\)\]{height:min(80vh,840px)}.h-\[min\(90vh\2c 860px\)\]{height:min(90vh,860px)}.h-auto{height:auto}.max-h-72{max-height:18rem}.min-h-0{min-height:0}.w-full{width:100%}.min-w-0{min-width:0}.\!max-w-\[min\(95vw\2c 1200px\)\]{max-width:min(95vw,1200px)!important}.max-w-\[550px\]{max-width:550px}.flex-1{flex:1 1 0%}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded-lg{border-radius:.5rem}.border{border-width:1px}.border-t{border-top-width:1px}.border-transparent{border-color:transparent}.bg-error{background-color:var(--bg-error,#f3d6d8)}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0{padding-bottom:0;padding-top:0}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-4{padding-bottom:1rem;padding-top:1rem}.pb-0{padding-bottom:0}.pb-0\.5{padding-bottom:.125rem}.pb-1{padding-bottom:.25rem}.pt-2{padding-top:.5rem}.text-start{text-align:start}.text-error{color:var(--text-error,#ae2f2f)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}@media (min-width:1280px){.desktop\:inline{display:inline}.desktop\:hidden{display:none}.desktop\:w-\[280px\]{width:280px}}
package/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { ChatSkill } from './components/ChatSkill/ChatSkill';
2
2
  export { FavoriteSkillsPanel } from './components/FavoriteSkillsPanel/FavoriteSkillsPanel';
3
+ export { SkillArchiveUploadDialog } from './components/SkillArchiveUploadDialog/SkillArchiveUploadDialog';
3
4
  export { SkillCatalogModal } from './components/SkillCatalogModal/SkillCatalogModal';
4
5
  export { SkillDetailsSidePanel } from './components/SkillDetailsSidePanel/SkillDetailsSidePanel';
5
6
  export { SkillInfoTooltipContent } from './components/SkillInfoTooltipContent/SkillInfoTooltipContent';
@@ -8,8 +9,10 @@ export { buildFavoriteSkillItem } from './models/favorite-skill-item';
8
9
  export type { ChatSkillLabels, ChatSkillProps, } from './models/chat-skill-props';
9
10
  export type { FavoriteSkillItem, SkillListingEntry, } from './models/favorite-skill-item';
10
11
  export type { FavoriteSkillsPanelColors, FavoriteSkillsPanelLabels, FavoriteSkillsPanelProps, } from './models/favorite-skills-panel-props';
12
+ export type { SkillArchiveUploadDialogLabels, SkillArchiveUploadDialogProps, } from './models/skill-archive-upload-dialog-props';
11
13
  export type { SkillCatalogModalProps } from './models/skill-catalog-modal-props';
12
14
  export type { SkillDetailsSidePanelProps } from './models/skill-details-side-panel-props';
13
15
  export type { SkillInfoTooltipContentProps } from './models/skill-info-tooltip-content-props';
14
16
  export type { SkillDetailsPanelComponentProps, SkillSelectorOverlayLabels, UseSkillSelectorOverlayOptions, UseSkillSelectorOverlayResult, } from './models/skill-selector-overlay';
17
+ export { SKILLS_CLASS } from './constants/public-class-names';
15
18
  //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC7D,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,8DAA8D,CAAC;AACvG,OAAO,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AAClG,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,YAAY,EACV,eAAe,EACf,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,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,EAAE,4BAA4B,EAAE,MAAM,2CAA2C,CAAC;AAC9F,YAAY,EACV,+BAA+B,EAC/B,0BAA0B,EAC1B,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sDAAsD,CAAC;AAC3F,OAAO,EAAE,wBAAwB,EAAE,MAAM,gEAAgE,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0DAA0D,CAAC;AACjG,OAAO,EAAE,uBAAuB,EAAE,MAAM,8DAA8D,CAAC;AACvG,OAAO,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AAClG,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,YAAY,EACV,eAAe,EACf,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EACV,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,4CAA4C,CAAC;AACpD,YAAY,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACjF,YAAY,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AAC1F,YAAY,EAAE,4BAA4B,EAAE,MAAM,2CAA2C,CAAC;AAC9F,YAAY,EACV,+BAA+B,EAC/B,0BAA0B,EAC1B,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC"}
package/index.js CHANGED
@@ -1,53 +1,56 @@
1
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, Highlight as u, InteractiveTooltip as d, Popup as f, PopupSize as p, ToggleIconButton as m, TooltipPlacement as h } from "@epam/ai-dial-ui-kit";
3
- import { Suspense as g, useCallback as _, useEffect as v, useLayoutEffect as y, useMemo as b, useRef as x, useState as S } from "react";
4
- import { IconBlocks as C, IconEye as w, IconStarFilled as T } from "@tabler/icons-react";
5
- import { jsx as E, jsxs as D } from "react/jsx-runtime";
6
- import { DetailsPanel as O } from "@epam/ai-dial-catalog";
7
- //#region src/components/SkillInfoTooltipContent/SkillInfoTooltipContent.tsx
8
- var k = ({ description: e, unsupportedMessage: t, viewDetailsLabel: n = "View details", onViewDetails: r }) => t == null ? /* @__PURE__ */ D("div", {
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, FileDropzone as l, GhostButton as u, Highlight as d, InteractiveTooltip as f, Popup as p, PopupSize as m, ToggleIconButton as h, TooltipPlacement as g } from "@epam/ai-dial-ui-kit";
3
+ import { Suspense as _, useCallback as v, useEffect as y, useLayoutEffect as b, useMemo as x, useRef as S, useState as C } from "react";
4
+ import { IconBlocks as w, IconEye as T, IconStarFilled as E } from "@tabler/icons-react";
5
+ import { Fragment as D, jsx as O, jsxs as k } from "react/jsx-runtime";
6
+ import { DetailsPanel as A } from "@epam/ai-dial-catalog";
7
+ //#region src/constants/public-class-names.ts
8
+ var j = {
9
+ favoritesPanel: "dial-skills-favorites-panel",
10
+ chip: "dial-skills-chip"
11
+ }, M = ({ description: e, unsupportedMessage: t, viewDetailsLabel: n = "View details", onViewDetails: r }) => t == null ? /* @__PURE__ */ k("div", {
9
12
  className: "flex flex-col gap-3",
10
- children: [e != null && e !== "" && /* @__PURE__ */ E("p", {
13
+ children: [e != null && e !== "" && /* @__PURE__ */ O("p", {
11
14
  className: "text-start",
12
15
  children: e
13
- }), /* @__PURE__ */ E(i, {
16
+ }), /* @__PURE__ */ O(i, {
14
17
  variant: o.Primary,
15
18
  appearance: a.Link,
16
19
  className: "h-[24px] self-start",
17
20
  label: n,
18
- iconBefore: /* @__PURE__ */ E(w, {
21
+ iconBefore: /* @__PURE__ */ O(T, {
19
22
  size: s.SM,
20
23
  stroke: c,
21
24
  "aria-hidden": !0
22
25
  }),
23
26
  onClick: r
24
27
  })]
25
- }) : /* @__PURE__ */ E("p", {
28
+ }) : /* @__PURE__ */ O("p", {
26
29
  className: "text-start",
27
30
  children: t
28
- }), A = ({ name: e, path: t, description: r, isUnsupported: i = !1, labelClassName: a = "dial-body-paragraph-text", unsupportedLabelClassName: o = "text-error", unsupportedClassName: s = "bg-error", onViewDetails: c, labels: u = {} }) => {
29
- let { viewDetailsLabel: f = "View details", unsupportedTooltipLabel: p = "Selected model does not support skills. Remove the skill or select different model to proceed." } = u, [m, g] = S(0);
30
- return /* @__PURE__ */ E(d, {
31
+ }), N = ({ name: e, path: t, description: r, isUnsupported: i = !1, labelClassName: a = "dial-body-paragraph-text", unsupportedLabelClassName: o = "text-error", unsupportedClassName: s = "bg-error", onViewDetails: c, labels: l = {} }) => {
32
+ let { viewDetailsLabel: d = "View details", unsupportedTooltipLabel: p = "Selected model does not support skills. Remove the skill or select different model to proceed." } = l, [m, h] = C(0);
33
+ return /* @__PURE__ */ O(f, {
31
34
  asChild: !0,
32
- placement: h.Top,
35
+ placement: g.Top,
33
36
  contentClassName: "max-w-[550px]",
34
- content: i ? /* @__PURE__ */ E(k, { unsupportedMessage: p }) : /* @__PURE__ */ E(k, {
37
+ content: i ? /* @__PURE__ */ O(M, { unsupportedMessage: p }) : /* @__PURE__ */ O(M, {
35
38
  description: r,
36
- viewDetailsLabel: f,
39
+ viewDetailsLabel: d,
37
40
  onViewDetails: () => {
38
- g((e) => e + 1), c(t);
41
+ h((e) => e + 1), c(t);
39
42
  }
40
43
  }),
41
- children: /* @__PURE__ */ E("span", {
44
+ children: /* @__PURE__ */ O("span", {
42
45
  className: "inline-flex items-center",
43
- children: /* @__PURE__ */ E(l, {
46
+ children: /* @__PURE__ */ O(u, {
44
47
  label: `/${e}`,
45
48
  textClassName: i ? n(a, o) : a,
46
- className: i ? n("h-auto px-2 py-0", s) : "h-auto px-2 py-0"
49
+ className: n("h-auto px-2 py-0", i && s, j.chip)
47
50
  })
48
51
  })
49
52
  }, m);
50
- }, j = {
53
+ }, P = {
51
54
  row: "_row_1ovug_1",
52
55
  header: "_header_1ovug_5",
53
56
  emptyHint: "_emptyHint_1ovug_9",
@@ -58,143 +61,170 @@ var k = ({ description: e, unsupportedMessage: t, viewDetailsLabel: n = "View de
58
61
  rowLeaving: "_rowLeaving_1ovug_29",
59
62
  rowFadeOut: "_rowFadeOut_1ovug_1",
60
63
  listContent: "_listContent_1ovug_57"
61
- }, M = "px-3 pb-0.5 pt-2", N = 180, P = 288, F = ({ favorites: r, onSelect: i, onToggleFavorite: a, onBrowse: o, onViewDetails: c, searchQuery: f, labels: p = {}, colors: h, nameClassName: g = "dial-small-text", headerClassName: _ = "dial-tiny-lead-semi-text", emptyHintClassName: b = "dial-small-text" }) => {
62
- let { myCollectionLabel: C = "My Collection", emptyHintLabel: w = "Star a skill to pin it here", browseLabel: O = "Browse", removeFromFavoritesLabel: A = "Remove from favorites", viewDetailsLabel: F = "View details", noMatchingSkillsLabel: I = "No matching skills" } = p, L = t({
63
- "--fs-row-hover-bg": h?.rowHoverBackground,
64
- "--fs-header-text": h?.headerText,
65
- "--fs-empty-hint-text": h?.emptyHintText,
66
- "--fs-star-color": h?.starColor,
67
- "--fs-footer-border": h?.footerBorder
68
- }), [R, z] = S(/* @__PURE__ */ new Set()), B = x(/* @__PURE__ */ new Map());
69
- v(() => {
70
- let e = B.current;
64
+ }, F = "px-3 pb-0.5 pt-2", I = 180, L = 288, R = ({ favorites: r, onSelect: i, onToggleFavorite: a, onBrowse: o, onViewDetails: c, searchQuery: l, labels: p = {}, colors: m, nameClassName: g = "dial-small-text", headerClassName: _ = "dial-tiny-lead-semi-text", emptyHintClassName: v = "dial-small-text" }) => {
65
+ let { myCollectionLabel: x = "My Collection", emptyHintLabel: w = "Star a skill to pin it here", browseLabel: T = "Browse", removeFromFavoritesLabel: D = "Remove from favorites", viewDetailsLabel: A = "View details", noMatchingSkillsLabel: N = "No matching skills" } = p, R = t({
66
+ "--fs-row-hover-bg": m?.rowHoverBackground,
67
+ "--fs-header-text": m?.headerText,
68
+ "--fs-empty-hint-text": m?.emptyHintText,
69
+ "--fs-star-color": m?.starColor,
70
+ "--fs-footer-border": m?.footerBorder
71
+ }), [z, B] = C(/* @__PURE__ */ new Set()), V = S(/* @__PURE__ */ new Map());
72
+ y(() => {
73
+ let e = V.current;
71
74
  return () => {
72
75
  e.forEach((e) => clearTimeout(e)), e.clear();
73
76
  };
74
77
  }, []);
75
- let V = f != null, H = f?.toLowerCase() ?? "", U = V ? r.filter((e) => e.name.toLowerCase().includes(H)) : r, W = x(null), [G, K] = S();
76
- y(() => {
77
- W.current && K(Math.min(W.current.scrollHeight, P));
78
- }, [r, f]);
79
- let q = (e, t) => {
78
+ let H = l != null, U = l?.toLowerCase() ?? "", W = H ? r.filter((e) => e.name.toLowerCase().includes(U)) : r, G = S(null), [K, q] = C();
79
+ b(() => {
80
+ G.current && q(Math.min(G.current.scrollHeight, L));
81
+ }, [r, l]);
82
+ let J = (e, t) => {
80
83
  e.target === e.currentTarget && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), i(t));
81
- }, J = (e) => {
82
- z((t) => new Set(t).add(e));
84
+ }, Y = (e) => {
85
+ B((t) => new Set(t).add(e));
83
86
  let t = setTimeout(() => {
84
- a(e), z((t) => {
87
+ a(e), B((t) => {
85
88
  let n = new Set(t);
86
89
  return n.delete(e), n;
87
- }), B.current.delete(e);
88
- }, N);
89
- B.current.set(e, t);
90
+ }), V.current.delete(e);
91
+ }, I);
92
+ V.current.set(e, t);
90
93
  };
91
- return /* @__PURE__ */ D("div", {
92
- className: "flex w-full flex-col desktop:w-[280px]",
93
- style: L,
94
+ return /* @__PURE__ */ k("div", {
95
+ className: n("flex w-full flex-col desktop:w-[280px]", j.favoritesPanel),
96
+ style: R,
94
97
  children: [
95
- /* @__PURE__ */ E("p", {
96
- className: n(_, M, j.header),
97
- children: C
98
+ /* @__PURE__ */ O("p", {
99
+ className: n(_, F, P.header),
100
+ children: x
98
101
  }),
99
- /* @__PURE__ */ E("div", {
100
- className: n("max-h-72 min-h-0 flex-1 overflow-y-auto", j.listContent),
101
- style: { maxHeight: G },
102
- children: /* @__PURE__ */ E("div", {
103
- ref: W,
104
- children: U.length > 0 ? /* @__PURE__ */ E("ul", {
102
+ /* @__PURE__ */ O("div", {
103
+ className: n("max-h-72 min-h-0 flex-1 overflow-y-auto", P.listContent),
104
+ style: { maxHeight: K },
105
+ children: /* @__PURE__ */ O("div", {
106
+ ref: G,
107
+ children: W.length > 0 ? /* @__PURE__ */ O("ul", {
105
108
  className: "flex flex-col gap-1 px-1 pb-1",
106
- children: U.map((t) => {
107
- let r = /* @__PURE__ */ D("div", {
109
+ children: W.map((t) => {
110
+ let r = /* @__PURE__ */ k("div", {
108
111
  role: "button",
109
112
  tabIndex: 0,
110
- className: n("flex cursor-pointer items-center gap-2 rounded-lg border border-transparent px-2 py-1.5 transition-colors", j.row),
113
+ className: n("flex cursor-pointer items-center gap-2 rounded-lg border border-transparent px-2 py-1.5 transition-colors", P.row),
111
114
  onClick: () => i(t),
112
- onKeyDown: (e) => q(e, t),
115
+ onKeyDown: (e) => J(e, t),
113
116
  children: [
114
- /* @__PURE__ */ E(e, {
117
+ /* @__PURE__ */ O(e, {
115
118
  size: s.MD,
116
119
  initialsName: t.name
117
120
  }),
118
- f == null ? /* @__PURE__ */ E("span", {
121
+ l == null ? /* @__PURE__ */ O("span", {
119
122
  className: n(g, "min-w-0 flex-1 truncate text-start"),
120
123
  children: t.name
121
- }) : /* @__PURE__ */ E(u, {
124
+ }) : /* @__PURE__ */ O(d, {
122
125
  text: t.name,
123
- query: f,
126
+ query: l,
124
127
  maxLines: 1,
125
128
  className: n(g, "min-w-0 flex-1 text-start")
126
129
  }),
127
- /* @__PURE__ */ E(m, {
128
- icon: /* @__PURE__ */ E(T, {
130
+ /* @__PURE__ */ O(h, {
131
+ icon: /* @__PURE__ */ O(E, {
129
132
  size: s.SM,
130
- className: j.star,
133
+ className: P.star,
131
134
  "aria-hidden": !0
132
135
  }),
133
- "aria-label": A,
136
+ "aria-label": D,
134
137
  isSelected: !0,
135
138
  onClick: (e) => {
136
- e.stopPropagation(), J(t.id);
139
+ e.stopPropagation(), Y(t.id);
137
140
  }
138
141
  })
139
142
  ]
140
143
  });
141
- return /* @__PURE__ */ E("li", {
142
- className: R.has(t.id) ? j.rowLeaving : j.rowEnter,
143
- children: /* @__PURE__ */ E(d, {
144
+ return /* @__PURE__ */ O("li", {
145
+ className: z.has(t.id) ? P.rowLeaving : P.rowEnter,
146
+ children: /* @__PURE__ */ O(f, {
144
147
  asChild: !0,
145
148
  contentClassName: "max-w-[550px]",
146
- content: /* @__PURE__ */ E(k, {
149
+ content: /* @__PURE__ */ O(M, {
147
150
  description: t.description,
148
- viewDetailsLabel: F,
151
+ viewDetailsLabel: A,
149
152
  onViewDetails: () => c(t)
150
153
  }),
151
154
  children: r
152
155
  })
153
156
  }, t.id);
154
157
  })
155
- }) : V && H !== "" ? /* @__PURE__ */ E("p", {
158
+ }) : H && U !== "" ? /* @__PURE__ */ O("p", {
156
159
  role: "status",
157
160
  "aria-live": "polite",
158
- className: n(b, "px-4 py-4 text-start", j.emptyHint),
159
- children: I
160
- }) : /* @__PURE__ */ E("p", {
161
- className: n(b, "px-4 py-4 text-start", j.emptyHint),
161
+ className: n(v, "px-4 py-4 text-start", P.emptyHint),
162
+ children: N
163
+ }) : /* @__PURE__ */ O("p", {
164
+ className: n(v, "px-4 py-4 text-start", P.emptyHint),
162
165
  children: w
163
166
  })
164
167
  })
165
168
  }),
166
- /* @__PURE__ */ E("div", {
167
- className: n("border-t px-2 py-3", j.footer),
168
- children: /* @__PURE__ */ E(l, {
169
- label: O,
169
+ /* @__PURE__ */ O("div", {
170
+ className: n("border-t px-2 py-3", P.footer),
171
+ children: /* @__PURE__ */ O(u, {
172
+ label: T,
170
173
  className: "w-full justify-center",
171
174
  onClick: o
172
175
  })
173
176
  })
174
177
  ]
175
178
  });
176
- }, I = ({ isOpen: e, onClose: t, onSelect: n, title: r, renderContent: i }) => /* @__PURE__ */ E(f, {
179
+ }, z = ".zip,.md", B = ({ isOpen: e, errorText: t, accept: n = z, labels: r, onClose: i, onFilesSelected: a, onFilesRejected: o }) => {
180
+ let { dialogTitle: s = "Upload skill", dropZoneLabel: c = "Drag and drop it or click here to upload", dropZoneMobileLabel: u = "Click here to upload", formatsLabel: d = "File formats .zip and SKILL.md", fileInputAriaLabel: f = "Upload a skill ZIP archive or a SKILL.md file", closeAriaLabel: h = "Close" } = r ?? {};
181
+ return /* @__PURE__ */ O(p, {
182
+ open: e,
183
+ size: m.Sm,
184
+ header: s,
185
+ closeAriaLabel: h,
186
+ onClose: i,
187
+ children: /* @__PURE__ */ O("div", {
188
+ className: "px-6 py-4",
189
+ children: /* @__PURE__ */ O(l, {
190
+ label: /* @__PURE__ */ k(D, { children: [/* @__PURE__ */ O("span", {
191
+ className: "desktop:hidden",
192
+ children: u
193
+ }), /* @__PURE__ */ O("span", {
194
+ className: "hidden desktop:inline",
195
+ children: c
196
+ })] }),
197
+ description: d,
198
+ ariaLabel: f,
199
+ accept: n,
200
+ errorText: t,
201
+ onChange: a,
202
+ onReject: o
203
+ })
204
+ })
205
+ });
206
+ }, V = ({ isOpen: e, onClose: t, onSelect: n, title: r, renderContent: i }) => /* @__PURE__ */ O(p, {
177
207
  open: e,
178
208
  header: r,
179
- size: p.Lg,
209
+ size: m.Lg,
180
210
  className: "h-[min(90vh,860px)] !max-w-[min(95vw,1200px)] overflow-hidden",
181
211
  onClose: t,
182
- children: /* @__PURE__ */ E("div", {
212
+ children: /* @__PURE__ */ O("div", {
183
213
  className: "h-[min(80vh,840px)] overflow-auto",
184
- children: /* @__PURE__ */ E(g, {
214
+ children: /* @__PURE__ */ O(_, {
185
215
  fallback: null,
186
216
  children: e && i(n, t)
187
217
  })
188
218
  })
189
- }), L = (e) => /* @__PURE__ */ E(O, { ...e }), R = (e) => ({
219
+ }), H = (e) => /* @__PURE__ */ O(A, { ...e }), U = (e) => ({
190
220
  id: e.url,
191
221
  name: e.name,
192
222
  description: e.description
193
- }), z = (e) => {
223
+ }), W = (e) => {
194
224
  let t = e.split("/").filter((e) => e.length > 0);
195
225
  return t[t.length - 1] ?? e;
196
- }, B = ({ isEnabled: e, isSkillsSupported: t, skills: n, sharedWithMe: i, publicSkills: a, favoriteIds: o, onToggleFavorite: s, labels: l, historyChipLabelClassName: u, renderCatalogContent: d, detailsPanelComponent: f }) => {
197
- let { addMenuLabel: p = "Skills", backLabel: m = "Back", catalogModalTitleLabel: h = "Use skill", emptyQueryHintLabel: v = "Type to filter", unsupportedTooltipLabel: y = "Selected model does not support skills. Remove the skill or select different model to proceed.", panelLabels: x } = l ?? {}, w = e && t, [T, D] = S(!1), [O, k] = S(null), [j, M] = S(null), N = b(() => [
226
+ }, G = ({ isEnabled: e, isSkillsSupported: t, skills: n, sharedWithMe: i, publicSkills: a, favoriteIds: o, onToggleFavorite: s, labels: l, historyChipLabelClassName: u, renderCatalogContent: d, detailsPanelComponent: f }) => {
227
+ let { addMenuLabel: p = "Skills", backLabel: m = "Back", catalogModalTitleLabel: h = "Use skill", emptyQueryHintLabel: g = "Type to filter", unsupportedTooltipLabel: y = "Selected model does not support skills. Remove the skill or select different model to proceed.", panelLabels: b } = l ?? {}, S = e && t, [T, E] = C(!1), [D, k] = C(null), [A, j] = C(null), M = x(() => [
198
228
  ...n,
199
229
  ...i ?? [],
200
230
  ...a ?? []
@@ -202,61 +232,61 @@ var k = ({ description: e, unsupportedMessage: t, viewDetailsLabel: n = "View de
202
232
  n,
203
233
  i,
204
234
  a
205
- ]), P = b(() => new Map(N.map((e) => [e.url, e])), [N]), L = b(() => N.filter((e) => o.has(e.url)).map((e) => R(e)), [N, o]), B = b(() => j == null ? null : P.get(j) ?? null, [P, j]), V = B != null && !t, H = _((e) => {
206
- M(e);
207
- }, []), U = _(() => {
208
- M(null);
209
- }, []), W = j, G = b(() => j == null ? void 0 : [{ url: j }], [j]), K = b(() => B == null ? null : /* @__PURE__ */ E(A, {
210
- name: B.name,
211
- path: B.url,
212
- description: B.description,
213
- isUnsupported: V,
235
+ ]), P = x(() => new Map(M.map((e) => [e.url, e])), [M]), F = x(() => M.filter((e) => o.has(e.url)).map((e) => U(e)), [M, o]), I = x(() => A == null ? null : P.get(A) ?? null, [P, A]), L = I != null && !t, z = v((e) => {
236
+ j(e);
237
+ }, []), B = v(() => {
238
+ j(null);
239
+ }, []), H = A, G = x(() => A == null ? void 0 : [{ url: A }], [A]), K = x(() => I == null ? null : /* @__PURE__ */ O(N, {
240
+ name: I.name,
241
+ path: I.url,
242
+ description: I.description,
243
+ isUnsupported: L,
214
244
  onViewDetails: k,
215
245
  labels: {
216
- viewDetailsLabel: x?.viewDetailsLabel,
246
+ viewDetailsLabel: b?.viewDetailsLabel,
217
247
  unsupportedTooltipLabel: y
218
248
  }
219
249
  }), [
220
- B,
221
- V,
222
- x,
250
+ I,
251
+ L,
252
+ b,
223
253
  y
224
- ]), q = _((e) => e == null || e.length === 0 ? null : e.map((e) => {
254
+ ]), q = v((e) => e == null || e.length === 0 ? null : e.map((e) => {
225
255
  let t = P.get(e.url);
226
- return /* @__PURE__ */ E(A, {
227
- name: t?.name ?? z(e.url),
256
+ return /* @__PURE__ */ O(N, {
257
+ name: t?.name ?? W(e.url),
228
258
  path: e.url,
229
259
  labelClassName: u,
230
260
  description: t?.description,
231
261
  onViewDetails: k,
232
- labels: { viewDetailsLabel: x?.viewDetailsLabel }
262
+ labels: { viewDetailsLabel: b?.viewDetailsLabel }
233
263
  }, e.url);
234
264
  }), [
235
265
  P,
236
266
  u,
237
- x
238
- ]), J = _((e) => /* @__PURE__ */ E(F, {
239
- favorites: L,
267
+ b
268
+ ]), J = v((e) => /* @__PURE__ */ O(R, {
269
+ favorites: F,
240
270
  onSelect: (t) => {
241
- H(t.id), e();
271
+ z(t.id), e();
242
272
  },
243
273
  onToggleFavorite: s,
244
274
  onBrowse: () => {
245
- e(), D(!0);
275
+ e(), E(!0);
246
276
  },
247
277
  onViewDetails: (t) => {
248
278
  e(), k(t.id);
249
279
  },
250
- labels: x
280
+ labels: b
251
281
  }), [
252
- L,
253
- H,
282
+ F,
283
+ z,
254
284
  s,
255
- x
256
- ]), Y = b(() => w ? {
285
+ b
286
+ ]), Y = x(() => S ? {
257
287
  key: "skills",
258
288
  title: p,
259
- icon: /* @__PURE__ */ E(C, {
289
+ icon: /* @__PURE__ */ O(w, {
260
290
  size: r,
261
291
  "aria-hidden": !0,
262
292
  stroke: c
@@ -264,63 +294,63 @@ var k = ({ description: e, unsupportedMessage: t, viewDetailsLabel: n = "View de
264
294
  renderOverlay: J,
265
295
  backLabel: m
266
296
  } : void 0, [
267
- w,
297
+ S,
268
298
  p,
269
299
  m,
270
300
  J
271
- ]), X = b(() => w ? {
301
+ ]), X = x(() => S ? {
272
302
  triggerPrefix: "/",
273
303
  menuLabel: p,
274
- emptyQueryHint: v,
275
- renderMenu: ({ query: e, close: t }) => /* @__PURE__ */ E(F, {
276
- favorites: L,
304
+ emptyQueryHint: g,
305
+ renderMenu: ({ query: e, close: t }) => /* @__PURE__ */ O(R, {
306
+ favorites: F,
277
307
  searchQuery: e,
278
308
  onSelect: (e) => {
279
- t({ consumeQuery: !0 }), H(e.id);
309
+ t({ consumeQuery: !0 }), z(e.id);
280
310
  },
281
311
  onToggleFavorite: s,
282
312
  onBrowse: () => {
283
- t({ consumeQuery: !0 }), D(!0);
313
+ t({ consumeQuery: !0 }), E(!0);
284
314
  },
285
315
  onViewDetails: (e) => {
286
316
  t({ consumeQuery: !0 }), k(e.id);
287
317
  },
288
- labels: x
318
+ labels: b
289
319
  })
290
320
  } : void 0, [
291
- w,
321
+ S,
292
322
  p,
293
- v,
294
- L,
295
- H,
323
+ g,
324
+ F,
325
+ z,
296
326
  s,
297
- x
327
+ b
298
328
  ]);
299
329
  return e ? {
300
330
  skillMenuOverlay: Y,
301
331
  commandMenu: X,
302
- skillCatalogModal: /* @__PURE__ */ E(I, {
332
+ skillCatalogModal: /* @__PURE__ */ O(V, {
303
333
  isOpen: T,
304
- onClose: () => D(!1),
334
+ onClose: () => E(!1),
305
335
  onSelect: (e) => {
306
- H(e), D(!1);
336
+ z(e), E(!1);
307
337
  },
308
338
  title: h,
309
339
  renderContent: d
310
340
  }),
311
- skillDetailsPanel: /* @__PURE__ */ E(g, {
341
+ skillDetailsPanel: /* @__PURE__ */ O(_, {
312
342
  fallback: null,
313
- children: /* @__PURE__ */ E(f, {
314
- skillId: O,
343
+ children: /* @__PURE__ */ O(f, {
344
+ skillId: D,
315
345
  onClose: () => k(null)
316
346
  })
317
347
  }),
318
348
  selectedSkillElement: K,
319
- selectedSkillPath: W,
349
+ selectedSkillPath: H,
320
350
  selectedSkills: G,
321
- isSkillUnsupported: V,
322
- selectSkill: H,
323
- removeSelectedSkill: U,
351
+ isSkillUnsupported: L,
352
+ selectSkill: z,
353
+ removeSelectedSkill: B,
324
354
  renderHistorySkills: q
325
355
  } : {
326
356
  skillMenuOverlay: void 0,
@@ -337,4 +367,4 @@ var k = ({ description: e, unsupportedMessage: t, viewDetailsLabel: n = "View de
337
367
  };
338
368
  };
339
369
  //#endregion
340
- export { A as ChatSkill, F as FavoriteSkillsPanel, I as SkillCatalogModal, L as SkillDetailsSidePanel, k as SkillInfoTooltipContent, R as buildFavoriteSkillItem, B as useSkillSelectorOverlay };
370
+ export { N as ChatSkill, R as FavoriteSkillsPanel, j as SKILLS_CLASS, B as SkillArchiveUploadDialog, V as SkillCatalogModal, H as SkillDetailsSidePanel, M as SkillInfoTooltipContent, U as buildFavoriteSkillItem, G as useSkillSelectorOverlay };
@@ -0,0 +1,33 @@
1
+ /** Labels for {@link SkillArchiveUploadDialogProps}; each has an English default. */
2
+ export interface SkillArchiveUploadDialogLabels {
3
+ /** Dialog header. Defaults to `'Upload skill'`. */
4
+ dialogTitle?: string;
5
+ /** Drop-zone label shown on desktop widths. Defaults to `'Drag and drop it or click here to upload'`. */
6
+ dropZoneLabel?: string;
7
+ /** Drop-zone label shown on mobile widths. Defaults to `'Click here to upload'`. */
8
+ dropZoneMobileLabel?: string;
9
+ /** Sentence describing accepted formats, shown under the drop zone. Defaults to `'File formats .zip and SKILL.md'`. */
10
+ formatsLabel?: string;
11
+ /** Accessible name for the native file input. Defaults to `'Upload a skill ZIP archive or a SKILL.md file'`. */
12
+ fileInputAriaLabel?: string;
13
+ /** Accessible name for the dialog's close button. Defaults to `'Close'`. */
14
+ closeAriaLabel?: string;
15
+ }
16
+ /** Props for {@link SkillArchiveUploadDialog}. */
17
+ export interface SkillArchiveUploadDialogProps {
18
+ /** Whether the dialog is open. */
19
+ isOpen: boolean;
20
+ /** Rejection message rendered under the drop area; omit when nothing was rejected. */
21
+ errorText?: string;
22
+ /** `accept` value forwarded to the drop zone/native file input. Defaults to `'.zip,.md'`. */
23
+ accept?: string;
24
+ /** Labels rendered by the dialog; each falls back to an English default. */
25
+ labels?: SkillArchiveUploadDialogLabels;
26
+ /** Called on Escape, the close button, or an outside click. */
27
+ onClose: () => void;
28
+ /** Called with the picked or dropped files that `accept` allowed through. */
29
+ onFilesSelected: (files: File[]) => void;
30
+ /** Called when a drop carried files that `accept` excluded. */
31
+ onFilesRejected: () => void;
32
+ }
33
+ //# sourceMappingURL=skill-archive-upload-dialog-props.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-archive-upload-dialog-props.d.ts","sourceRoot":"","sources":["../../src/models/skill-archive-upload-dialog-props.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,MAAM,WAAW,8BAA8B;IAC7C,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yGAAyG;IACzG,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oFAAoF;IACpF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,uHAAuH;IACvH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gHAAgH;IAChH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,kDAAkD;AAClD,MAAM,WAAW,6BAA6B;IAC5C,kCAAkC;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,8BAA8B,CAAC;IACxC,+DAA+D;IAC/D,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,6EAA6E;IAC7E,eAAe,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACzC,+DAA+D;IAC/D,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B"}
@@ -1,4 +1,4 @@
1
- import { RequestSkill } from '../../../chat-shared/src/index.ts';
1
+ import { RequestSkill } from '@epam/ai-dial-chat-shared';
2
2
  import { CommandMenuConfig, MenuOverlayConfig } from '@epam/ai-dial-conversation-input';
3
3
  import { ComponentType, ReactNode } from 'react';
4
4
  import { SkillListingEntry } from './favorite-skill-item';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@epam/ai-dial-skills",
3
3
  "description": "Host-agnostic UI for picking a favorite skill to attach to a chat input",
4
- "version": "1.2.0-dev.1",
4
+ "version": "1.2.0-dev.101",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "main": "./index.js",
@@ -18,12 +18,12 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@tabler/icons-react": "^3.44.0",
21
- "@epam/ai-dial-catalog": "1.2.0-dev.1",
22
- "@epam/ai-dial-conversation-input": "1.2.0-dev.1"
21
+ "@epam/ai-dial-catalog": "1.2.0-dev.101",
22
+ "@epam/ai-dial-conversation-input": "1.2.0-dev.101"
23
23
  },
24
24
  "peerDependencies": {
25
- "@epam/ai-dial-chat-shared": "1.2.0-dev.1",
26
- "@epam/ai-dial-ui-kit": "^0.14.2",
25
+ "@epam/ai-dial-chat-shared": "1.2.0-dev.101",
26
+ "@epam/ai-dial-ui-kit": "^0.15.0-dev.12",
27
27
  "react": "^19.2.8"
28
28
  },
29
29
  "repository": {