@epam/ai-dial-prompts 1.2.0-dev.75 → 1.2.0-dev.78

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 { PromptParametersPopupProps } from '../../models/prompt-parameters-popup-props';
3
+ /** Compatible root export that loads the parameter UI only when opened. */
4
+ export declare const PromptParametersPopup: FC<PromptParametersPopupProps>;
5
+ //# sourceMappingURL=LazyPromptParametersPopup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LazyPromptParametersPopup.d.ts","sourceRoot":"","sources":["../../../src/components/PromptParametersPopup/LazyPromptParametersPopup.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AAQ7F,2EAA2E;AAC3E,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,0BAA0B,CAShE,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Eager component entry used by the root export dynamic import. Keeping it a
3
+ * separate build entry preserves the popup/catalog chunk in published packages.
4
+ * Hosts may use this subpath to manage loading themselves.
5
+ */
6
+ export { PromptParametersPopup } from '../components/PromptParametersPopup/PromptParametersPopup';
7
+ export type { PromptParametersPopupColors, PromptParametersPopupLabels, PromptParametersPopupProps, } from '../models/prompt-parameters-popup-props';
8
+ //# sourceMappingURL=parameters-popup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameters-popup.d.ts","sourceRoot":"","sources":["../../src/entry-points/parameters-popup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,2DAA2D,CAAC;AAClG,YAAY,EACV,2BAA2B,EAC3B,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,yCAAyC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { UsePromptSelectorOverlayOptions, UsePromptSelectorOverlayResult } from '../../models/prompt-selector-overlay';
2
+ /**
3
+ * Owns the prompt-selection workflow: the favorites overlay, the browse/parameter transitions,
4
+ * and parameter resolution. The host supplies the merged prompt listing, favorites state,
5
+ * labels, insertion callback, and its own lazy-loaded browse-modal renderer — this hook never
6
+ * imports generated API DTOs, parent providers, routing, or i18n.
7
+ */
8
+ export declare const usePromptSelectorOverlay: ({ isEnabled, prompts, favoriteIds, onToggleFavorite, onInsertText, labels, renderCatalog, }: UsePromptSelectorOverlayOptions) => UsePromptSelectorOverlayResult;
9
+ //# sourceMappingURL=usePromptSelectorOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePromptSelectorOverlay.d.ts","sourceRoot":"","sources":["../../../src/hooks/usePromptSelectorOverlay/usePromptSelectorOverlay.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,+BAA+B,EAC/B,8BAA8B,EAC/B,MAAM,sCAAsC,CAAC;AAE9C;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GAAI,6FAQtC,+BAA+B,KAAG,8BAkHpC,CAAC"}
package/index.css CHANGED
@@ -1,2 +1,2 @@
1
1
  ._header_1pyx6_3{color:var(--fp-header-text,var(--text-tertiary,#848e9c))}._emptyHint_1pyx6_7{color:var(--fp-empty-hint-text,var(--text-icon-tertiary,#848e9c))}._star_1pyx6_11{color:var(--fp-star-color,var(--text-warning-icon,#eec840))}._footer_1pyx6_15{border-top-color:var(--fp-footer-border,var(--stroke-tertiary,#e0e6f0))}._rowEnter_1pyx6_23{animation:.2s ease-out _rowFadeIn_1pyx6_1}._rowLeaving_1pyx6_27{pointer-events:none;animation:.18s ease-out forwards _rowFadeOut_1pyx6_1}@keyframes _rowFadeIn_1pyx6_1{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@keyframes _rowFadeOut_1pyx6_1{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.96)}}._listContent_1pyx6_55{transition:max-height .2s}@media (prefers-reduced-motion:reduce){._rowEnter_1pyx6_23,._rowLeaving_1pyx6_27{animation:none}._listContent_1pyx6_55{transition:none}}._card_p8vwa_1{background:var(--pp-card-bg,var(--bg-layer-sunken,#eef1f7));border-color:var(--pp-card-border,var(--stroke-tertiary,#e0e6f0))}
2
- /*$vite$:1*/.m-0{margin:0}.flex{display:flex}.grid{display:grid}.list-item{display:list-item}.h-\[72px\]{height:72px}.h-auto{height:auto}.min-h-0{min-height:0}.w-full{width:100%}.min-w-\[240px\]{min-width:240px}.max-w-\[550px\]{max-width:550px}.flex-1{flex:1 1 0%}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.overflow-y-auto{overflow-y:auto}.rounded-lg{border-radius:.5rem}.border{border-width:1px}.border-t{border-top-width:1px}.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-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}.pb-4{padding-bottom:1rem}.pt-2{padding-top:.5rem}.text-start{text-align:start}.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)}.rtl\:scale-x-\[-1\]:where([dir=rtl],[dir=rtl] *){--tw-scale-x:-1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}
2
+ /*$vite$:1*/.m-0{margin:0}.flex{display:flex}.grid{display:grid}.list-item{display:list-item}.h-\[72px\]{height:72px}.h-auto{height:auto}.min-h-0{min-height:0}.w-full{width:100%}.min-w-\[240px\]{min-width:240px}.max-w-\[550px\]{max-width:550px}.flex-1{flex:1 1 0%}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.overflow-y-auto{overflow-y:auto}.rounded-lg{border-radius:.5rem}.border{border-width:1px}.border-t{border-top-width:1px}.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-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}.pb-4{padding-bottom:1rem}.pt-2{padding-top:.5rem}.text-start{text-align:start}.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)}.rtl\:scale-x-\[-1\]:where([dir=rtl],[dir=rtl] *){--tw-scale-x:-1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}
package/index.d.ts CHANGED
@@ -1,7 +1,9 @@
1
+ export { PromptParametersPopup } from './components/PromptParametersPopup/LazyPromptParametersPopup';
1
2
  export { FavoritePromptsPanel } from './components/FavoritePromptsPanel/FavoritePromptsPanel';
