@mastra/playground-ui 53.0.0-alpha.8 → 53.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/dist/{code-DRGJVroV.js → code-D4Vw_fYq.js} +22 -16
  2. package/dist/code-D4Vw_fYq.js.map +1 -0
  3. package/dist/{code-BJMC6T9D.cjs → code-DhrdtZce.cjs} +22 -15
  4. package/dist/code-DhrdtZce.cjs.map +1 -0
  5. package/dist/{code-block-CBJhDEeB.js → code-block-DeksY23p.js} +2 -2
  6. package/dist/{code-block-CBJhDEeB.js.map → code-block-DeksY23p.js.map} +1 -1
  7. package/dist/{code-block-fmv8bHoT.cjs → code-block-DgHrBuR8.cjs} +2 -2
  8. package/dist/{code-block-fmv8bHoT.cjs.map → code-block-DgHrBuR8.cjs.map} +1 -1
  9. package/dist/{code-diff-C-EHXZyK.cjs → code-diff-CHZ3P1ky.cjs} +51 -43
  10. package/dist/code-diff-CHZ3P1ky.cjs.map +1 -0
  11. package/dist/{code-diff-BB4sqHpq.js → code-diff-CIRbnIfl.js} +52 -44
  12. package/dist/code-diff-CIRbnIfl.js.map +1 -0
  13. package/dist/{combobox-BQrlN0eB.cjs → combobox-JNWmgC13.cjs} +8 -3
  14. package/dist/combobox-JNWmgC13.cjs.map +1 -0
  15. package/dist/{combobox-DeeAlYti.js → combobox-nxjXzRWu.js} +8 -3
  16. package/dist/combobox-nxjXzRWu.js.map +1 -0
  17. package/dist/{command-DWFd0d4c.js → command-Be-KrIAX.js} +2 -2
  18. package/dist/{command-DWFd0d4c.js.map → command-Be-KrIAX.js.map} +1 -1
  19. package/dist/{command-CUev1UxH.cjs → command-DsTBCmQq.cjs} +2 -2
  20. package/dist/{command-CUev1UxH.cjs.map → command-DsTBCmQq.cjs.map} +1 -1
  21. package/dist/components/ChatShell.cjs.js +20 -1
  22. package/dist/components/ChatShell.cjs.js.map +1 -1
  23. package/dist/components/ChatShell.es.js +20 -1
  24. package/dist/components/ChatShell.es.js.map +1 -1
  25. package/dist/components/Code.cjs.js +3 -1
  26. package/dist/components/Code.cjs.js.map +1 -1
  27. package/dist/components/Code.es.js +1 -1
  28. package/dist/components/CodeBlock.cjs.js +1 -1
  29. package/dist/components/CodeBlock.es.js +1 -1
  30. package/dist/components/CodeDiff.cjs.js +1 -1
  31. package/dist/components/CodeDiff.es.js +1 -1
  32. package/dist/components/CodeEditor.cjs.js +2 -1
  33. package/dist/components/CodeEditor.cjs.js.map +1 -1
  34. package/dist/components/CodeEditor.es.js +1 -1
  35. package/dist/components/Combobox.cjs.js +1 -1
  36. package/dist/components/Combobox.es.js +1 -1
  37. package/dist/components/Command.cjs.js +1 -1
  38. package/dist/components/Command.es.js +1 -1
  39. package/dist/components/CommandPalette.cjs.js +1 -1
  40. package/dist/components/CommandPalette.es.js +1 -1
  41. package/dist/components/Comment.cjs.js +2 -2
  42. package/dist/components/Comment.cjs.js.map +1 -1
  43. package/dist/components/Comment.es.js +2 -2
  44. package/dist/components/Comment.es.js.map +1 -1
  45. package/dist/components/DataCodeSection.cjs.js +1 -1
  46. package/dist/components/DataCodeSection.es.js +1 -1
  47. package/dist/components/DataPanel.cjs.js +1 -1
  48. package/dist/components/DataPanel.es.js +1 -1
  49. package/dist/components/Dialog.cjs.js +181 -2
  50. package/dist/components/Dialog.cjs.js.map +1 -1
  51. package/dist/components/Dialog.es.js +183 -1
  52. package/dist/components/Dialog.es.js.map +1 -1
  53. package/dist/components/HorizontalBars.cjs.js +1 -1
  54. package/dist/components/HorizontalBars.es.js +1 -1
  55. package/dist/components/IntegrationDialog.cjs.js +105 -0
  56. package/dist/components/IntegrationDialog.cjs.js.map +1 -0
  57. package/dist/components/IntegrationDialog.d.ts +2 -0
  58. package/dist/components/IntegrationDialog.es.js +101 -0
  59. package/dist/components/IntegrationDialog.es.js.map +1 -0
  60. package/dist/components/LogsDataList.cjs.js +0 -1
  61. package/dist/components/LogsDataList.cjs.js.map +1 -1
  62. package/dist/components/LogsDataList.es.js +0 -1
  63. package/dist/components/LogsDataList.es.js.map +1 -1
  64. package/dist/components/MainHeader.cjs.js +1 -1
  65. package/dist/components/MainHeader.cjs.js.map +1 -1
  66. package/dist/components/MainHeader.es.js +1 -1
  67. package/dist/components/MainHeader.es.js.map +1 -1
  68. package/dist/components/MarkdownRenderer.cjs.js +1 -1
  69. package/dist/components/MarkdownRenderer.es.js +1 -1
  70. package/dist/components/PropertyFilter.cjs.js +1 -1
  71. package/dist/components/PropertyFilter.es.js +1 -1
  72. package/dist/components/ThreadRail.cjs.js +19 -0
  73. package/dist/components/ThreadRail.cjs.js.map +1 -1
  74. package/dist/components/ThreadRail.es.js +19 -1
  75. package/dist/components/ThreadRail.es.js.map +1 -1
  76. package/dist/components/ai/plan.cjs.js +1 -1
  77. package/dist/components/ai/plan.es.js +1 -1
  78. package/dist/components/ai/tool-call.cjs.js +165 -0
  79. package/dist/components/ai/tool-call.cjs.js.map +1 -1
  80. package/dist/components/ai/tool-call.es.js +159 -3
  81. package/dist/components/ai/tool-call.es.js.map +1 -1
  82. package/dist/{data-code-section-Dn9smaz4.cjs → data-code-section-B_lg_J_0.cjs} +34 -5
  83. package/dist/data-code-section-B_lg_J_0.cjs.map +1 -0
  84. package/dist/{data-code-section-DN2yPgEz.js → data-code-section-Cm_W_XhO.js} +36 -7
  85. package/dist/data-code-section-Cm_W_XhO.js.map +1 -0
  86. package/dist/{data-panel-DEatwExN.cjs → data-panel-Cv9j_IGQ.cjs} +2 -2
  87. package/dist/{data-panel-DEatwExN.cjs.map → data-panel-Cv9j_IGQ.cjs.map} +1 -1
  88. package/dist/{data-panel-2Da0Utgy.js → data-panel-DXxeSnL1.js} +2 -2
  89. package/dist/{data-panel-2Da0Utgy.js.map → data-panel-DXxeSnL1.js.map} +1 -1
  90. package/dist/dialog-CZMPDVUj.js +259 -0
  91. package/dist/dialog-CZMPDVUj.js.map +1 -0
  92. package/dist/dialog-D-7Hkb3j.cjs +293 -0
  93. package/dist/dialog-D-7Hkb3j.cjs.map +1 -0
  94. package/dist/domains/memory/components/observation-detail-view.cjs.js +1 -1
  95. package/dist/domains/memory/components/observation-detail-view.es.js +1 -1
  96. package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +1 -1
  97. package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +1 -1
  98. package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +1 -1
  99. package/dist/domains/metrics/components/traces-volume-card-view.es.js +1 -1
  100. package/dist/domains/traces/components/span-data-panel-view.cjs.js +61 -105
  101. package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
  102. package/dist/domains/traces/components/span-data-panel-view.es.js +62 -106
  103. package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
  104. package/dist/domains/traces/components/span-summary-description.cjs.js +62 -0
  105. package/dist/domains/traces/components/span-summary-description.cjs.js.map +1 -0
  106. package/dist/domains/traces/components/span-summary-description.d.ts +2 -0
  107. package/dist/domains/traces/components/span-summary-description.es.js +58 -0
  108. package/dist/domains/traces/components/span-summary-description.es.js.map +1 -0
  109. package/dist/domains/traces/components/timeline-expand-col.cjs.js +1 -1
  110. package/dist/domains/traces/components/timeline-expand-col.cjs.js.map +1 -1
  111. package/dist/domains/traces/components/timeline-expand-col.es.js +1 -1
  112. package/dist/domains/traces/components/timeline-expand-col.es.js.map +1 -1
  113. package/dist/domains/traces/components/timeline-name-col.cjs.js +1 -1
  114. package/dist/domains/traces/components/timeline-name-col.cjs.js.map +1 -1
  115. package/dist/domains/traces/components/timeline-name-col.es.js +1 -1
  116. package/dist/domains/traces/components/timeline-name-col.es.js.map +1 -1
  117. package/dist/domains/traces/components/timeline-timing-col.cjs.js +1 -1
  118. package/dist/domains/traces/components/timeline-timing-col.cjs.js.map +1 -1
  119. package/dist/domains/traces/components/timeline-timing-col.es.js +1 -1
  120. package/dist/domains/traces/components/timeline-timing-col.es.js.map +1 -1
  121. package/dist/domains/traces/components/trace-columns-menu.cjs.js +1 -1
  122. package/dist/domains/traces/components/trace-columns-menu.es.js +1 -1
  123. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +2 -2
  124. package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
  125. package/dist/domains/traces/components/trace-data-panel-view.es.js +2 -2
  126. package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
  127. package/dist/domains/traces/components/traces-toolbar.cjs.js +1 -5
  128. package/dist/domains/traces/components/traces-toolbar.cjs.js.map +1 -1
  129. package/dist/domains/traces/components/traces-toolbar.es.js +1 -5
  130. package/dist/domains/traces/components/traces-toolbar.es.js.map +1 -1
  131. package/dist/domains/traces/hooks/use-branch.cjs.js +2 -6
  132. package/dist/domains/traces/hooks/use-branch.cjs.js.map +1 -1
  133. package/dist/domains/traces/hooks/use-branch.es.js +2 -6
  134. package/dist/domains/traces/hooks/use-branch.es.js.map +1 -1
  135. package/dist/domains/traces/hooks/use-download-trace-json.cjs.js +4 -1
  136. package/dist/domains/traces/hooks/use-download-trace-json.cjs.js.map +1 -1
  137. package/dist/domains/traces/hooks/use-download-trace-json.es.js +4 -1
  138. package/dist/domains/traces/hooks/use-download-trace-json.es.js.map +1 -1
  139. package/dist/domains/traces/hooks/use-trace-filter-persistence.cjs.js +11 -18
  140. package/dist/domains/traces/hooks/use-trace-filter-persistence.cjs.js.map +1 -1
  141. package/dist/domains/traces/hooks/use-trace-filter-persistence.es.js +13 -20
  142. package/dist/domains/traces/hooks/use-trace-filter-persistence.es.js.map +1 -1
  143. package/dist/domains/traces/hooks/use-trace-spans.cjs.js +10 -7
  144. package/dist/domains/traces/hooks/use-trace-spans.cjs.js.map +1 -1
  145. package/dist/domains/traces/hooks/use-trace-spans.es.js +10 -7
  146. package/dist/domains/traces/hooks/use-trace-spans.es.js.map +1 -1
  147. package/dist/domains/traces/trace-filters.cjs.js +5 -5
  148. package/dist/domains/traces/trace-filters.cjs.js.map +1 -1
  149. package/dist/domains/traces/trace-filters.es.js +5 -5
  150. package/dist/domains/traces/trace-filters.es.js.map +1 -1
  151. package/dist/domains/traces/utils/span-utils.cjs.js +6 -0
  152. package/dist/domains/traces/utils/span-utils.cjs.js.map +1 -1
  153. package/dist/domains/traces/utils/span-utils.es.js +6 -1
  154. package/dist/domains/traces/utils/span-utils.es.js.map +1 -1
  155. package/dist/ee/signals/components/entity-index-list.cjs.js +0 -1
  156. package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
  157. package/dist/ee/signals/components/entity-index-list.es.js +0 -1
  158. package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
  159. package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +1 -1
  160. package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +1 -1
  161. package/dist/{highlight-CSJjjoqh.js → highlight-BmpoELR4.js} +6 -2
  162. package/dist/{highlight-CSJjjoqh.js.map → highlight-BmpoELR4.js.map} +1 -1
  163. package/dist/{highlight-CEt2vhD8.cjs → highlight-DK1dn-Fh.cjs} +6 -1
  164. package/dist/{highlight-CEt2vhD8.cjs.map → highlight-DK1dn-Fh.cjs.map} +1 -1
  165. package/dist/{horizontal-bars-DZ5J4TKv.js → horizontal-bars-CyP-B-BX.js} +37 -4
  166. package/dist/horizontal-bars-CyP-B-BX.js.map +1 -0
  167. package/dist/{horizontal-bars-CE1O-Y6G.cjs → horizontal-bars-Dgq3PYsg.cjs} +37 -4
  168. package/dist/horizontal-bars-Dgq3PYsg.cjs.map +1 -0
  169. package/dist/{markdown-renderer-DiJBbnYG.js → markdown-renderer-CaFpZTFS.js} +2 -2
  170. package/dist/{markdown-renderer-DiJBbnYG.js.map → markdown-renderer-CaFpZTFS.js.map} +1 -1
  171. package/dist/{markdown-renderer-DGIzNAQY.cjs → markdown-renderer-GVtZLunG.cjs} +2 -2
  172. package/dist/{markdown-renderer-DGIzNAQY.cjs.map → markdown-renderer-GVtZLunG.cjs.map} +1 -1
  173. package/dist/src/domains/traces/components/span-summary-description.d.ts +10 -0
  174. package/dist/src/domains/traces/components/traces-toolbar.d.ts +1 -5
  175. package/dist/src/domains/traces/hooks/index.d.ts +1 -1
  176. package/dist/src/domains/traces/hooks/use-trace-filter-persistence.d.ts +5 -18
  177. package/dist/src/domains/traces/hooks/use-trace-spans.d.ts +3 -1
  178. package/dist/src/domains/traces/trace-filters.d.ts +4 -3
  179. package/dist/src/domains/traces/utils/span-utils.d.ts +2 -0
  180. package/dist/src/ds/components/ChatShell/chat-shell.d.ts +19 -2
  181. package/dist/src/ds/components/ChatShell/index.d.ts +3 -2
  182. package/dist/src/ds/components/Code/index.d.ts +1 -0
  183. package/dist/src/ds/components/Code/use-highlight.d.ts +10 -0
  184. package/dist/src/ds/components/CodeDiff/code-diff.stories.d.ts +2 -0
  185. package/dist/src/ds/components/CodeEditor/highlight.d.ts +1 -0
  186. package/dist/src/ds/components/CodeEditor/index.d.ts +1 -1
  187. package/dist/src/ds/components/Combobox/combobox.d.ts +3 -1
  188. package/dist/src/ds/components/DataCodeSection/data-code-section.d.ts +9 -1
  189. package/dist/src/ds/components/DataCodeSection/index.d.ts +1 -1
  190. package/dist/src/ds/components/Dialog/dialog-action.d.ts +9 -0
  191. package/dist/src/ds/components/Dialog/dialog-context.d.ts +16 -0
  192. package/dist/src/ds/components/Dialog/dialog-new-variant.stories.d.ts +64 -0
  193. package/dist/src/ds/components/Dialog/dialog.d.ts +15 -6
  194. package/dist/src/ds/components/Dialog/index.d.ts +2 -0
  195. package/dist/src/ds/components/HorizontalBars/horizontal-bars.stories.d.ts +2 -0
  196. package/dist/src/ds/components/IntegrationDialog/__fixtures__/integrations-catalog.d.ts +2 -0
  197. package/dist/src/ds/components/IntegrationDialog/index.d.ts +2 -0
  198. package/dist/src/ds/components/IntegrationDialog/integration-dialog.d.ts +28 -0
  199. package/dist/src/ds/components/IntegrationDialog/integration-dialog.stories.d.ts +24 -0
  200. package/dist/src/ds/components/ThreadRail/index.d.ts +1 -0
  201. package/dist/src/ds/components/ThreadRail/turn-groups.d.ts +19 -0
  202. package/dist/src/ds/components/ai/tool-call/ansi.d.ts +2 -0
  203. package/dist/src/ds/components/ai/tool-call/group-consecutive.d.ts +17 -0
  204. package/dist/src/ds/components/ai/tool-call/index.d.ts +4 -0
  205. package/dist/src/ds/components/ai/tool-call/tool-call-edit.d.ts +4 -0
  206. package/dist/src/ds/components/ai/tool-call/tool-call-group.d.ts +14 -0
  207. package/dist/src/ds/components/ai/tool-call/tool-call.d.ts +4 -0
  208. package/dist/src/ds/components/ai/tool-call/tool-presentation.d.ts +10 -0
  209. package/dist/style.css +149 -3
  210. package/package.json +8 -8
  211. package/dist/code-BJMC6T9D.cjs.map +0 -1
  212. package/dist/code-DRGJVroV.js.map +0 -1
  213. package/dist/code-diff-BB4sqHpq.js.map +0 -1
  214. package/dist/code-diff-C-EHXZyK.cjs.map +0 -1
  215. package/dist/combobox-BQrlN0eB.cjs.map +0 -1
  216. package/dist/combobox-DeeAlYti.js.map +0 -1
  217. package/dist/data-code-section-DN2yPgEz.js.map +0 -1
  218. package/dist/data-code-section-Dn9smaz4.cjs.map +0 -1
  219. package/dist/dialog-CESxLg8S.js +0 -76
  220. package/dist/dialog-CESxLg8S.js.map +0 -1
  221. package/dist/dialog-K0q0KOOW.cjs +0 -107
  222. package/dist/dialog-K0q0KOOW.cjs.map +0 -1
  223. package/dist/horizontal-bars-CE1O-Y6G.cjs.map +0 -1
  224. package/dist/horizontal-bars-DZ5J4TKv.js.map +0 -1