2
- export { PromptParametersPopup } from './components/PromptParametersPopup/PromptParametersPopup';
3
+ export { usePromptSelectorOverlay } from './hooks/usePromptSelectorOverlay/usePromptSelectorOverlay';
3
4
  export type { FavoritePromptItem } from './models/favorite-prompt-item';
4
5
  export type { FavoritePromptsPanelColors, FavoritePromptsPanelLabels, FavoritePromptsPanelProps, } from './models/favorite-prompts-panel-props';
5
6
  export type { PromptParametersPopupColors, PromptParametersPopupLabels, PromptParametersPopupProps, } from './models/prompt-parameters-popup-props';
7
+ export type { RenderPromptCatalogProps, UsePromptSelectorOverlayLabels, UsePromptSelectorOverlayOptions, UsePromptSelectorOverlayResult, } from './models/prompt-selector-overlay';
6
8
  export { PROMPTS_CLASS } from './constants/public-class-names';
7
9
  //# 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,oBAAoB,EAAE,MAAM,wDAAwD,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,0DAA0D,CAAC;AACjG,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,YAAY,EACV,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,2BAA2B,EAC3B,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,8DAA8D,CAAC;AACrG,OAAO,EAAE,oBAAoB,EAAE,MAAM,wDAAwD,CAAC;AAC9F,OAAO,EAAE,wBAAwB,EAAE,MAAM,2DAA2D,CAAC;AACrG,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,YAAY,EACV,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,2BAA2B,EAC3B,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,wCAAwC,CAAC;AAChD,YAAY,EACV,wBAAwB,EACxB,8BAA8B,EAC9B,+BAA+B,EAC/B,8BAA8B,GAC/B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC"}