@@ -2,12 +2,190 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
- const dialog = require('../dialog-K0q0KOOW.cjs');
6
-
5
+ const dialog = require('../dialog-D-7Hkb3j.cjs');
6
+ const jsxRuntime = require('react/jsx-runtime');
7
+ const React = require('react');
8
+ const Button = require('../Button-D10WB4vc.cjs');
9
+ const utils_cn = require('../cn-DCPcv4xv.cjs');
7
10
 
11
+ const ARM_WINDOW_MS = 4e3;
12
+ const HoldAction = React.forwardRef(
13
+ ({ onConfirm, children, disabled, holdSeconds = 1.5, ...props }, ref) => {
14
+ const { intent, pending } = dialog.useDialogContext();
15
+ const [holding, setHolding] = React.useState(false);
16
+ const [completed, setCompleted] = React.useState(false);
17
+ const [armed, setArmed] = React.useState(false);
18
+ const timer = React.useRef(void 0);
19
+ const armTimer = React.useRef(void 0);
20
+ const active = React.useRef(false);
21
+ const hintId = React.useId();
22
+ function cancel() {
23
+ clearTimeout(timer.current);
24
+ active.current = false;
25
+ setHolding(false);
26
+ }
27
+ function disarm() {
28
+ clearTimeout(armTimer.current);
29
+ setArmed(false);
30
+ }
31
+ function complete() {
32
+ setHolding(false);
33
+ setCompleted(true);
34
+ disarm();
35
+ onConfirm();
36
+ }
37
+ function start() {
38
+ if (disabled || active.current) return;
39
+ active.current = true;
40
+ setHolding(true);
41
+ timer.current = setTimeout(complete, holdSeconds * 1e3);
42
+ }
43
+ function onClick(event) {
44
+ event.preventDefault();
45
+ if (event.detail !== 0 || disabled) return;
46
+ if (armed) {
47
+ complete();
48
+ return;
49
+ }
50
+ setArmed(true);
51
+ armTimer.current = setTimeout(() => setArmed(false), ARM_WINDOW_MS);
52
+ }
53
+ React.useEffect(() => {
54
+ function onVisibilityChange() {
55
+ if (document.hidden) cancel();
56
+ }
57
+ window.addEventListener("blur", cancel);
58
+ document.addEventListener("visibilitychange", onVisibilityChange);
59
+ return () => {
60
+ clearTimeout(timer.current);
61
+ clearTimeout(armTimer.current);
62
+ window.removeEventListener("blur", cancel);
63
+ document.removeEventListener("visibilitychange", onVisibilityChange);
64
+ };
65
+ }, []);
66
+ function onPointerDown(event) {
67
+ props.onPointerDown?.(event);
68
+ if (event.defaultPrevented || event.button !== 0 || !event.isPrimary) return;
69
+ start();
70
+ }
71
+ function onKeyDown(event) {
72
+ props.onKeyDown?.(event);
73
+ if (event.defaultPrevented || event.key !== " " && event.key !== "Enter") return;
74
+ event.preventDefault();
75
+ if (!event.repeat) start();
76
+ }
77
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
78
+ /* @__PURE__ */ jsxRuntime.jsxs(
79
+ Button.Button,
80
+ {
81
+ size: "md",
82
+ ...props,
83
+ className: utils_cn.cn(
84
+ "group/hold relative isolate touch-none overflow-hidden select-none",
85
+ dialog.dialogActionLayoutClasses,
86
+ dialog.dialogActionSizeClasses[props.size ?? "md"],
87
+ props.className
88
+ ),
89
+ ref,
90
+ type: "button",
91
+ variant: intent === "destructive" ? "destructive-ghost" : "ghost",
92
+ disabled,
93
+ "aria-describedby": [props["aria-describedby"], hintId].filter(Boolean).join(" "),
94
+ "data-holding": holding || void 0,
95
+ "data-completed": completed || pending || void 0,
96
+ onClick,
97
+ onPointerDown,
98
+ onPointerUp: (event) => {
99
+ cancel();
100
+ props.onPointerUp?.(event);
101
+ },
102
+ onPointerLeave: (event) => {
103
+ cancel();
104
+ props.onPointerLeave?.(event);
105
+ },
106
+ onPointerCancel: (event) => {
107
+ cancel();
108
+ props.onPointerCancel?.(event);
109
+ },
110
+ onKeyDown,
111
+ onKeyUp: (event) => {
112
+ if (event.key === " " || event.key === "Enter") {
113
+ event.preventDefault();
114
+ cancel();
115
+ }
116
+ props.onKeyUp?.(event);
117
+ },
118
+ onBlur: (event) => {
119
+ cancel();
120
+ props.onBlur?.(event);
121
+ },
122
+ children: [
123
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children }),
124
+ /* @__PURE__ */ jsxRuntime.jsx(
125
+ "span",
126
+ {
127
+ "aria-hidden": "true",
128
+ className: utils_cn.cn(
129
+ "pointer-events-none absolute inset-0 flex items-center justify-center px-[inherit] [clip-path:inset(0_100%_0_0)]",
130
+ "transition-[clip-path] ease-linear motion-reduce:transition-none",
131
+ "group-data-[holding]/hold:[clip-path:inset(0)] motion-reduce:group-data-[holding]/hold:[clip-path:inset(0_50%_0_0)]",
132
+ "group-data-[completed]/hold:[clip-path:inset(0)]",
133
+ intent === "destructive" ? "bg-accent2 text-white" : "bg-neutral6 text-surface1"
134
+ ),
135
+ style: { transitionDuration: holding ? `${holdSeconds}s` : "0s" },
136
+ children
137
+ }
138
+ )
139
+ ]
140
+ }
141
+ ),
142
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { id: hintId, className: "sr-only", children: [
143
+ "Hold Space or Enter for ",
144
+ holdSeconds,
145
+ " seconds to confirm. Release to cancel. Screen reader users can activate twice."
146
+ ] }),
147
+ /* @__PURE__ */ jsxRuntime.jsx("span", { role: "status", className: "sr-only", children: armed ? "Activate again to confirm." : "" })
148
+ ] });
149
+ }
150
+ );
151
+ HoldAction.displayName = "DialogHoldAction";
152
+ const DialogAction = React.forwardRef(
153
+ ({ confirmation = "click", holdSeconds = 1.5, onConfirm, disabled, ...props }, ref) => {
154
+ const { intent, pending } = dialog.useDialogContext();
155
+ const isDisabled = disabled || pending;
156
+ if (confirmation === "hold") {
157
+ return /* @__PURE__ */ jsxRuntime.jsx(
158
+ HoldAction,
159
+ {
160
+ holdSeconds,
161
+ ...props,
162
+ ref,
163
+ disabled: isDisabled,
164
+ onConfirm
165
+ },
166
+ `${isDisabled}-${holdSeconds}`
167
+ );
168
+ }
169
+ return /* @__PURE__ */ jsxRuntime.jsx(
170
+ Button.Button,
171
+ {
172
+ size: "md",
173
+ ...props,
174
+ className: utils_cn.cn(dialog.dialogActionLayoutClasses, dialog.dialogActionSizeClasses[props.size ?? "md"], props.className),
175
+ ref,
176
+ type: "button",
177
+ variant: intent === "destructive" ? "destructive" : "primary",
178
+ disabled: isDisabled,
179
+ onClick: onConfirm
180
+ }
181
+ );
182
+ }
183
+ );
184
+ DialogAction.displayName = "DialogAction";
8
185
 