package/index.js CHANGED
@@ -1,11 +1,13 @@
1
- import { CatalogEntityType as e, DeploymentIcon as t, SELECT_LIST_MAX_HEIGHT_CLASS_NAME as n, SELECT_LIST_MAX_HEIGHT_PX as r, buildCssVars as i, buildPromptParamDefaults as a, mergeClasses as o } from "@epam/ai-dial-chat-shared";
2
- import { DIAL_ICON_SIZE as s, DIAL_KIT_ICON_STROKE as c, GhostButton as l, GhostIconButton as u, InteractiveTooltip as d, MenuItem as f, NeutralButton as p, Popup as m, PopupSize as h, PrimaryButton as g, Textarea as _, ToggleIconButton as v } from "@epam/ai-dial-ui-kit";
3
- import { IconChevronLeft as y, IconStarFilled as b } from "@tabler/icons-react";
4
- import { useEffect as x, useId as S, useLayoutEffect as C, useRef as w, useState as T } from "react";
5
- import { jsx as E, jsxs as D } from "react/jsx-runtime";
6
- import { AppIdentity as O, ContentTab as k, DeploymentSize as A } from "@epam/ai-dial-catalog";
7
- //#region src/constants/public-class-names.ts
8
- var j = { favoritesPanel: "dial-prompts-favorites-panel" }, M = {
1
+ import { Suspense as e, lazy as t, useCallback as n, useEffect as r, useLayoutEffect as i, useMemo as a, useRef as o, useState as s } from "react";
2
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
3
+ import { DeploymentIcon as u, SELECT_LIST_MAX_HEIGHT_CLASS_NAME as d, SELECT_LIST_MAX_HEIGHT_PX as f, buildCssVars as p, extractPromptParams as m, mergeClasses as h, resolvePromptParams as g } from "@epam/ai-dial-chat-shared";
4
+ import { DIAL_ICON_SIZE as _, GhostButton as v, InteractiveTooltip as y, MenuItem as b, ToggleIconButton as x } from "@epam/ai-dial-ui-kit";
5
+ import { IconStarFilled as S } from "@tabler/icons-react";
6
+ //#region src/components/PromptParametersPopup/LazyPromptParametersPopup.tsx
7
+ var C = t(async () => ({ default: (await import("./parameters-popup.js")).PromptParametersPopup })), w = (t) => t.open ? /* @__PURE__ */ c(e, {
8
+ fallback: null,
9
+ children: /* @__PURE__ */ c(C, { ...t })
10
+ }) : null, T = { favoritesPanel: "dial-prompts-favorites-panel" }, E = {
9
11
  header: "_header_1pyx6_3",
10
12
  emptyHint: "_emptyHint_1pyx6_7",
11
13
  star: "_star_1pyx6_11",
@@ -15,75 +17,75 @@ var j = { favoritesPanel: "dial-prompts-favorites-panel" }, M = {
15
17
  rowLeaving: "_rowLeaving_1pyx6_27",
16
18
  rowFadeOut: "_rowFadeOut_1pyx6_1",
17
19
  listContent: "_listContent_1pyx6_55"
18
- }, N = "px-3 pb-0.5 pt-2", P = 180, F = ({ favorites: e, onSelect: a, onToggleFavorite: c, onBrowse: u, labels: p = {}, colors: m, nameClassName: h = "dial-small-text", headerClassName: g = "dial-tiny-lead-semi-text", emptyHintClassName: _ = "dial-small-text" }) => {
19
- let { myCollectionLabel: y = "My Collection", emptyHintLabel: S = "Star a prompt to pin it here", browseLabel: O = "Browse", removeFromFavoritesLabel: k = "Remove from favorites" } = p, A = i({
20
- "--fp-header-text": m?.headerText,
21
- "--fp-empty-hint-text": m?.emptyHintText,
22
- "--fp-star-color": m?.starColor,
23
- "--fp-footer-border": m?.footerBorder
24
- }), [F, I] = T(/* @__PURE__ */ new Set()), L = w(/* @__PURE__ */ new Map());
25
- x(() => {
20
+ }, D = "px-3 pb-0.5 pt-2", O = 180, k = ({ favorites: e, onSelect: t, onToggleFavorite: n, onBrowse: a, labels: m = {}, colors: g, nameClassName: C = "dial-small-text", headerClassName: w = "dial-tiny-lead-semi-text", emptyHintClassName: k = "dial-small-text" }) => {
21
+ let { myCollectionLabel: A = "My Collection", emptyHintLabel: j = "Star a prompt to pin it here", browseLabel: M = "Browse", removeFromFavoritesLabel: N = "Remove from favorites" } = m, P = p({
22
+ "--fp-header-text": g?.headerText,
23
+ "--fp-empty-hint-text": g?.emptyHintText,
24
+ "--fp-star-color": g?.starColor,
25
+ "--fp-footer-border": g?.footerBorder
26
+ }), [F, I] = s(/* @__PURE__ */ new Set()), L = o(/* @__PURE__ */ new Map());
27
+ r(() => {
26
28
  let e = L.current;
27
29
  return () => {
28
30
  e.forEach((e) => clearTimeout(e)), e.clear();
29
31
  };
30
32
  }, []);
31
- let R = w(null), [z, B] = T();
32
- C(() => {
33
- R.current && B(Math.min(R.current.scrollHeight, r));
33
+ let R = o(null), [z, B] = s();
34
+ i(() => {
35
+ R.current && B(Math.min(R.current.scrollHeight, f));
34
36
  }, [e]);
35
37
  let V = (e) => {
36
38
  I((t) => new Set(t).add(e));
37
39
  let t = setTimeout(() => {
38
- c(e), I((t) => {
40
+ n(e), I((t) => {
39
41
  let n = new Set(t);
40
42
  return n.delete(e), n;
41
43
  }), L.current.delete(e);
42
- }, P);
44
+ }, O);
43
45
  L.current.set(e, t);
44
46
  };
45
- return /* @__PURE__ */ D("div", {
46
- className: o("flex min-w-[240px] flex-col", j.favoritesPanel),
47
- style: A,
47
+ return /* @__PURE__ */ l("div", {
48
+ className: h("flex min-w-[240px] flex-col", T.favoritesPanel),
49
+ style: P,
48
50
  children: [
49
- /* @__PURE__ */ E("p", {
50
- className: o(g, N, M.header),
51
- children: y
51
+ /* @__PURE__ */ c("p", {
52
+ className: h(w, D, E.header),
53
+ children: A
52
54
  }),
53
- /* @__PURE__ */ E("div", {
54
- className: o(n, "min-h-0 flex-1 overflow-y-auto", M.listContent),
55
+ /* @__PURE__ */ c("div", {
56
+ className: h(d, "min-h-0 flex-1 overflow-y-auto", E.listContent),
55
57
  style: { maxHeight: z },
56
- children: /* @__PURE__ */ E("div", {
58
+ children: /* @__PURE__ */ c("div", {
57
59
  ref: R,
58
- children: e.length > 0 ? /* @__PURE__ */ E("ul", {
60
+ children: e.length > 0 ? /* @__PURE__ */ c("ul", {
59
61
  className: "flex flex-col gap-1 px-1 pb-1",
60
62
  children: e.map((e) => {
61
- let n = /* @__PURE__ */ E(f, {
63
+ let n = /* @__PURE__ */ c(b, {
62
64
  className: "h-auto py-1.5",
63
- icon: /* @__PURE__ */ E(t, {
64
- size: s.MD,
65
+ icon: /* @__PURE__ */ c(u, {
66
+ size: _.MD,
65
67
  initialsName: e.name
66
68
  }),
67
69
  label: e.name,
68
- labelClassName: h,
69
- onClick: () => a(e),
70
- rightControl: /* @__PURE__ */ E(v, {
71
- icon: /* @__PURE__ */ E(b, {
72
- size: s.SM,
73
- className: M.star,
70
+ labelClassName: C,
71
+ onClick: () => t(e),
72
+ rightControl: /* @__PURE__ */ c(x, {
73
+ icon: /* @__PURE__ */ c(S, {
74
+ size: _.SM,
75
+ className: E.star,
74
76
  "aria-hidden": !0
75
77
  }),
76
- "aria-label": k,
78
+ "aria-label": N,
77
79
  isSelected: !0,
78
80
  onClick: () => V(e.id)
79
81
  })
80
82
  }), r = e.description != null && e.description !== "";
81
- return /* @__PURE__ */ E("li", {
82
- className: F.has(e.id) ? M.rowLeaving : M.rowEnter,
83
- children: r ? /* @__PURE__ */ E(d, {
83
+ return /* @__PURE__ */ c("li", {
84
+ className: F.has(e.id) ? E.rowLeaving : E.rowEnter,
85
+ children: r ? /* @__PURE__ */ c(y, {
84
86
  asChild: !0,
85
87
  contentClassName: "max-w-[550px]",
86
- content: /* @__PURE__ */ E("p", {
88
+ content: /* @__PURE__ */ c("p", {
87
89
  className: "text-start",
88
90
  children: e.description
89
91
  }),
@@ -91,112 +93,79 @@ var j = { favoritesPanel: "dial-prompts-favorites-panel" }, M = {
91
93
  }) : n
92
94
  }, e.id);
93
95
  })
94
- }) : /* @__PURE__ */ E("p", {
95
- className: o(_, "px-4 py-4 text-start", M.emptyHint),
96
- children: S
96
+ }) : /* @__PURE__ */ c("p", {
97
+ className: h(k, "px-4 py-4 text-start", E.emptyHint),
98
+ children: j
97
99
  })
98
100
  })
99
101
  }),
100
- /* @__PURE__ */ E("div", {
101
- className: o("border-t px-2 py-3", M.footer),
102
- children: /* @__PURE__ */ E(l, {
103
- label: O,
102
+ /* @__PURE__ */ c("div", {
103
+ className: h("border-t px-2 py-3", E.footer),
104
+ children: /* @__PURE__ */ c(v, {
105
+ label: M,
104
106
  className: "w-full justify-center",
105
- onClick: u
107
+ onClick: a
106
108
  })
107
109
  })
108
110
  ]
109
111
  });
110
- }, I = { card: "_card_p8vwa_1" }, L = ({ open: t, promptName: n, content: r, description: s, parameters: l, onBack: d, onClose: f, onSubmit: v, onCancel: b, labels: x = {}, colors: C, titleClassName: w = "dial-h2-text", parametersLabelClassName: j = "dial-h2-text", detailsLabelClassName: M = "dial-h2-text" }) => {
111
- let { title: N = "Prompt parameters", closeLabel: P = "Close", backLabel: F = "Back", parametersLabel: L = "Parameters", detailsLabel: R = "Details", enterValuePlaceholder: z = "Enter value", cancelLabel: B = "Cancel", submitLabel: V = "Confirm" } = x, H = l.map(({ name: e, defaultValue: t }) => `${e}\u0000${t ?? ""}`).join(""), [U, W] = T(() => a(l)), [G, K] = T(H);
112
- G !== H && (K(H), W(a(l)));
113
- let q = S(), J = i({
114
- "--pp-card-bg": C?.cardBackground,
115
- "--pp-card-border": C?.cardBorder
116
- }), Y = l.some(({ name: e }) => !U[e]?.trim());
117
- return /* @__PURE__ */ E(m, {
118
- open: t,
119
- header: /* @__PURE__ */ D("div", {
120
- className: "flex items-center gap-2",
121
- children: [d != null && /* @__PURE__ */ E(u, {
122
- icon: /* @__PURE__ */ E(y, {
123
- className: "rtl:scale-x-[-1]",
124
- "aria-hidden": !0,
125
- stroke: c
126
- }),
127
- "aria-label": F,
128
- onClick: d
129
- }), /* @__PURE__ */ E("span", {
130
- className: w,
131
- children: N
132
- })]
133
- }),
134
- ariaLabel: N,
135
- size: h.Lg,
136
- closeAriaLabel: P,
137
- onClose: f,
138
- footer: /* @__PURE__ */ D("div", {
139
- className: "flex justify-end gap-2 px-6 py-4",
140
- children: [/* @__PURE__ */ E(p, {
141
- label: B,
142
- onClick: b
143
- }), /* @__PURE__ */ E(g, {
144
- label: V,
145
- disabled: Y,
146
- onClick: () => {
147
- Y || v(U);
148
- }
149
- })]
150
- }),
151
- children: /* @__PURE__ */ D("div", {
152
- className: "flex flex-col gap-4 px-6 pb-4 pt-2",
153
- children: [/* @__PURE__ */ E("div", {
154
- className: o("flex h-[72px] w-full items-center rounded-lg border px-3", I.card),
155
- style: J,
156
- children: /* @__PURE__ */ E(O, {
157
- type: e.Prompt,
158
- name: n,
159
- size: A.LG,
160
- className: "w-full"
161
- })
162
- }), /* @__PURE__ */ D("div", {
163
- className: "grid grid-cols-2 gap-4",
164
- children: [/* @__PURE__ */ D("div", {
165
- className: "flex flex-col gap-3",
166
- children: [/* @__PURE__ */ E("h2", {
167
- className: o(j, "m-0"),
168
- children: L
169
- }), l.map(({ name: e }) => {
170
- let t = `${q}-${e}`;
171
- return /* @__PURE__ */ E(_, {
172
- id: t,
173
- "aria-label": e,
174
- value: U[e] ?? "",
175
- labelProps: {
176
- htmlFor: t,
177
- label: e,
178
- required: !0
179
- },
180
- placeholder: z,
181
- onChange: (t) => W((n) => ({
182
- ...n,
183
- [e]: t
184
- }))
185
- }, e);
186
- })]
187
- }), /* @__PURE__ */ D("div", {
188
- className: "flex min-h-0 flex-col gap-3",
189
- children: [/* @__PURE__ */ E("h2", {
190
- className: o(M, "m-0"),
191
- children: R
192
- }), /* @__PURE__ */ E(k, {
193
- content: r,
194
- description: s
195
- })]
196
- })]
197
- })]
198
- })
112
+ }, A = ({ isEnabled: e, prompts: t, favoriteIds: r, onToggleFavorite: i, onInsertText: o, labels: l, renderCatalog: u }) => {
113
+ let { panelLabels: d, parametersLabels: f } = l ?? {}, [p, h] = s(!1), [_, v] = s(null), [y, b] = s(!1), x = a(() => t.filter((e) => r.has(e.id)), [t, r]), S = n((e, t) => {
114
+ if (m(e.content).length === 0) {
115
+ o(e.content), h(!1);
116
+ return;
117
+ }
118
+ v(e), b(t);
119
+ }, [o]), C = n((e) => /* @__PURE__ */ c(k, {
120
+ favorites: x,
121
+ onSelect: (t) => {
122
+ S(t, !1), e();
123
+ },
124
+ onToggleFavorite: i,
125
+ onBrowse: () => {
126
+ e(), h(!0);
127
+ },
128
+ labels: d
129
+ }), [
130
+ x,
131
+ S,
132
+ i,
133
+ d
134
+ ]), T = u({
135
+ isOpen: p,
136
+ onSelect: (e) => S(e, !0),
137
+ onClose: () => h(!1)
138
+ }), E = n((e) => {
139
+ b(!1), v(e);
140
+ }, []), D = n(() => {
141
+ v(null);
142
+ }, []), O = n(() => {
143
+ v(null), h(!0);
144
+ }, []), A = n((e) => {
145
+ _ && o(g(_.content, e)), v(null), h(!1);
146
+ }, [_, o]), j = a(() => _ == null ? [] : m(_.content), [_]), M = _ != null && /* @__PURE__ */ c(w, {
147
+ open: !0,
148
+ promptName: _.name,
149
+ content: _.content,
150
+ description: _.description,
151
+ parameters: j,
152
+ onBack: y ? O : void 0,
153
+ onClose: D,
154
+ onCancel: D,
155
+ onSubmit: A,
156
+ labels: f
199
157
  });
158
+ return e ? {
159
+ renderOverlay: C,
160
+ promptCatalogModal: T,
161
+ parametersPopup: M,
162
+ openParametersPopup: E
163
+ } : {
164
+ renderOverlay: void 0,
165
+ promptCatalogModal: null,
166
+ parametersPopup: null,
167
+ openParametersPopup: () => void 0
168
+ };
200
169
  };
201
170
  //#endregion
202
- export { F as FavoritePromptsPanel, j as PROMPTS_CLASS, L as PromptParametersPopup };
171
+ export { k as FavoritePromptsPanel, T as PROMPTS_CLASS, w as PromptParametersPopup, A as usePromptSelectorOverlay };
@@ -1,4 +1,4 @@
1
- import { PromptParameter } from '../../../chat-shared/src/index.ts';
1
+ import { PromptParameter } from '@epam/ai-dial-chat-shared';
2
2
  /** Localizable string labels for the prompt-parameters popup component. */
3
3
  export interface PromptParametersPopupLabels {
4
4
  /** Dialog title. Defaults to `'Prompt parameters'`. */
@@ -0,0 +1,57 @@
1
+ import { ReactNode } from 'react';
2
+ import { FavoritePromptItem } from './favorite-prompt-item';
3
+ import { FavoritePromptsPanelLabels } from './favorite-prompts-panel-props';
4
+ import { PromptParametersPopupLabels } from './prompt-parameters-popup-props';
5
+ /** Labels forwarded to the favorites panel and the parameters popup rendered by {@link UsePromptSelectorOverlayResult}. */
6
+ export interface UsePromptSelectorOverlayLabels {
7
+ /** Forwarded to the favorites panel's `labels`. */
8
+ panelLabels?: FavoritePromptsPanelLabels;
9
+ /** Forwarded to the parameters popup's `labels`. */
10
+ parametersLabels?: PromptParametersPopupLabels;
11
+ }
12
+ /** Props the host's browse-modal renderer receives from {@link usePromptSelectorOverlay}. */
13
+ export interface RenderPromptCatalogProps {
14
+ /** Whether the browse modal should be open. */
15
+ isOpen: boolean;
16
+ /** Called with the selected prompt's structural data. */
17
+ onSelect: (item: FavoritePromptItem) => void;
18
+ /** Called when the browse modal is dismissed. */
19
+ onClose: () => void;
20
+ }
21
+ /** Options accepted by {@link usePromptSelectorOverlay}. */
22
+ export interface UsePromptSelectorOverlayOptions {
23
+ /** Resolved host policy gating the whole workflow (e.g. an overlay feature flag). */
24
+ isEnabled: boolean;
25
+ /** Structural prompt listing the host has already merged from its own sources. */
26
+ prompts: FavoritePromptItem[];
27
+ /** Ids of the user's favorited prompts. */
28
+ favoriteIds: ReadonlySet<string>;
29
+ /** Called with a prompt's id to remove it from favorites. */
30
+ onToggleFavorite: (id: string) => void;
31
+ /** Called with the resolved prompt text (parameters already substituted, if any). */
32
+ onInsertText: (text: string) => void;
33
+ /** Labels forwarded to the rendered favorites panel and parameters popup. */
34
+ labels?: UsePromptSelectorOverlayLabels;
35
+ /** Renders the host's own lazy-loaded browse-modal content. */
36
+ renderCatalog: (props: RenderPromptCatalogProps) => ReactNode;
37
+ }
38
+ /** Result returned by {@link usePromptSelectorOverlay}. */
39
+ export interface UsePromptSelectorOverlayResult {
40
+ /**
41
+ * Pass as the Add-menu Prompts entry's `renderOverlay`. `undefined` while disabled: the host
42
+ * omits the entry entirely when this is `undefined`, so a stub renderer would leave the row in
43
+ * place with nothing behind it.
44
+ */
45
+ renderOverlay: ((onClose: () => void) => ReactNode) | undefined;
46
+ /** Render this element at a stable level outside the Add-menu popover. */
47
+ promptCatalogModal: ReactNode;
48
+ /** Render this element at a stable level outside the Add-menu popover. */
49
+ parametersPopup: ReactNode;
50
+ /**
51
+ * Opens the parameters popup directly for a prompt that already came from outside the
52
+ * Add-menu flow (e.g. a route-level "Use in chat" action). No back action is offered — there
53
+ * is no browse modal to return to. A no-op while disabled.
54
+ */
55
+ openParametersPopup: (prompt: FavoritePromptItem) => void;
56
+ }
57
+ //# sourceMappingURL=prompt-selector-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-selector-overlay.d.ts","sourceRoot":"","sources":["../../src/models/prompt-selector-overlay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAEnF,2HAA2H;AAC3H,MAAM,WAAW,8BAA8B;IAC7C,mDAAmD;IACnD,WAAW,CAAC,EAAE,0BAA0B,CAAC;IACzC,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,2BAA2B,CAAC;CAChD;AAED,6FAA6F;AAC7F,MAAM,WAAW,wBAAwB;IACvC,+CAA+C;IAC/C,MAAM,EAAE,OAAO,CAAC;IAChB,yDAAyD;IACzD,QAAQ,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7C,iDAAiD;IACjD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,4DAA4D;AAC5D,MAAM,WAAW,+BAA+B;IAC9C,qFAAqF;IACrF,SAAS,EAAE,OAAO,CAAC;IACnB,kFAAkF;IAClF,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,2CAA2C;IAC3C,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,6DAA6D;IAC7D,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,qFAAqF;IACrF,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,6EAA6E;IAC7E,MAAM,CAAC,EAAE,8BAA8B,CAAC;IACxC,+DAA+D;IAC/D,aAAa,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,SAAS,CAAC;CAC/D;AAED,2DAA2D;AAC3D,MAAM,WAAW,8BAA8B;IAC7C;;;;OAIG;IACH,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IAChE,0EAA0E;IAC1E,kBAAkB,EAAE,SAAS,CAAC;IAC9B,0EAA0E;IAC1E,eAAe,EAAE,SAAS,CAAC;IAC3B;;;;OAIG;IACH,mBAAmB,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC3D"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@epam/ai-dial-prompts",
3
3
  "description": "Host-agnostic UI for picking a favorite prompt and resolving its {{parameter}} placeholders before it is inserted into a chat message",
4
- "version": "1.2.0-dev.75",
4
+ "version": "1.2.0-dev.78",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "main": "./index.js",
@@ -14,14 +14,19 @@
14
14
  "types": "./index.d.ts",
15
15
  "import": "./index.js",
16
16
  "default": "./index.js"
17
+ },
18
+ "./parameters-popup": {
19
+ "types": "./entry-points/parameters-popup.d.ts",
20
+ "import": "./parameters-popup.js",
21
+ "default": "./parameters-popup.js"
17
22
  }
18
23
  },
19
24
  "dependencies": {
20
25
  "@tabler/icons-react": "^3.44.0",
21
- "@epam/ai-dial-catalog": "1.2.0-dev.75"
26
+ "@epam/ai-dial-catalog": "1.2.0-dev.78"
22
27
  },
23
28
  "peerDependencies": {
24
- "@epam/ai-dial-chat-shared": "1.2.0-dev.75",
29
+ "@epam/ai-dial-chat-shared": "1.2.0-dev.78",
25
30
  "@epam/ai-dial-ui-kit": "^0.15.0-dev.9",
26
31
  "react": "^19.2.8"
27
32
  },
@@ -0,0 +1,99 @@
1
+ import { useId as e, useState as t } from "react";
2
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
3
+ import { CatalogEntityType as i, buildCssVars as a, buildPromptParamDefaults as o, mergeClasses as s } from "@epam/ai-dial-chat-shared";
4
+ import { DIAL_KIT_ICON_STROKE as c, GhostIconButton as l, NeutralButton as u, Popup as d, PopupSize as f, PrimaryButton as p, Textarea as m } from "@epam/ai-dial-ui-kit";
5
+ import { IconChevronLeft as h } from "@tabler/icons-react";
6
+ import { AppIdentity as g, ContentTab as _, DeploymentSize as v } from "@epam/ai-dial-catalog";
7
+ var y = { card: "_card_p8vwa_1" }, b = ({ open: b, promptName: x, content: S, description: C, parameters: w, onBack: T, onClose: E, onSubmit: D, onCancel: O, labels: k = {}, colors: A, titleClassName: j = "dial-h2-text", parametersLabelClassName: M = "dial-h2-text", detailsLabelClassName: N = "dial-h2-text" }) => {
8
+ let { title: P = "Prompt parameters", closeLabel: F = "Close", backLabel: I = "Back", parametersLabel: L = "Parameters", detailsLabel: R = "Details", enterValuePlaceholder: z = "Enter value", cancelLabel: B = "Cancel", submitLabel: V = "Confirm" } = k, H = w.map(({ name: e, defaultValue: t }) => `${e}\u0000${t ?? ""}`).join(""), [U, W] = t(() => o(w)), [G, K] = t(H);
9
+ G !== H && (K(H), W(o(w)));
10
+ let q = e(), J = a({
11
+ "--pp-card-bg": A?.cardBackground,
12
+ "--pp-card-border": A?.cardBorder
13
+ }), Y = w.some(({ name: e }) => !U[e]?.trim());
14
+ return /* @__PURE__ */ n(d, {
15
+ open: b,
16
+ header: /* @__PURE__ */ r("div", {
17
+ className: "flex items-center gap-2",
18
+ children: [T != null && /* @__PURE__ */ n(l, {
19
+ icon: /* @__PURE__ */ n(h, {
20
+ className: "rtl:scale-x-[-1]",
21
+ "aria-hidden": !0,
22
+ stroke: c
23
+ }),
24
+ "aria-label": I,
25
+ onClick: T
26
+ }), /* @__PURE__ */ n("span", {
27
+ className: j,
28
+ children: P
29
+ })]
30
+ }),
31
+ ariaLabel: P,
32
+ size: f.Lg,
33
+ closeAriaLabel: F,
34
+ onClose: E,
35
+ footer: /* @__PURE__ */ r("div", {
36
+ className: "flex justify-end gap-2 px-6 py-4",
37
+ children: [/* @__PURE__ */ n(u, {
38
+ label: B,
39
+ onClick: O
40
+ }), /* @__PURE__ */ n(p, {
41
+ label: V,
42
+ disabled: Y,
43
+ onClick: () => {
44
+ Y || D(U);
45
+ }
46
+ })]
47
+ }),
48
+ children: /* @__PURE__ */ r("div", {
49
+ className: "flex flex-col gap-4 px-6 pb-4 pt-2",
50
+ children: [/* @__PURE__ */ n("div", {
51
+ className: s("flex h-[72px] w-full items-center rounded-lg border px-3", y.card),
52
+ style: J,
53
+ children: /* @__PURE__ */ n(g, {
54
+ type: i.Prompt,
55
+ name: x,
56
+ size: v.LG,
57
+ className: "w-full"
58
+ })
59
+ }), /* @__PURE__ */ r("div", {
60
+ className: "grid grid-cols-2 gap-4",
61
+ children: [/* @__PURE__ */ r("div", {
62
+ className: "flex flex-col gap-3",
63
+ children: [/* @__PURE__ */ n("h2", {
64
+ className: s(M, "m-0"),
65
+ children: L
66
+ }), w.map(({ name: e }) => {
67
+ let t = `${q}-${e}`;
68
+ return /* @__PURE__ */ n(m, {
69
+ id: t,
70
+ "aria-label": e,
71
+ value: U[e] ?? "",
72
+ labelProps: {
73
+ htmlFor: t,
74
+ label: e,
75
+ required: !0
76
+ },
77
+ placeholder: z,
78
+ onChange: (t) => W((n) => ({
79
+ ...n,
80
+ [e]: t
81
+ }))
82
+ }, e);
83
+ })]
84
+ }), /* @__PURE__ */ r("div", {
85
+ className: "flex min-h-0 flex-col gap-3",
86
+ children: [/* @__PURE__ */ n("h2", {
87
+ className: s(N, "m-0"),
88
+ children: R
89
+ }), /* @__PURE__ */ n(_, {
90
+ content: S,
91
+ description: C
92
+ })]
93
+ })]
94
+ })]
95
+ })
96
+ });
97
+ };
98
+ //#endregion
99
+ export { b as PromptParametersPopup };