9
186
  exports.Dialog = dialog.Dialog;
10
187
  exports.DialogBody = dialog.DialogBody;
188
+ exports.DialogCancel = dialog.DialogCancel;
11
189
  exports.DialogClose = dialog.DialogClose;
12
190
  exports.DialogContent = dialog.DialogContent;
13
191
  exports.DialogDescription = dialog.DialogDescription;
@@ -17,4 +195,5 @@ exports.DialogOverlay = dialog.DialogOverlay;
17
195
  exports.DialogPortal = dialog.DialogPortal;
18
196
  exports.DialogTitle = dialog.DialogTitle;
19
197
  exports.DialogTrigger = dialog.DialogTrigger;
198
+ exports.DialogAction = DialogAction;
20
199
  //# sourceMappingURL=Dialog.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Dialog.cjs.js","sources":["../../src/ds/components/Dialog/dialog-action.tsx"],"sourcesContent":["import { forwardRef, useEffect, useId, useRef, useState } from 'react';\nimport type { ComponentProps, KeyboardEvent, MouseEvent, PointerEvent } from 'react';\nimport { dialogActionLayoutClasses, dialogActionSizeClasses, useDialogContext } from './dialog-context';\nimport { Button } from '@/ds/components/Button';\nimport type { TextButtonSize } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nexport type DialogActionProps = Omit<ComponentProps<typeof Button>, 'onClick' | 'variant' | 'as' | 'type' | 'size'> & {\n size?: TextButtonSize;\n onConfirm: () => void;\n confirmation?: 'click' | 'hold';\n holdSeconds?: number;\n};\n\nconst ARM_WINDOW_MS = 4000;\n\nconst HoldAction = forwardRef<HTMLButtonElement, Omit<DialogActionProps, 'confirmation'>>(\n ({ onConfirm, children, disabled, holdSeconds = 1.5, ...props }, ref) => {\n const { intent, pending } = useDialogContext();\n const [holding, setHolding] = useState(false);\n const [completed, setCompleted] = useState(false);\n const [armed, setArmed] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const armTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const active = useRef(false);\n const hintId = useId();\n\n function cancel() {\n clearTimeout(timer.current);\n active.current = false;\n setHolding(false);\n }\n\n function disarm() {\n clearTimeout(armTimer.current);\n setArmed(false);\n }\n\n function complete() {\n setHolding(false);\n setCompleted(true);\n disarm();\n onConfirm();\n }\n\n function start() {\n if (disabled || active.current) return;\n active.current = true;\n setHolding(true);\n timer.current = setTimeout(complete, holdSeconds * 1000);\n }\n\n function onClick(event: MouseEvent<HTMLButtonElement>) {\n event.preventDefault();\n if (event.detail !== 0 || disabled) return;\n if (armed) {\n complete();\n return;\n }\n setArmed(true);\n armTimer.current = setTimeout(() => setArmed(false), ARM_WINDOW_MS);\n }\n\n useEffect(() => {\n function onVisibilityChange() {\n if (document.hidden) cancel();\n }\n window.addEventListener('blur', cancel);\n document.addEventListener('visibilitychange', onVisibilityChange);\n return () => {\n clearTimeout(timer.current);\n clearTimeout(armTimer.current);\n window.removeEventListener('blur', cancel);\n document.removeEventListener('visibilitychange', onVisibilityChange);\n };\n }, []);\n\n function onPointerDown(event: PointerEvent<HTMLButtonElement>) {\n props.onPointerDown?.(event);\n if (event.defaultPrevented || event.button !== 0 || !event.isPrimary) return;\n start();\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n props.onKeyDown?.(event);\n if (event.defaultPrevented || (event.key !== ' ' && event.key !== 'Enter')) return;\n event.preventDefault();\n if (!event.repeat) start();\n }\n\n return (\n <>\n <Button\n size=\"md\"\n {...props}\n className={cn(\n 'group/hold relative isolate touch-none overflow-hidden select-none',\n dialogActionLayoutClasses,\n dialogActionSizeClasses[props.size ?? 'md'],\n props.className,\n )}\n ref={ref}\n type=\"button\"\n variant={intent === 'destructive' ? 'destructive-ghost' : 'ghost'}\n disabled={disabled}\n aria-describedby={[props['aria-describedby'], hintId].filter(Boolean).join(' ')}\n data-holding={holding || undefined}\n data-completed={completed || pending || undefined}\n onClick={onClick}\n onPointerDown={onPointerDown}\n onPointerUp={event => {\n cancel();\n props.onPointerUp?.(event);\n }}\n onPointerLeave={event => {\n cancel();\n props.onPointerLeave?.(event);\n }}\n onPointerCancel={event => {\n cancel();\n props.onPointerCancel?.(event);\n }}\n onKeyDown={onKeyDown}\n onKeyUp={event => {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n cancel();\n }\n props.onKeyUp?.(event);\n }}\n onBlur={event => {\n cancel();\n props.onBlur?.(event);\n }}\n >\n <span>{children}</span>\n <span\n aria-hidden=\"true\"\n className={cn(\n 'pointer-events-none absolute inset-0 flex items-center justify-center px-[inherit] [clip-path:inset(0_100%_0_0)]',\n 'transition-[clip-path] ease-linear motion-reduce:transition-none',\n 'group-data-[holding]/hold:[clip-path:inset(0)] motion-reduce:group-data-[holding]/hold:[clip-path:inset(0_50%_0_0)]',\n 'group-data-[completed]/hold:[clip-path:inset(0)]',\n intent === 'destructive' ? 'bg-accent2 text-white' : 'bg-neutral6 text-surface1',\n )}\n style={{ transitionDuration: holding ? `${holdSeconds}s` : '0s' }}\n >\n {children}\n </span>\n </Button>\n <span id={hintId} className=\"sr-only\">\n Hold Space or Enter for {holdSeconds} seconds to confirm. Release to cancel. Screen reader users can activate\n twice.\n </span>\n <span role=\"status\" className=\"sr-only\">\n {armed ? 'Activate again to confirm.' : ''}\n </span>\n </>\n );\n },\n);\nHoldAction.displayName = 'DialogHoldAction';\n\nexport const DialogAction = forwardRef<HTMLButtonElement, DialogActionProps>(\n ({ confirmation = 'click', holdSeconds = 1.5, onConfirm, disabled, ...props }, ref) => {\n const { intent, pending } = useDialogContext();\n const isDisabled = disabled || pending;\n if (confirmation === 'hold') {\n return (\n <HoldAction\n key={`${isDisabled}-${holdSeconds}`}\n holdSeconds={holdSeconds}\n {...props}\n ref={ref}\n disabled={isDisabled}\n onConfirm={onConfirm}\n />\n );\n }\n return (\n <Button\n size=\"md\"\n {...props}\n className={cn(dialogActionLayoutClasses, dialogActionSizeClasses[props.size ?? 'md'], props.className)}\n ref={ref}\n type=\"button\"\n variant={intent === 'destructive' ? 'destructive' : 'primary'}\n disabled={isDisabled}\n onClick={onConfirm}\n />\n );\n },\n);\nDialogAction.displayName = 'DialogAction';\n"],"names":["forwardRef","useDialogContext","useState","useRef","useId","useEffect","jsxs","Fragment","Button","cn","dialogActionLayoutClasses","dialogActionSizeClasses","jsx"],"mappings":"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"}
@@ -1,2 +1,184 @@
1
- export { D as Dialog, a as DialogBody, b as DialogClose, c as DialogContent, d as DialogDescription, e as DialogFooter, f as DialogHeader, g as DialogOverlay, h as DialogPortal, i as DialogTitle, j as DialogTrigger } from '../dialog-CESxLg8S.js';
1
+ import { u as useDialogContext, g as dialogActionSizeClasses, h as dialogActionLayoutClasses } from '../dialog-CZMPDVUj.js';
2
+ export { D as Dialog, e as DialogBody, i as DialogCancel, j as DialogClose, a as DialogContent, d as DialogDescription, f as DialogFooter, b as DialogHeader, k as DialogOverlay, l as DialogPortal, c as DialogTitle, m as DialogTrigger } from '../dialog-CZMPDVUj.js';
3
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
+ import { forwardRef, useState, useRef, useId, useEffect } from 'react';
5
+ import { B as Button } from '../Button-BsfLQEC6.js';
6
+ import { c as cn } from '../cn-B4oPhFx9.js';
7
+
8
+ const ARM_WINDOW_MS = 4e3;
9
+ const HoldAction = forwardRef(
10
+ ({ onConfirm, children, disabled, holdSeconds = 1.5, ...props }, ref) => {
11
+ const { intent, pending } = useDialogContext();
12
+ const [holding, setHolding] = useState(false);
13
+ const [completed, setCompleted] = useState(false);
14
+ const [armed, setArmed] = useState(false);
15
+ const timer = useRef(void 0);
16
+ const armTimer = useRef(void 0);
17
+ const active = useRef(false);
18
+ const hintId = useId();
19
+ function cancel() {
20
+ clearTimeout(timer.current);
21
+ active.current = false;
22
+ setHolding(false);
23
+ }
24
+ function disarm() {
25
+ clearTimeout(armTimer.current);
26
+ setArmed(false);
27
+ }
28
+ function complete() {
29
+ setHolding(false);
30
+ setCompleted(true);
31
+ disarm();
32
+ onConfirm();
33
+ }
34
+ function start() {
35
+ if (disabled || active.current) return;
36
+ active.current = true;
37
+ setHolding(true);
38
+ timer.current = setTimeout(complete, holdSeconds * 1e3);
39
+ }
40
+ function onClick(event) {
41
+ event.preventDefault();
42
+ if (event.detail !== 0 || disabled) return;
43
+ if (armed) {
44
+ complete();
45
+ return;
46
+ }
47
+ setArmed(true);
48
+ armTimer.current = setTimeout(() => setArmed(false), ARM_WINDOW_MS);
49
+ }
50
+ useEffect(() => {
51
+ function onVisibilityChange() {
52
+ if (document.hidden) cancel();
53
+ }
54
+ window.addEventListener("blur", cancel);
55
+ document.addEventListener("visibilitychange", onVisibilityChange);
56
+ return () => {
57
+ clearTimeout(timer.current);
58
+ clearTimeout(armTimer.current);
59
+ window.removeEventListener("blur", cancel);
60
+ document.removeEventListener("visibilitychange", onVisibilityChange);
61
+ };
62
+ }, []);
63
+ function onPointerDown(event) {
64
+ props.onPointerDown?.(event);
65
+ if (event.defaultPrevented || event.button !== 0 || !event.isPrimary) return;
66
+ start();
67
+ }
68
+ function onKeyDown(event) {
69
+ props.onKeyDown?.(event);
70
+ if (event.defaultPrevented || event.key !== " " && event.key !== "Enter") return;
71
+ event.preventDefault();
72
+ if (!event.repeat) start();
73
+ }
74
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
75
+ /* @__PURE__ */ jsxs(
76
+ Button,
77
+ {
78
+ size: "md",
79
+ ...props,
80
+ className: cn(
81
+ "group/hold relative isolate touch-none overflow-hidden select-none",
82
+ dialogActionLayoutClasses,
83
+ dialogActionSizeClasses[props.size ?? "md"],
84
+ props.className
85
+ ),
86
+ ref,
87
+ type: "button",
88
+ variant: intent === "destructive" ? "destructive-ghost" : "ghost",
89
+ disabled,
90
+ "aria-describedby": [props["aria-describedby"], hintId].filter(Boolean).join(" "),
91
+ "data-holding": holding || void 0,
92
+ "data-completed": completed || pending || void 0,
93
+ onClick,
94
+ onPointerDown,
95
+ onPointerUp: (event) => {
96
+ cancel();
97
+ props.onPointerUp?.(event);
98
+ },
99
+ onPointerLeave: (event) => {
100
+ cancel();
101
+ props.onPointerLeave?.(event);
102
+ },
103
+ onPointerCancel: (event) => {
104
+ cancel();
105
+ props.onPointerCancel?.(event);
106
+ },
107
+ onKeyDown,
108
+ onKeyUp: (event) => {
109
+ if (event.key === " " || event.key === "Enter") {
110
+ event.preventDefault();
111
+ cancel();
112
+ }
113
+ props.onKeyUp?.(event);
114
+ },
115
+ onBlur: (event) => {
116
+ cancel();
117
+ props.onBlur?.(event);
118
+ },
119
+ children: [
120
+ /* @__PURE__ */ jsx("span", { children }),
121
+ /* @__PURE__ */ jsx(
122
+ "span",
123
+ {
124
+ "aria-hidden": "true",
125
+ className: cn(
126
+ "pointer-events-none absolute inset-0 flex items-center justify-center px-[inherit] [clip-path:inset(0_100%_0_0)]",
127
+ "transition-[clip-path] ease-linear motion-reduce:transition-none",
128
+ "group-data-[holding]/hold:[clip-path:inset(0)] motion-reduce:group-data-[holding]/hold:[clip-path:inset(0_50%_0_0)]",
129
+ "group-data-[completed]/hold:[clip-path:inset(0)]",
130
+ intent === "destructive" ? "bg-accent2 text-white" : "bg-neutral6 text-surface1"
131
+ ),
132
+ style: { transitionDuration: holding ? `${holdSeconds}s` : "0s" },
133
+ children
134
+ }
135
+ )
136
+ ]
137
+ }
138
+ ),
139
+ /* @__PURE__ */ jsxs("span", { id: hintId, className: "sr-only", children: [
140
+ "Hold Space or Enter for ",
141
+ holdSeconds,
142
+ " seconds to confirm. Release to cancel. Screen reader users can activate twice."
143
+ ] }),
144
+ /* @__PURE__ */ jsx("span", { role: "status", className: "sr-only", children: armed ? "Activate again to confirm." : "" })
145
+ ] });
146
+ }
147
+ );
148
+ HoldAction.displayName = "DialogHoldAction";
149
+ const DialogAction = forwardRef(
150
+ ({ confirmation = "click", holdSeconds = 1.5, onConfirm, disabled, ...props }, ref) => {
151
+ const { intent, pending } = useDialogContext();
152
+ const isDisabled = disabled || pending;
153
+ if (confirmation === "hold") {
154
+ return /* @__PURE__ */ jsx(
155
+ HoldAction,
156
+ {
157
+ holdSeconds,
158
+ ...props,
159
+ ref,
160
+ disabled: isDisabled,
161
+ onConfirm
162
+ },
163
+ `${isDisabled}-${holdSeconds}`
164
+ );
165
+ }
166
+ return /* @__PURE__ */ jsx(
167
+ Button,
168
+ {
169
+ size: "md",
170
+ ...props,
171
+ className: cn(dialogActionLayoutClasses, dialogActionSizeClasses[props.size ?? "md"], props.className),
172
+ ref,
173
+ type: "button",
174
+ variant: intent === "destructive" ? "destructive" : "primary",
175
+ disabled: isDisabled,
176
+ onClick: onConfirm
177
+ }
178
+ );
179
+ }
180
+ );
181
+ DialogAction.displayName = "DialogAction";
182
+
183
+ export { DialogAction };
2
184
  //# sourceMappingURL=Dialog.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"Dialog.es.js","sources":["../../src/ds/components/Dialog/dialog-action.tsx"],"sourcesContent":["import { forwardRef, useEffect, useId, useRef, useState } from 'react';\nimport type { ComponentProps, KeyboardEvent, MouseEvent, PointerEvent } from 'react';\nimport { dialogActionLayoutClasses, dialogActionSizeClasses, useDialogContext } from './dialog-context';\nimport { Button } from '@/ds/components/Button';\nimport type { TextButtonSize } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nexport type DialogActionProps = Omit<ComponentProps<typeof Button>, 'onClick' | 'variant' | 'as' | 'type' | 'size'> & {\n size?: TextButtonSize;\n onConfirm: () => void;\n confirmation?: 'click' | 'hold';\n holdSeconds?: number;\n};\n\nconst ARM_WINDOW_MS = 4000;\n\nconst HoldAction = forwardRef<HTMLButtonElement, Omit<DialogActionProps, 'confirmation'>>(\n ({ onConfirm, children, disabled, holdSeconds = 1.5, ...props }, ref) => {\n const { intent, pending } = useDialogContext();\n const [holding, setHolding] = useState(false);\n const [completed, setCompleted] = useState(false);\n const [armed, setArmed] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const armTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const active = useRef(false);\n const hintId = useId();\n\n function cancel() {\n clearTimeout(timer.current);\n active.current = false;\n setHolding(false);\n }\n\n function disarm() {\n clearTimeout(armTimer.current);\n setArmed(false);\n }\n\n function complete() {\n setHolding(false);\n setCompleted(true);\n disarm();\n onConfirm();\n }\n\n function start() {\n if (disabled || active.current) return;\n active.current = true;\n setHolding(true);\n timer.current = setTimeout(complete, holdSeconds * 1000);\n }\n\n function onClick(event: MouseEvent<HTMLButtonElement>) {\n event.preventDefault();\n if (event.detail !== 0 || disabled) return;\n if (armed) {\n complete();\n return;\n }\n setArmed(true);\n armTimer.current = setTimeout(() => setArmed(false), ARM_WINDOW_MS);\n }\n\n useEffect(() => {\n function onVisibilityChange() {\n if (document.hidden) cancel();\n }\n window.addEventListener('blur', cancel);\n document.addEventListener('visibilitychange', onVisibilityChange);\n return () => {\n clearTimeout(timer.current);\n clearTimeout(armTimer.current);\n window.removeEventListener('blur', cancel);\n document.removeEventListener('visibilitychange', onVisibilityChange);\n };\n }, []);\n\n function onPointerDown(event: PointerEvent<HTMLButtonElement>) {\n props.onPointerDown?.(event);\n if (event.defaultPrevented || event.button !== 0 || !event.isPrimary) return;\n start();\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n props.onKeyDown?.(event);\n if (event.defaultPrevented || (event.key !== ' ' && event.key !== 'Enter')) return;\n event.preventDefault();\n if (!event.repeat) start();\n }\n\n return (\n <>\n <Button\n size=\"md\"\n {...props}\n className={cn(\n 'group/hold relative isolate touch-none overflow-hidden select-none',\n dialogActionLayoutClasses,\n dialogActionSizeClasses[props.size ?? 'md'],\n props.className,\n )}\n ref={ref}\n type=\"button\"\n variant={intent === 'destructive' ? 'destructive-ghost' : 'ghost'}\n disabled={disabled}\n aria-describedby={[props['aria-describedby'], hintId].filter(Boolean).join(' ')}\n data-holding={holding || undefined}\n data-completed={completed || pending || undefined}\n onClick={onClick}\n onPointerDown={onPointerDown}\n onPointerUp={event => {\n cancel();\n props.onPointerUp?.(event);\n }}\n onPointerLeave={event => {\n cancel();\n props.onPointerLeave?.(event);\n }}\n onPointerCancel={event => {\n cancel();\n props.onPointerCancel?.(event);\n }}\n onKeyDown={onKeyDown}\n onKeyUp={event => {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n cancel();\n }\n props.onKeyUp?.(event);\n }}\n onBlur={event => {\n cancel();\n props.onBlur?.(event);\n }}\n >\n <span>{children}</span>\n <span\n aria-hidden=\"true\"\n className={cn(\n 'pointer-events-none absolute inset-0 flex items-center justify-center px-[inherit] [clip-path:inset(0_100%_0_0)]',\n 'transition-[clip-path] ease-linear motion-reduce:transition-none',\n 'group-data-[holding]/hold:[clip-path:inset(0)] motion-reduce:group-data-[holding]/hold:[clip-path:inset(0_50%_0_0)]',\n 'group-data-[completed]/hold:[clip-path:inset(0)]',\n intent === 'destructive' ? 'bg-accent2 text-white' : 'bg-neutral6 text-surface1',\n )}\n style={{ transitionDuration: holding ? `${holdSeconds}s` : '0s' }}\n >\n {children}\n </span>\n </Button>\n <span id={hintId} className=\"sr-only\">\n Hold Space or Enter for {holdSeconds} seconds to confirm. Release to cancel. Screen reader users can activate\n twice.\n </span>\n <span role=\"status\" className=\"sr-only\">\n {armed ? 'Activate again to confirm.' : ''}\n </span>\n </>\n );\n },\n);\nHoldAction.displayName = 'DialogHoldAction';\n\nexport const DialogAction = forwardRef<HTMLButtonElement, DialogActionProps>(\n ({ confirmation = 'click', holdSeconds = 1.5, onConfirm, disabled, ...props }, ref) => {\n const { intent, pending } = useDialogContext();\n const isDisabled = disabled || pending;\n if (confirmation === 'hold') {\n return (\n <HoldAction\n key={`${isDisabled}-${holdSeconds}`}\n holdSeconds={holdSeconds}\n {...props}\n ref={ref}\n disabled={isDisabled}\n onConfirm={onConfirm}\n />\n );\n }\n return (\n <Button\n size=\"md\"\n {...props}\n className={cn(dialogActionLayoutClasses, dialogActionSizeClasses[props.size ?? 'md'], props.className)}\n ref={ref}\n type=\"button\"\n variant={intent === 'destructive' ? 'destructive' : 'primary'}\n disabled={isDisabled}\n onClick={onConfirm}\n />\n );\n },\n);\nDialogAction.displayName = 'DialogAction';\n"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
- const horizontalBars = require('../horizontal-bars-CE1O-Y6G.cjs');
5
+ const horizontalBars = require('../horizontal-bars-Dgq3PYsg.cjs');
6
6
 
7
7
 
8
8
 
@@ -1,2 +1,2 @@
1
- export { H as HorizontalBars } from '../horizontal-bars-DZ5J4TKv.js';
1
+ export { H as HorizontalBars } from '../horizontal-bars-CyP-B-BX.js';
2
2
  //# sourceMappingURL=HorizontalBars.es.js.map
@@ -0,0 +1,105 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const jsxRuntime = require('react/jsx-runtime');
6
+ const lucideReact = require('lucide-react');
7
+ const React = require('react');
8
+ const Badge = require('../Badge-uc0ydYdy.cjs');
9
+ const dialog = require('../dialog-D-7Hkb3j.cjs');
10
+ const searchFieldBlock = require('../search-field-block-CiinIsub.cjs');
11
+ const primitives_formElement = require('../primitives/form-element.cjs.js');
12
+ const utils_cn = require('../cn-DCPcv4xv.cjs');
13
+
14
+ function matches(item, query) {
15
+ return `${item.name} ${item.id} ${item.badge ?? ""}`.toLowerCase().includes(query);
16
+ }
17
+ function IntegrationDialog({
18
+ title,
19
+ description,
20
+ items,
21
+ onSelect,
22
+ searchPlaceholder = "Search integrations",
23
+ searchLabel = "Search integrations",
24
+ emptyMessage,
25
+ children,
26
+ className,
27
+ ...props
28
+ }) {
29
+ const searchRef = React.useRef(null);
30
+ return /* @__PURE__ */ jsxRuntime.jsxs(dialog.Dialog, { variant: "new", ...props, children: [
31
+ children,
32
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.DialogContent, { className: utils_cn.cn("max-w-lg", className), initialFocus: searchRef, children: /* @__PURE__ */ jsxRuntime.jsx(
33
+ IntegrationDialogContent,
34
+ {
35
+ searchRef,
36
+ title,
37
+ description,
38
+ items,
39
+ onSelect,
40
+ searchPlaceholder,
41
+ searchLabel,
42
+ emptyMessage
43
+ }
44
+ ) })
45
+ ] });
46
+ }
47
+ function IntegrationDialogContent({
48
+ title,
49
+ description,
50
+ items,
51
+ onSelect,
52
+ searchPlaceholder,
53
+ searchLabel,
54
+ emptyMessage,
55
+ searchRef
56
+ }) {
57
+ const [query, setQuery] = React.useState("");
58
+ const normalizedQuery = query.trim().toLowerCase();
59
+ const visibleItems = normalizedQuery ? items.filter((item) => matches(item, normalizedQuery)) : items;
60
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
61
+ /* @__PURE__ */ jsxRuntime.jsxs(dialog.DialogHeader, { children: [
62
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.DialogTitle, { children: title }),
63
+ description ? /* @__PURE__ */ jsxRuntime.jsx(dialog.DialogDescription, { children: description }) : null
64
+ ] }),
65
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0 px-5 py-2", children: /* @__PURE__ */ jsxRuntime.jsx(
66
+ searchFieldBlock.SearchFieldBlock,
67
+ {
68
+ inputRef: searchRef,
69
+ name: "integration-search",
70
+ label: searchLabel,
71
+ labelIsHidden: true,
72
+ placeholder: searchPlaceholder,
73
+ value: query,
74
+ onChange: (event) => setQuery(event.target.value),
75
+ onReset: () => setQuery(""),
76
+ variant: "outline",
77
+ size: "md"
78
+ }
79
+ ) }),
80
+ /* @__PURE__ */ jsxRuntime.jsx(dialog.DialogBody, { className: "pt-2 pb-5", children: visibleItems.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-2", children: visibleItems.map((item) => {
81
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
82
+ "button",
83
+ {
84
+ type: "button",
85
+ disabled: item.disabled,
86
+ onClick: () => onSelect(item),
87
+ className: utils_cn.cn(
88
+ "flex w-full cursor-pointer items-center gap-3 rounded-2xl border border-border1 px-4 py-3 text-left transition-colors duration-normal ease-out-custom hover:bg-surface3 disabled:pointer-events-none disabled:opacity-50",
89
+ primitives_formElement.controlFocusBorderVisible
90
+ ),
91
+ children: [
92
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-neutral4 grid size-8 shrink-0 place-items-center [&>img]:size-full [&>img]:object-contain [&>svg]:size-4", children: item.logo ?? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BlocksIcon, {}) }),
93
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-ui-md leading-ui-md text-neutral6 min-w-0 truncate font-medium", children: item.name }),
94
+ item.badge ? /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { size: "sm", children: item.badge }) : null,
95
+ item.meta ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-ui-sm leading-ui-sm text-neutral3 ml-auto shrink-0", children: item.meta }) : null
96
+ ]
97
+ }
98
+ ) }, item.id);
99
+ }) }) : /* @__PURE__ */ jsxRuntime.jsx("p", { role: "status", className: "text-ui-sm text-neutral3 py-8 text-center", children: emptyMessage ?? (normalizedQuery ? `No integrations match “${query}”.` : "No integrations are available.") }) })
100
+ ] });
101
+ }
102
+ IntegrationDialog.Trigger = dialog.DialogTrigger;
103
+
104
+ exports.IntegrationDialog = IntegrationDialog;
105
+ //# sourceMappingURL=IntegrationDialog.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IntegrationDialog.cjs.js","sources":["../../src/ds/components/IntegrationDialog/integration-dialog.tsx"],"sourcesContent":["import { BlocksIcon } from 'lucide-react';\nimport { useRef, useState } from 'react';\nimport type { ReactNode, RefObject } from 'react';\nimport { Badge } from '@/ds/components/Badge';\nimport {\n Dialog,\n DialogBody,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@/ds/components/Dialog';\nimport type { DialogProps } from '@/ds/components/Dialog';\nimport { SearchFieldBlock } from '@/ds/components/FormFieldBlocks/fields/search-field-block';\nimport { controlFocusBorderVisible } from '@/ds/primitives/form-element';\nimport { cn } from '@/lib/utils';\n\nexport type IntegrationDialogItem = {\n id: string;\n name: string;\n logo?: ReactNode;\n badge?: string;\n meta?: string;\n disabled?: boolean;\n};\n\nexport type IntegrationDialogProps = Omit<DialogProps, 'variant' | 'intent' | 'children'> & {\n title: ReactNode;\n description?: ReactNode;\n items: IntegrationDialogItem[];\n onSelect: (item: IntegrationDialogItem) => void;\n searchPlaceholder?: string;\n searchLabel?: string;\n emptyMessage?: ReactNode;\n children?: ReactNode;\n className?: string;\n};\n\nfunction matches(item: IntegrationDialogItem, query: string) {\n return `${item.name} ${item.id} ${item.badge ?? ''}`.toLowerCase().includes(query);\n}\n\nfunction IntegrationDialog({\n title,\n description,\n items,\n onSelect,\n searchPlaceholder = 'Search integrations',\n searchLabel = 'Search integrations',\n emptyMessage,\n children,\n className,\n ...props\n}: IntegrationDialogProps) {\n const searchRef = useRef<HTMLInputElement>(null);\n return (\n <Dialog variant=\"new\" {...props}>\n {children}\n <DialogContent className={cn('max-w-lg', className)} initialFocus={searchRef}>\n <IntegrationDialogContent\n searchRef={searchRef}\n title={title}\n description={description}\n items={items}\n onSelect={onSelect}\n searchPlaceholder={searchPlaceholder}\n searchLabel={searchLabel}\n emptyMessage={emptyMessage}\n />\n </DialogContent>\n </Dialog>\n );\n}\n\ntype IntegrationDialogContentProps = Pick<\n IntegrationDialogProps,\n 'title' | 'description' | 'items' | 'onSelect' | 'emptyMessage'\n> &\n Required<Pick<IntegrationDialogProps, 'searchPlaceholder' | 'searchLabel'>> & {\n searchRef: RefObject<HTMLInputElement | null>;\n };\n\nfunction IntegrationDialogContent({\n title,\n description,\n items,\n onSelect,\n searchPlaceholder,\n searchLabel,\n emptyMessage,\n searchRef,\n}: IntegrationDialogContentProps) {\n const [query, setQuery] = useState('');\n const normalizedQuery = query.trim().toLowerCase();\n const visibleItems = normalizedQuery ? items.filter(item => matches(item, normalizedQuery)) : items;\n\n return (\n <>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n {description ? <DialogDescription>{description}</DialogDescription> : null}\n </DialogHeader>\n <div className=\"shrink-0 px-5 py-2\">\n <SearchFieldBlock\n inputRef={searchRef}\n name=\"integration-search\"\n label={searchLabel}\n labelIsHidden\n placeholder={searchPlaceholder}\n value={query}\n onChange={event => setQuery(event.target.value)}\n onReset={() => setQuery('')}\n variant=\"outline\"\n size=\"md\"\n />\n </div>\n <DialogBody className=\"pt-2 pb-5\">\n {visibleItems.length > 0 ? (\n <ul className=\"flex flex-col gap-2\">\n {visibleItems.map(item => {\n return (\n <li key={item.id}>\n <button\n type=\"button\"\n disabled={item.disabled}\n onClick={() => onSelect(item)}\n className={cn(\n 'flex w-full cursor-pointer items-center gap-3 rounded-2xl border border-border1 px-4 py-3 text-left transition-colors duration-normal ease-out-custom hover:bg-surface3 disabled:pointer-events-none disabled:opacity-50',\n controlFocusBorderVisible,\n )}\n >\n <span className=\"text-neutral4 grid size-8 shrink-0 place-items-center [&>img]:size-full [&>img]:object-contain [&>svg]:size-4\">\n {item.logo ?? <BlocksIcon />}\n </span>\n <span className=\"text-ui-md leading-ui-md text-neutral6 min-w-0 truncate font-medium\">\n {item.name}\n </span>\n {item.badge ? <Badge size=\"sm\">{item.badge}</Badge> : null}\n {item.meta ? (\n <span className=\"text-ui-sm leading-ui-sm text-neutral3 ml-auto shrink-0\">{item.meta}</span>\n ) : null}\n </button>\n </li>\n );\n })}\n </ul>\n ) : (\n <p role=\"status\" className=\"text-ui-sm text-neutral3 py-8 text-center\">\n {emptyMessage ?? (normalizedQuery ? `No integrations match “${query}”.` : 'No integrations are available.')}\n </p>\n )}\n </DialogBody>\n </>\n );\n}\n\nIntegrationDialog.Trigger = DialogTrigger;\n\nexport { IntegrationDialog };\n"],"names":["useRef","jsxs","Dialog","jsx","DialogContent","cn","useState","Fragment","DialogHeader","DialogTitle","DialogDescription","SearchFieldBlock","DialogBody","controlFocusBorderVisible","BlocksIcon","Badge","DialogTrigger"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from '../src/ds/components/IntegrationDialog/index'
2
+ export {}