@tolle_/tolle-ui 18.2.28 → 18.2.30

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 (279) hide show
  1. package/esm2022/lib/accordion-item.component.mjs +5 -11
  2. package/esm2022/lib/accordion.component.mjs +4 -9
  3. package/esm2022/lib/alert-dialog-dynamic.component.mjs +5 -10
  4. package/esm2022/lib/alert-dialog.component.mjs +44 -59
  5. package/esm2022/lib/alert.component.mjs +5 -11
  6. package/esm2022/lib/aspect-ratio.component.mjs +119 -0
  7. package/esm2022/lib/attachment.component.mjs +334 -0
  8. package/esm2022/lib/avatar-fallback.component.mjs +3 -3
  9. package/esm2022/lib/avatar.component.mjs +4 -9
  10. package/esm2022/lib/badge.component.mjs +4 -9
  11. package/esm2022/lib/breadcrumb-item.component.mjs +3 -3
  12. package/esm2022/lib/breadcrumb-link.component.mjs +3 -3
  13. package/esm2022/lib/breadcrumb-separator.component.mjs +3 -3
  14. package/esm2022/lib/breadcrumb.component.mjs +3 -3
  15. package/esm2022/lib/bubble.component.mjs +301 -0
  16. package/esm2022/lib/button.component.mjs +5 -11
  17. package/esm2022/lib/calendar.component.mjs +5 -11
  18. package/esm2022/lib/card.component.mjs +14 -43
  19. package/esm2022/lib/carousel/carousel.component.mjs +5 -12
  20. package/esm2022/lib/chain-of-thought.component.mjs +380 -0
  21. package/esm2022/lib/chart-pie.component.mjs +386 -0
  22. package/esm2022/lib/chart.component.mjs +1146 -0
  23. package/esm2022/lib/chart.service.mjs +555 -0
  24. package/esm2022/lib/checkbox.component.mjs +5 -11
  25. package/esm2022/lib/checkpoint.component.mjs +134 -0
  26. package/esm2022/lib/collapsible.component.mjs +4 -11
  27. package/esm2022/lib/combobox.component.mjs +372 -0
  28. package/esm2022/lib/command-dialog.component.mjs +164 -0
  29. package/esm2022/lib/command.component.mjs +514 -0
  30. package/esm2022/lib/command.service.mjs +130 -0
  31. package/esm2022/lib/confirmation.component.mjs +219 -0
  32. package/esm2022/lib/context-menu-trigger.directive.mjs +36 -0
  33. package/esm2022/lib/context-menu.component.mjs +460 -0
  34. package/esm2022/lib/context-menu.service.mjs +121 -0
  35. package/esm2022/lib/context.component.mjs +377 -0
  36. package/esm2022/lib/conversation.component.mjs +442 -0
  37. package/esm2022/lib/country-selector.component.mjs +5 -11
  38. package/esm2022/lib/data-table.component.mjs +63 -12
  39. package/esm2022/lib/date-picker.component.mjs +251 -198
  40. package/esm2022/lib/date-range-picker.component.mjs +224 -116
  41. package/esm2022/lib/date-time-picker.component.mjs +506 -0
  42. package/esm2022/lib/direction.component.mjs +79 -0
  43. package/esm2022/lib/dropdown-item.component.mjs +3 -3
  44. package/esm2022/lib/dropdown-label.component.mjs +3 -3
  45. package/esm2022/lib/dropdown-menu.component.mjs +3 -3
  46. package/esm2022/lib/dropdown-separator.component.mjs +3 -3
  47. package/esm2022/lib/dropdown-trigger.directive.mjs +6 -4
  48. package/esm2022/lib/empty-state.component.mjs +4 -9
  49. package/esm2022/lib/field.component.mjs +394 -0
  50. package/esm2022/lib/hover-card.component.mjs +6 -16
  51. package/esm2022/lib/inline-citation.component.mjs +263 -0
  52. package/esm2022/lib/input-group.component.mjs +418 -0
  53. package/esm2022/lib/input.component.mjs +5 -11
  54. package/esm2022/lib/item.component.mjs +243 -0
  55. package/esm2022/lib/kbd.component.mjs +82 -0
  56. package/esm2022/lib/label.component.mjs +4 -9
  57. package/esm2022/lib/marker.component.mjs +135 -0
  58. package/esm2022/lib/masked-input.component.mjs +5 -11
  59. package/esm2022/lib/menubar.component.mjs +683 -0
  60. package/esm2022/lib/message-scroller.component.mjs +353 -0
  61. package/esm2022/lib/message-scroller.service.mjs +157 -0
  62. package/esm2022/lib/message.component.mjs +228 -0
  63. package/esm2022/lib/model-selector.component.mjs +310 -0
  64. package/esm2022/lib/multi-select.component.mjs +155 -72
  65. package/esm2022/lib/native-select.component.mjs +201 -0
  66. package/esm2022/lib/navigation-menu.component.mjs +642 -0
  67. package/esm2022/lib/otp-group.component.mjs +3 -3
  68. package/esm2022/lib/otp-slot.component.mjs +4 -9
  69. package/esm2022/lib/otp.component.mjs +5 -11
  70. package/esm2022/lib/pagination.component.mjs +7 -10
  71. package/esm2022/lib/plan.component.mjs +335 -0
  72. package/esm2022/lib/popover-content.component.mjs +4 -9
  73. package/esm2022/lib/popover.component.mjs +15 -13
  74. package/esm2022/lib/progress.component.mjs +4 -9
  75. package/esm2022/lib/prompt-input.component.mjs +526 -0
  76. package/esm2022/lib/queue.component.mjs +280 -0
  77. package/esm2022/lib/radio-group.component.mjs +6 -13
  78. package/esm2022/lib/radio-item.component.mjs +4 -9
  79. package/esm2022/lib/range-calendar.component.mjs +5 -11
  80. package/esm2022/lib/reasoning.component.mjs +335 -0
  81. package/esm2022/lib/resizable.component.mjs +219 -0
  82. package/esm2022/lib/segment.component.mjs +17 -7
  83. package/esm2022/lib/select-group.component.mjs +4 -8
  84. package/esm2022/lib/select-item.component.mjs +4 -9
  85. package/esm2022/lib/select-separator.component.mjs +4 -8
  86. package/esm2022/lib/select.component.mjs +133 -49
  87. package/esm2022/lib/separator.component.mjs +4 -9
  88. package/esm2022/lib/sheet.component.mjs +38 -56
  89. package/esm2022/lib/shimmer.component.mjs +84 -0
  90. package/esm2022/lib/sidebar.component.mjs +11 -1
  91. package/esm2022/lib/skeleton.component.mjs +4 -9
  92. package/esm2022/lib/sources.component.mjs +452 -0
  93. package/esm2022/lib/spinner.component.mjs +68 -0
  94. package/esm2022/lib/suggestion.component.mjs +207 -0
  95. package/esm2022/lib/switch.component.mjs +5 -11
  96. package/esm2022/lib/table.component.mjs +213 -0
  97. package/esm2022/lib/tabs.component.mjs +4 -11
  98. package/esm2022/lib/tag-input.component.mjs +5 -11
  99. package/esm2022/lib/task.component.mjs +359 -0
  100. package/esm2022/lib/textarea.component.mjs +5 -11
  101. package/esm2022/lib/theme.service.mjs +17 -6
  102. package/esm2022/lib/time-picker.component.mjs +923 -0
  103. package/esm2022/lib/toast.service.mjs +3 -2
  104. package/esm2022/lib/toaster.component.mjs +76 -39
  105. package/esm2022/lib/toggle-group.component.mjs +4 -9
  106. package/esm2022/lib/toggle.component.mjs +5 -11
  107. package/esm2022/lib/tool.component.mjs +462 -0
  108. package/esm2022/lib/typography.component.mjs +83 -0
  109. package/esm2022/lib/utils/color.mjs +140 -19
  110. package/esm2022/public-api.mjs +61 -1
  111. package/fesm2022/tolle-ui.mjs +16457 -1024
  112. package/fesm2022/tolle-ui.mjs.map +1 -1
  113. package/lib/alert-dialog.component.d.ts +10 -2
  114. package/lib/aspect-ratio.component.d.ts +20 -0
  115. package/lib/attachment.component.d.ts +101 -0
  116. package/lib/bubble.component.d.ts +112 -0
  117. package/lib/chain-of-thought.component.d.ts +166 -0
  118. package/lib/chart-pie.component.d.ts +108 -0
  119. package/lib/chart.component.d.ts +369 -0
  120. package/lib/chart.service.d.ts +222 -0
  121. package/lib/checkpoint.component.d.ts +51 -0
  122. package/lib/combobox.component.d.ts +90 -0
  123. package/lib/command-dialog.component.d.ts +53 -0
  124. package/lib/command.component.d.ts +189 -0
  125. package/lib/command.service.d.ts +67 -0
  126. package/lib/confirmation.component.d.ts +70 -0
  127. package/lib/context-menu-trigger.directive.d.ts +12 -0
  128. package/lib/context-menu.component.d.ts +41 -0
  129. package/lib/context-menu.service.d.ts +38 -0
  130. package/lib/context.component.d.ts +134 -0
  131. package/lib/conversation.component.d.ts +165 -0
  132. package/lib/data-table.component.d.ts +27 -1
  133. package/lib/date-picker.component.d.ts +72 -11
  134. package/lib/date-range-picker.component.d.ts +63 -6
  135. package/lib/date-time-picker.component.d.ts +119 -0
  136. package/lib/direction.component.d.ts +45 -0
  137. package/lib/field.component.d.ts +201 -0
  138. package/lib/inline-citation.component.d.ts +103 -0
  139. package/lib/input-group.component.d.ts +150 -0
  140. package/lib/item.component.d.ts +154 -0
  141. package/lib/kbd.component.d.ts +50 -0
  142. package/lib/marker.component.d.ts +58 -0
  143. package/lib/menubar.component.d.ts +247 -0
  144. package/lib/message-scroller.component.d.ts +159 -0
  145. package/lib/message-scroller.service.d.ts +73 -0
  146. package/lib/message.component.d.ts +128 -0
  147. package/lib/model-selector.component.d.ts +103 -0
  148. package/lib/multi-select.component.d.ts +66 -14
  149. package/lib/native-select.component.d.ts +57 -0
  150. package/lib/navigation-menu.component.d.ts +230 -0
  151. package/lib/plan.component.d.ts +120 -0
  152. package/lib/popover.component.d.ts +1 -0
  153. package/lib/prompt-input.component.d.ts +194 -0
  154. package/lib/queue.component.d.ts +106 -0
  155. package/lib/reasoning.component.d.ts +127 -0
  156. package/lib/resizable.component.d.ts +43 -0
  157. package/lib/segment.component.d.ts +13 -3
  158. package/lib/select.component.d.ts +37 -5
  159. package/lib/sheet.component.d.ts +3 -0
  160. package/lib/shimmer.component.d.ts +38 -0
  161. package/lib/sidebar.component.d.ts +2 -0
  162. package/lib/sources.component.d.ts +156 -0
  163. package/lib/spinner.component.d.ts +29 -0
  164. package/lib/suggestion.component.d.ts +96 -0
  165. package/lib/table.component.d.ts +106 -0
  166. package/lib/task.component.d.ts +151 -0
  167. package/lib/theme.service.d.ts +9 -0
  168. package/lib/time-picker.component.d.ts +243 -0
  169. package/lib/toast.service.d.ts +3 -1
  170. package/lib/toaster.component.d.ts +26 -9
  171. package/lib/tool.component.d.ts +158 -0
  172. package/lib/typography.component.d.ts +32 -0
  173. package/lib/utils/color.d.ts +19 -5
  174. package/package.json +1 -1
  175. package/public-api.d.ts +50 -0
  176. package/registry/docs-content.json +8497 -1553
  177. package/registry/llms-full.txt +2679 -318
  178. package/registry/llms.txt +43 -4
  179. package/registry/manifest.json +9093 -1739
  180. package/registry/r/accordion-item.json +1 -1
  181. package/registry/r/accordion.json +1 -1
  182. package/registry/r/alert-dialog-dynamic.json +1 -1
  183. package/registry/r/alert-dialog.json +1 -1
  184. package/registry/r/alert.json +1 -1
  185. package/registry/r/attachment.json +23 -0
  186. package/registry/r/avatar-fallback.json +1 -1
  187. package/registry/r/avatar.json +1 -1
  188. package/registry/r/badge.json +1 -1
  189. package/registry/r/breadcrumb-item.json +1 -1
  190. package/registry/r/breadcrumb-link.json +1 -1
  191. package/registry/r/breadcrumb-separator.json +1 -1
  192. package/registry/r/breadcrumb.json +1 -1
  193. package/registry/r/bubble.json +23 -0
  194. package/registry/r/button.json +1 -1
  195. package/registry/r/calendar.json +1 -1
  196. package/registry/r/card.json +1 -1
  197. package/registry/r/carousel.json +1 -1
  198. package/registry/r/chain-of-thought.json +23 -0
  199. package/registry/r/chart-pie.json +30 -0
  200. package/registry/r/chart.json +28 -0
  201. package/registry/r/checkbox.json +1 -1
  202. package/registry/r/checkpoint.json +23 -0
  203. package/registry/r/collapsible.json +1 -1
  204. package/registry/r/combobox.json +31 -0
  205. package/registry/r/command-dialog.json +21 -0
  206. package/registry/r/command.json +26 -0
  207. package/registry/r/confirmation.json +23 -0
  208. package/registry/r/context.json +26 -0
  209. package/registry/r/conversation.json +23 -0
  210. package/registry/r/country-selector.json +1 -1
  211. package/registry/r/data-table.json +1 -1
  212. package/registry/r/date-picker.json +4 -4
  213. package/registry/r/date-range-picker.json +3 -3
  214. package/registry/r/date-time-picker.json +28 -0
  215. package/registry/r/direction.json +16 -0
  216. package/registry/r/dropdown-item.json +1 -1
  217. package/registry/r/dropdown-label.json +1 -1
  218. package/registry/r/dropdown-menu.json +1 -1
  219. package/registry/r/dropdown-separator.json +1 -1
  220. package/registry/r/dropdown-trigger.json +1 -1
  221. package/registry/r/empty-state.json +1 -1
  222. package/registry/r/field.json +23 -0
  223. package/registry/r/hover-card.json +1 -1
  224. package/registry/r/inline-citation.json +26 -0
  225. package/registry/r/input-group.json +23 -0
  226. package/registry/r/input.json +1 -1
  227. package/registry/r/item.json +23 -0
  228. package/registry/r/kbd.json +23 -0
  229. package/registry/r/label.json +1 -1
  230. package/registry/r/marker.json +23 -0
  231. package/registry/r/masked-input.json +1 -1
  232. package/registry/r/menubar.json +24 -0
  233. package/registry/r/message-scroller.json +26 -0
  234. package/registry/r/message.json +23 -0
  235. package/registry/r/model-selector.json +32 -0
  236. package/registry/r/multi-select.json +2 -2
  237. package/registry/r/native-select.json +23 -0
  238. package/registry/r/navigation-menu.json +24 -0
  239. package/registry/r/otp-group.json +1 -1
  240. package/registry/r/otp-slot.json +1 -1
  241. package/registry/r/otp.json +1 -1
  242. package/registry/r/pagination.json +3 -2
  243. package/registry/r/plan.json +23 -0
  244. package/registry/r/popover-content.json +1 -1
  245. package/registry/r/popover.json +1 -1
  246. package/registry/r/progress.json +1 -1
  247. package/registry/r/prompt-input.json +23 -0
  248. package/registry/r/queue.json +23 -0
  249. package/registry/r/radio-group.json +1 -1
  250. package/registry/r/radio-item.json +1 -1
  251. package/registry/r/range-calendar.json +1 -1
  252. package/registry/r/reasoning.json +23 -0
  253. package/registry/r/segment.json +1 -1
  254. package/registry/r/select-group.json +1 -1
  255. package/registry/r/select-item.json +1 -1
  256. package/registry/r/select-separator.json +1 -1
  257. package/registry/r/select.json +4 -3
  258. package/registry/r/separator.json +1 -1
  259. package/registry/r/sheet.json +1 -1
  260. package/registry/r/shimmer.json +23 -0
  261. package/registry/r/sidebar.json +1 -1
  262. package/registry/r/skeleton.json +1 -1
  263. package/registry/r/sources.json +23 -0
  264. package/registry/r/spinner.json +23 -0
  265. package/registry/r/suggestion.json +23 -0
  266. package/registry/r/switch.json +1 -1
  267. package/registry/r/table.json +21 -0
  268. package/registry/r/tabs.json +1 -1
  269. package/registry/r/tag-input.json +1 -1
  270. package/registry/r/task.json +23 -0
  271. package/registry/r/textarea.json +1 -1
  272. package/registry/r/time-picker.json +24 -0
  273. package/registry/r/toaster.json +2 -2
  274. package/registry/r/toggle-group.json +1 -1
  275. package/registry/r/toggle.json +1 -1
  276. package/registry/r/tool.json +23 -0
  277. package/registry/r/typography.json +23 -0
  278. package/registry/registry.json +915 -22
  279. package/theme.css +109 -8
@@ -0,0 +1,130 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject, Subject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Coordinates a `tolle-command` and its descendants: owns the query, decides
6
+ * which items survive filtering, and tracks the active (highlighted) item for
7
+ * `aria-activedescendant`.
8
+ *
9
+ * Provided on `CommandComponent`, so each command menu gets its own instance.
10
+ */
11
+ export class CommandService {
12
+ items = new Map();
13
+ nextOrder = 0;
14
+ querySubject = new BehaviorSubject('');
15
+ /** Current search query. */
16
+ query$ = this.querySubject.asObservable();
17
+ visibleSubject = new BehaviorSubject([]);
18
+ /** Ids of the items surviving the current query, in DOM order. */
19
+ visible$ = this.visibleSubject.asObservable();
20
+ activeIdSubject = new BehaviorSubject(null);
21
+ /** Id of the highlighted item, or null when nothing matches. */
22
+ activeId$ = this.activeIdSubject.asObservable();
23
+ selectedSubject = new Subject();
24
+ /** Emits the value of the item the user chose. */
25
+ selected$ = this.selectedSubject.asObservable();
26
+ /**
27
+ * When set, filtering is left entirely to the consumer — every registered
28
+ * item stays visible regardless of the query. Use for server-side search.
29
+ */
30
+ shouldFilter = true;
31
+ get query() {
32
+ return this.querySubject.value;
33
+ }
34
+ get visibleIds() {
35
+ return this.visibleSubject.value;
36
+ }
37
+ get activeId() {
38
+ return this.activeIdSubject.value;
39
+ }
40
+ /**
41
+ * True when there is nothing to show.
42
+ *
43
+ * With built-in filtering that means items exist but the query excluded them
44
+ * all. With `shouldFilter = false` the consumer renders the result set itself,
45
+ * so "no items registered" IS the empty result — requiring items to exist
46
+ * would make `tolle-command-empty` permanently invisible in that mode.
47
+ */
48
+ get isEmpty() {
49
+ if (!this.shouldFilter)
50
+ return this.items.size === 0;
51
+ return this.items.size > 0 && this.visibleSubject.value.length === 0;
52
+ }
53
+ register(item) {
54
+ this.items.set(item.id, { ...item, order: this.nextOrder++ });
55
+ this.recompute();
56
+ }
57
+ /** Keeps the stored search text/value in sync when an item's inputs change. */
58
+ update(id, patch) {
59
+ const existing = this.items.get(id);
60
+ if (!existing)
61
+ return;
62
+ this.items.set(id, { ...existing, ...patch });
63
+ this.recompute();
64
+ }
65
+ unregister(id) {
66
+ this.items.delete(id);
67
+ this.recompute();
68
+ }
69
+ setQuery(query) {
70
+ this.querySubject.next(query);
71
+ this.recompute();
72
+ }
73
+ isVisible(id) {
74
+ return this.visibleSubject.value.includes(id);
75
+ }
76
+ /** Moves the highlight by `delta` positions, wrapping at both ends. */
77
+ move(delta) {
78
+ const ids = this.visibleSubject.value;
79
+ if (!ids.length)
80
+ return;
81
+ const current = ids.indexOf(this.activeIdSubject.value ?? '');
82
+ // From "nothing active", ArrowUp should land on the last item, not the second.
83
+ const start = current < 0 ? (delta > 0 ? -1 : 0) : current;
84
+ const next = (start + delta + ids.length) % ids.length;
85
+ this.activeIdSubject.next(ids[next]);
86
+ }
87
+ setActive(id) {
88
+ if (id !== null && !this.isVisible(id))
89
+ return;
90
+ this.activeIdSubject.next(id);
91
+ }
92
+ /** Selects the highlighted item, if there is one. */
93
+ selectActive() {
94
+ const id = this.activeIdSubject.value;
95
+ if (!id)
96
+ return;
97
+ const item = this.items.get(id);
98
+ if (!item || item.disabled)
99
+ return;
100
+ this.selectedSubject.next(item.value);
101
+ }
102
+ selectById(id) {
103
+ const item = this.items.get(id);
104
+ if (!item || item.disabled)
105
+ return;
106
+ this.selectedSubject.next(item.value);
107
+ }
108
+ /** Recomputes the visible set and keeps the highlight on something valid. */
109
+ recompute() {
110
+ const q = this.querySubject.value.trim().toLowerCase();
111
+ const visible = [...this.items.values()]
112
+ .filter((item) => !this.shouldFilter || !q || item.searchText.toLowerCase().includes(q))
113
+ .sort((a, b) => a.order - b.order)
114
+ .map((item) => item.id);
115
+ this.visibleSubject.next(visible);
116
+ // If the highlight fell out of the visible set (or there was none), move it
117
+ // to the first selectable item so Enter always has a sensible target.
118
+ const active = this.activeIdSubject.value;
119
+ if (!active || !visible.includes(active)) {
120
+ const firstEnabled = visible.find((id) => !this.items.get(id)?.disabled) ?? null;
121
+ this.activeIdSubject.next(firstEnabled);
122
+ }
123
+ }
124
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CommandService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
125
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CommandService });
126
+ }
127
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CommandService, decorators: [{
128
+ type: Injectable
129
+ }] });
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9jb21tYW5kLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFhaEQ7Ozs7OztHQU1HO0FBRUgsTUFBTSxPQUFPLGNBQWM7SUFDUixLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFDckQsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUVMLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUNoRSw0QkFBNEI7SUFDbkIsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFbEMsY0FBYyxHQUFHLElBQUksZUFBZSxDQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLGtFQUFrRTtJQUN6RCxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUV0QyxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBQzVFLGdFQUFnRTtJQUN2RCxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUV4QyxlQUFlLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztJQUN0RCxrREFBa0Q7SUFDekMsU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFekQ7OztPQUdHO0lBQ0gsWUFBWSxHQUFHLElBQUksQ0FBQztJQUVwQixJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElB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QUFLLENBQUM7YUFDakMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbEMsNEVBQTRFO1FBQzVFLHNFQUFzRTtRQUN0RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDO1lBQ2pGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO3dHQS9IVSxjQUFjOzRHQUFkLGNBQWM7OzRGQUFkLGNBQWM7a0JBRDFCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuLyoqIE9uZSByZWdpc3RlcmVkIGB0b2xsZS1jb21tYW5kLWl0ZW1gLCBhcyBzZWVuIGJ5IHRoZSBzZXJ2aWNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kSXRlbVN0YXRlIHtcbiAgaWQ6IHN0cmluZztcbiAgLyoqIFRleHQgdGhlIHF1ZXJ5IGlzIG1hdGNoZWQgYWdhaW5zdCDigJQgdGhlIGl0ZW0ncyBsYWJlbCBwbHVzIGFueSBga2V5d29yZHNgLiAqL1xuICBzZWFyY2hUZXh0OiBzdHJpbmc7XG4gIHZhbHVlOiBhbnk7XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICAvKiogUmVnaXN0cmF0aW9uIG9yZGVyLCB1c2VkIHRvIGtlZXAgdGhlIHZpc2libGUgbGlzdCBpbiBET00gb3JkZXIuICovXG4gIG9yZGVyOiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29vcmRpbmF0ZXMgYSBgdG9sbGUtY29tbWFuZGAgYW5kIGl0cyBkZXNjZW5kYW50czogb3ducyB0aGUgcXVlcnksIGRlY2lkZXNcbiAqIHdoaWNoIGl0ZW1zIHN1cnZpdmUgZmlsdGVyaW5nLCBhbmQgdHJhY2tzIHRoZSBhY3RpdmUgKGhpZ2hsaWdodGVkKSBpdGVtIGZvclxuICogYGFyaWEtYWN0aXZlZGVzY2VuZGFudGAuXG4gKlxuICogUHJvdmlkZWQgb24gYENvbW1hbmRDb21wb25lbnRgLCBzbyBlYWNoIGNvbW1hbmQgbWVudSBnZXRzIGl0cyBvd24gaW5zdGFuY2UuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb21tYW5kU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXRlbXMgPSBuZXcgTWFwPHN0cmluZywgQ29tbWFuZEl0ZW1TdGF0ZT4oKTtcbiAgcHJpdmF0ZSBuZXh0T3JkZXIgPSAwO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcXVlcnlTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgLyoqIEN1cnJlbnQgc2VhcmNoIHF1ZXJ5LiAqL1xuICByZWFkb25seSBxdWVyeSQgPSB0aGlzLnF1ZXJ5U3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHZpc2libGVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pO1xuICAvKiogSWRzIG9mIHRoZSBpdGVtcyBzdXJ2aXZpbmcgdGhlIGN1cnJlbnQgcXVlcnksIGluIERPTSBvcmRlci4gKi9cbiAgcmVhZG9ubHkgdmlzaWJsZSQgPSB0aGlzLnZpc2libGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZlSWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgLyoqIElkIG9mIHRoZSBoaWdobGlnaHRlZCBpdGVtLCBvciBudWxsIHdoZW4gbm90aGluZyBtYXRjaGVzLiAqL1xuICByZWFkb25seSBhY3RpdmVJZCQgPSB0aGlzLmFjdGl2ZUlkU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdGVkU3ViamVjdCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgLyoqIEVtaXRzIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbSB0aGUgdXNlciBjaG9zZS4gKi9cbiAgcmVhZG9ubHkgc2VsZWN0ZWQkID0gdGhpcy5zZWxlY3RlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBmaWx0ZXJpbmcgaXMgbGVmdCBlbnRpcmVseSB0byB0aGUgY29uc3VtZXIg4oCUIGV2ZXJ5IHJlZ2lzdGVyZWRcbiAgICogaXRlbSBzdGF5cyB2aXNpYmxlIHJlZ2FyZGxlc3Mgb2YgdGhlIHF1ZXJ5LiBVc2UgZm9yIHNlcnZlci1zaWRlIHNlYXJjaC5cbiAgICovXG4gIHNob3VsZEZpbHRlciA9IHRydWU7XG5cbiAgZ2V0IHF1ZXJ5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgZ2V0IHZpc2libGVJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZUlkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUlkU3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBzaG93LlxuICAgKlxuICAgKiBXaXRoIGJ1aWx0LWluIGZpbHRlcmluZyB0aGF0IG1lYW5zIGl0ZW1zIGV4aXN0IGJ1dCB0aGUgcXVlcnkgZXhjbHVkZWQgdGhlbVxuICAgKiBhbGwuIFdpdGggYHNob3VsZEZpbHRlciA9IGZhbHNlYCB0aGUgY29uc3VtZXIgcmVuZGVycyB0aGUgcmVzdWx0IHNldCBpdHNlbGYsXG4gICAqIHNvIFwibm8gaXRlbXMgcmVnaXN0ZXJlZFwiIElTIHRoZSBlbXB0eSByZXN1bHQg4oCUIHJlcXVpcmluZyBpdGVtcyB0byBleGlzdFxuICAgKiB3b3VsZCBtYWtlIGB0b2xsZS1jb21tYW5kLWVtcHR5YCBwZXJtYW5lbnRseSBpbnZpc2libGUgaW4gdGhhdCBtb2RlLlxuICAgKi9cbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnNob3VsZEZpbHRlcikgcmV0dXJuIHRoaXMuaXRlbXMuc2l6ZSA9PT0gMDtcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5zaXplID4gMCAmJiB0aGlzLnZpc2libGVTdWJqZWN0LnZhbHVlLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIHJlZ2lzdGVyKGl0ZW06IE9taXQ8Q29tbWFuZEl0ZW1TdGF0ZSwgJ29yZGVyJz4pOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1zLnNldChpdGVtLmlkLCB7IC4uLml0ZW0sIG9yZGVyOiB0aGlzLm5leHRPcmRlcisrIH0pO1xuICAgIHRoaXMucmVjb21wdXRlKCk7XG4gIH1cblxuICAvKiogS2VlcHMgdGhlIHN0b3JlZCBzZWFyY2ggdGV4dC92YWx1ZSBpbiBzeW5jIHdoZW4gYW4gaXRlbSdzIGlucHV0cyBjaGFuZ2UuICovXG4gIHVwZGF0ZShpZDogc3RyaW5nLCBwYXRjaDogUGFydGlhbDxPbWl0PENvbW1hbmRJdGVtU3RhdGUsICdpZCcgfCAnb3JkZXInPj4pOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuaXRlbXMuZ2V0KGlkKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm47XG4gICAgdGhpcy5pdGVtcy5zZXQoaWQsIHsgLi4uZXhpc3RpbmcsIC4uLnBhdGNoIH0pO1xuICAgIHRoaXMucmVjb21wdXRlKCk7XG4gIH1cblxuICB1bnJlZ2lzdGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1zLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5yZWNvbXB1dGUoKTtcbiAgfVxuXG4gIHNldFF1ZXJ5KHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXJ5U3ViamVjdC5uZXh0KHF1ZXJ5KTtcbiAgICB0aGlzLnJlY29tcHV0ZSgpO1xuICB9XG5cbiAgaXNWaXNpYmxlKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlU3ViamVjdC52YWx1ZS5pbmNsdWRlcyhpZCk7XG4gIH1cblxuICAvKiogTW92ZXMgdGhlIGhpZ2hsaWdodCBieSBgZGVsdGFgIHBvc2l0aW9ucywgd3JhcHBpbmcgYXQgYm90aCBlbmRzLiAqL1xuICBtb3ZlKGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpZHMgPSB0aGlzLnZpc2libGVTdWJqZWN0LnZhbHVlO1xuICAgIGlmICghaWRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBpZHMuaW5kZXhPZih0aGlzLmFjdGl2ZUlkU3ViamVjdC52YWx1ZSA/PyAnJyk7XG4gICAgLy8gRnJvbSBcIm5vdGhpbmcgYWN0aXZlXCIsIEFycm93VXAgc2hvdWxkIGxhbmQgb24gdGhlIGxhc3QgaXRlbSwgbm90IHRoZSBzZWNvbmQuXG4gICAgY29uc3Qgc3RhcnQgPSBjdXJyZW50IDwgMCA/IChkZWx0YSA+IDAgPyAtMSA6IDApIDogY3VycmVudDtcbiAgICBjb25zdCBuZXh0ID0gKHN0YXJ0ICsgZGVsdGEgKyBpZHMubGVuZ3RoKSAlIGlkcy5sZW5ndGg7XG4gICAgdGhpcy5hY3RpdmVJZFN1YmplY3QubmV4dChpZHNbbmV4dF0pO1xuICB9XG5cbiAgc2V0QWN0aXZlKGlkOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKGlkICE9PSBudWxsICYmICF0aGlzLmlzVmlzaWJsZShpZCkpIHJldHVybjtcbiAgICB0aGlzLmFjdGl2ZUlkU3ViamVjdC5uZXh0KGlkKTtcbiAgfVxuXG4gIC8qKiBTZWxlY3RzIHRoZSBoaWdobGlnaHRlZCBpdGVtLCBpZiB0aGVyZSBpcyBvbmUuICovXG4gIHNlbGVjdEFjdGl2ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuYWN0aXZlSWRTdWJqZWN0LnZhbHVlO1xuICAgIGlmICghaWQpIHJldHVybjtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtcy5nZXQoaWQpO1xuICAgIGlmICghaXRlbSB8fCBpdGVtLmRpc2FibGVkKSByZXR1cm47XG4gICAgdGhpcy5zZWxlY3RlZFN1YmplY3QubmV4dChpdGVtLnZhbHVlKTtcbiAgfVxuXG4gIHNlbGVjdEJ5SWQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zLmdldChpZCk7XG4gICAgaWYgKCFpdGVtIHx8IGl0ZW0uZGlzYWJsZWQpIHJldHVybjtcbiAgICB0aGlzLnNlbGVjdGVkU3ViamVjdC5uZXh0KGl0ZW0udmFsdWUpO1xuICB9XG5cbiAgLyoqIFJlY29tcHV0ZXMgdGhlIHZpc2libGUgc2V0IGFuZCBrZWVwcyB0aGUgaGlnaGxpZ2h0IG9uIHNvbWV0aGluZyB2YWxpZC4gKi9cbiAgcHJpdmF0ZSByZWNvbXB1dGUoKTogdm9pZCB7XG4gICAgY29uc3QgcSA9IHRoaXMucXVlcnlTdWJqZWN0LnZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgY29uc3QgdmlzaWJsZSA9IFsuLi50aGlzLml0ZW1zLnZhbHVlcygpXVxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gIXRoaXMuc2hvdWxkRmlsdGVyIHx8ICFxIHx8IGl0ZW0uc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5pZCk7XG5cbiAgICB0aGlzLnZpc2libGVTdWJqZWN0Lm5leHQodmlzaWJsZSk7XG5cbiAgICAvLyBJZiB0aGUgaGlnaGxpZ2h0IGZlbGwgb3V0IG9mIHRoZSB2aXNpYmxlIHNldCAob3IgdGhlcmUgd2FzIG5vbmUpLCBtb3ZlIGl0XG4gICAgLy8gdG8gdGhlIGZpcnN0IHNlbGVjdGFibGUgaXRlbSBzbyBFbnRlciBhbHdheXMgaGFzIGEgc2Vuc2libGUgdGFyZ2V0LlxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuYWN0aXZlSWRTdWJqZWN0LnZhbHVlO1xuICAgIGlmICghYWN0aXZlIHx8ICF2aXNpYmxlLmluY2x1ZGVzKGFjdGl2ZSkpIHtcbiAgICAgIGNvbnN0IGZpcnN0RW5hYmxlZCA9IHZpc2libGUuZmluZCgoaWQpID0+ICF0aGlzLml0ZW1zLmdldChpZCk/LmRpc2FibGVkKSA/PyBudWxsO1xuICAgICAgdGhpcy5hY3RpdmVJZFN1YmplY3QubmV4dChmaXJzdEVuYWJsZWQpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,219 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ChangeDetectorRef, inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { cva } from 'class-variance-authority';
4
+ import { cn } from './utils/cn';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ const confirmationVariants = cva('w-full rounded-lg border p-3 text-sm transition-colors', {
8
+ variants: {
9
+ state: {
10
+ pending: 'border-border bg-card text-card-foreground',
11
+ confirmed: 'border-success/40 bg-success/5 text-card-foreground',
12
+ cancelled: 'border-destructive/40 bg-destructive/5 text-card-foreground',
13
+ },
14
+ },
15
+ defaultVariants: { state: 'pending' },
16
+ });
17
+ const confirmationIconVariants = cva('mt-0.5 shrink-0 text-base leading-none', {
18
+ variants: {
19
+ state: {
20
+ pending: 'text-warning',
21
+ confirmed: 'text-success',
22
+ cancelled: 'text-destructive',
23
+ },
24
+ },
25
+ defaultVariants: { state: 'pending' },
26
+ });
27
+ const confirmationResolvedVariants = cva('inline-flex shrink-0 items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium', {
28
+ variants: {
29
+ state: {
30
+ pending: 'border-border text-muted-foreground',
31
+ confirmed: 'border-success/40 bg-success/10 text-success',
32
+ cancelled: 'border-destructive/40 bg-destructive/10 text-destructive',
33
+ },
34
+ },
35
+ defaultVariants: { state: 'pending' },
36
+ });
37
+ /** Remixicon class shown beside the prompt for each state. */
38
+ const CONFIRMATION_ICONS = {
39
+ pending: 'ri-shield-check-line',
40
+ confirmed: 'ri-checkbox-circle-fill',
41
+ cancelled: 'ri-close-circle-fill',
42
+ };
43
+ /**
44
+ * An inline approve / deny prompt for an agent action that needs a human to
45
+ * sign off. While `state` is `'pending'` it shows both buttons; once the user
46
+ * answers — or the host sets `state` — the buttons collapse into a compact
47
+ * resolved row.
48
+ *
49
+ * ```html
50
+ * <tolle-confirmation
51
+ * title="Delete 12 rows from the orders table?"
52
+ * description="This cannot be undone."
53
+ * (confirmed)="run()"
54
+ * (cancelled)="skip()"
55
+ * ></tolle-confirmation>
56
+ * ```
57
+ * @new
58
+ */
59
+ export class ConfirmationComponent {
60
+ cdr = inject(ChangeDetectorRef);
61
+ /** Headline describing the action awaiting approval. @default '' */
62
+ title = '';
63
+ /** Supporting detail shown under the title. @default '' */
64
+ description = '';
65
+ /** Label of the approve button. @default 'Approve' */
66
+ confirmLabel = 'Approve';
67
+ /** Label of the deny button. @default 'Deny' */
68
+ cancelLabel = 'Deny';
69
+ /** Text shown in the resolved row after approval. @default 'Approved' */
70
+ confirmedLabel = 'Approved';
71
+ /** Text shown in the resolved row after denial. @default 'Denied' */
72
+ cancelledLabel = 'Denied';
73
+ /** Whether the prompt is still open, and how it was answered. @default 'pending' */
74
+ state = 'pending';
75
+ /** Blocks both buttons without resolving the prompt. @default false */
76
+ disabled = false;
77
+ /** Extra Tailwind classes merged onto the prompt via `cn()` (last-wins). */
78
+ class = '';
79
+ /** Emitted when the user approves the action. */
80
+ confirmed = new EventEmitter();
81
+ /** Emitted when the user denies the action. */
82
+ cancelled = new EventEmitter();
83
+ /**
84
+ * Set when the user answers, so the prompt resolves on its own without the
85
+ * host having to bind `state` back. Cleared whenever `state` is pushed in.
86
+ */
87
+ answer = null;
88
+ ngOnChanges(changes) {
89
+ if (changes['state'])
90
+ this.answer = null;
91
+ // A bound `class` input is written through Angular's styling path,
92
+ // which does not mark an OnPush view dirty on its own.
93
+ this.cdr.markForCheck();
94
+ }
95
+ /** The state actually rendered: the user's answer if there is one, else `state`. */
96
+ get currentState() {
97
+ return this.answer ?? this.state;
98
+ }
99
+ get resolvedLabel() {
100
+ return this.currentState === 'confirmed' ? this.confirmedLabel : this.cancelledLabel;
101
+ }
102
+ get iconName() {
103
+ return CONFIRMATION_ICONS[this.currentState];
104
+ }
105
+ get computedClass() {
106
+ return cn(confirmationVariants({ state: this.currentState }), this.class);
107
+ }
108
+ get iconClass() {
109
+ return cn(confirmationIconVariants({ state: this.currentState }), this.iconName);
110
+ }
111
+ get resolvedClass() {
112
+ return cn(confirmationResolvedVariants({ state: this.currentState }));
113
+ }
114
+ get confirmButtonClass() {
115
+ return cn('inline-flex h-8 items-center gap-1.5 rounded-md bg-primary px-3 text-xs font-medium text-primary-foreground transition-colors', 'hover:bg-primary/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50');
116
+ }
117
+ get cancelButtonClass() {
118
+ return cn('inline-flex h-8 items-center gap-1.5 rounded-md border border-border bg-background px-3 text-xs font-medium text-foreground transition-colors', 'hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50');
119
+ }
120
+ confirm() {
121
+ if (this.disabled || this.currentState !== 'pending')
122
+ return;
123
+ this.answer = 'confirmed';
124
+ this.confirmed.emit();
125
+ }
126
+ cancel() {
127
+ if (this.disabled || this.currentState !== 'pending')
128
+ return;
129
+ this.answer = 'cancelled';
130
+ this.cancelled.emit();
131
+ }
132
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ConfirmationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
133
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ConfirmationComponent, isStandalone: true, selector: "tolle-confirmation", inputs: { title: "title", description: "description", confirmLabel: "confirmLabel", cancelLabel: "cancelLabel", confirmedLabel: "confirmedLabel", cancelledLabel: "cancelledLabel", state: "state", disabled: "disabled", class: "class" }, outputs: { confirmed: "confirmed", cancelled: "cancelled" }, usesOnChanges: true, ngImport: i0, template: `
134
+ <div [class]="computedClass" [attr.data-state]="currentState" role="group" [attr.aria-label]="title">
135
+ <div class="flex items-start gap-3">
136
+ <i [class]="iconClass" aria-hidden="true"></i>
137
+
138
+ <div class="min-w-0 flex-1">
139
+ <p class="font-medium text-foreground">{{ title }}</p>
140
+ <p *ngIf="description" class="mt-0.5 text-sm text-muted-foreground">{{ description }}</p>
141
+
142
+ <div class="empty:hidden"><ng-content></ng-content></div>
143
+
144
+ <div *ngIf="currentState === 'pending'" class="mt-3 flex flex-wrap items-center gap-2">
145
+ <button type="button" [disabled]="disabled" [class]="confirmButtonClass" (click)="confirm()">
146
+ <i class="ri-check-line" aria-hidden="true"></i>
147
+ {{ confirmLabel }}
148
+ </button>
149
+ <button type="button" [disabled]="disabled" [class]="cancelButtonClass" (click)="cancel()">
150
+ <i class="ri-close-line" aria-hidden="true"></i>
151
+ {{ cancelLabel }}
152
+ </button>
153
+ </div>
154
+ </div>
155
+
156
+ <span *ngIf="currentState !== 'pending'" [class]="resolvedClass">
157
+ <i [class]="iconName" aria-hidden="true"></i>
158
+ {{ resolvedLabel }}
159
+ </span>
160
+ </div>
161
+ </div>
162
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
163
+ }
164
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ConfirmationComponent, decorators: [{
165
+ type: Component,
166
+ args: [{ selector: 'tolle-confirmation', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
167
+ <div [class]="computedClass" [attr.data-state]="currentState" role="group" [attr.aria-label]="title">
168
+ <div class="flex items-start gap-3">
169
+ <i [class]="iconClass" aria-hidden="true"></i>
170
+
171
+ <div class="min-w-0 flex-1">
172
+ <p class="font-medium text-foreground">{{ title }}</p>
173
+ <p *ngIf="description" class="mt-0.5 text-sm text-muted-foreground">{{ description }}</p>
174
+
175
+ <div class="empty:hidden"><ng-content></ng-content></div>
176
+
177
+ <div *ngIf="currentState === 'pending'" class="mt-3 flex flex-wrap items-center gap-2">
178
+ <button type="button" [disabled]="disabled" [class]="confirmButtonClass" (click)="confirm()">
179
+ <i class="ri-check-line" aria-hidden="true"></i>
180
+ {{ confirmLabel }}
181
+ </button>
182
+ <button type="button" [disabled]="disabled" [class]="cancelButtonClass" (click)="cancel()">
183
+ <i class="ri-close-line" aria-hidden="true"></i>
184
+ {{ cancelLabel }}
185
+ </button>
186
+ </div>
187
+ </div>
188
+
189
+ <span *ngIf="currentState !== 'pending'" [class]="resolvedClass">
190
+ <i [class]="iconName" aria-hidden="true"></i>
191
+ {{ resolvedLabel }}
192
+ </span>
193
+ </div>
194
+ </div>
195
+ `, styles: [":host{display:block}\n"] }]
196
+ }], propDecorators: { title: [{
197
+ type: Input
198
+ }], description: [{
199
+ type: Input
200
+ }], confirmLabel: [{
201
+ type: Input
202
+ }], cancelLabel: [{
203
+ type: Input
204
+ }], confirmedLabel: [{
205
+ type: Input
206
+ }], cancelledLabel: [{
207
+ type: Input
208
+ }], state: [{
209
+ type: Input
210
+ }], disabled: [{
211
+ type: Input
212
+ }], class: [{
213
+ type: Input
214
+ }], confirmed: [{
215
+ type: Output
216
+ }], cancelled: [{
217
+ type: Output
218
+ }] } });
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlybWF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvY29uZmlybWF0aW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixpQkFBaUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckosT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7O0FBS2hDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDLHdEQUF3RCxFQUFFO0lBQ3pGLFFBQVEsRUFBRTtRQUNSLEtBQUssRUFBRTtZQUNMLE9BQU8sRUFBRSw0Q0FBNEM7WUFDckQsU0FBUyxFQUFFLHFEQUFxRDtZQUNoRSxTQUFTLEVBQUUsNkRBQTZEO1NBQ3pFO0tBQ0Y7SUFDRCxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQ3RDLENBQUMsQ0FBQztBQUVILE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxDQUFDLHdDQUF3QyxFQUFFO0lBQzdFLFFBQVEsRUFBRTtRQUNSLEtBQUssRUFBRTtZQUNMLE9BQU8sRUFBRSxjQUFjO1lBQ3ZCLFNBQVMsRUFBRSxjQUFjO1lBQ3pCLFNBQVMsRUFBRSxrQkFBa0I7U0FDOUI7S0FDRjtJQUNELGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7Q0FDdEMsQ0FBQyxDQUFDO0FBRUgsTUFBTSw0QkFBNEIsR0FBRyxHQUFHLENBQ3RDLDZGQUE2RixFQUM3RjtJQUNFLFFBQVEsRUFBRTtRQUNSLEtBQUssRUFBRTtZQUNMLE9BQU8s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T0FBTztRQUNMLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVM7WUFBRSxPQUFPO1FBQzdELElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTO1lBQUUsT0FBTztRQUM3RCxJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7d0dBMUZVLHFCQUFxQjs0RkFBckIscUJBQXFCLDRZQS9CdEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJULCtGQS9CUyxZQUFZOzs0RkFpQ1gscUJBQXFCO2tCQXJDakMsU0FBUzsrQkFDRSxvQkFBb0IsY0FFbEIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUNOLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJUOzhCQU1RLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUdJLFNBQVM7c0JBQWxCLE1BQU07Z0JBRUcsU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZiwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgY3ZhLCB0eXBlIFZhcmlhbnRQcm9wcyB9IGZyb20gJ2NsYXNzLXZhcmlhbmNlLWF1dGhvcml0eSc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuXG4vKiogV2hldGhlciB0aGUgdXNlciBoYXMgYW5zd2VyZWQgdGhlIHByb21wdCB5ZXQsIGFuZCBob3cuICovXG5leHBvcnQgdHlwZSBDb25maXJtYXRpb25TdGF0ZSA9ICdwZW5kaW5nJyB8ICdjb25maXJtZWQnIHwgJ2NhbmNlbGxlZCc7XG5cbmNvbnN0IGNvbmZpcm1hdGlvblZhcmlhbnRzID0gY3ZhKCd3LWZ1bGwgcm91bmRlZC1sZyBib3JkZXIgcC0zIHRleHQtc20gdHJhbnNpdGlvbi1jb2xvcnMnLCB7XG4gIHZhcmlhbnRzOiB7XG4gICAgc3RhdGU6IHtcbiAgICAgIHBlbmRpbmc6ICdib3JkZXItYm9yZGVyIGJnLWNhcmQgdGV4dC1jYXJkLWZvcmVncm91bmQnLFxuICAgICAgY29uZmlybWVkOiAnYm9yZGVyLXN1Y2Nlc3MvNDAgYmctc3VjY2Vzcy81IHRleHQtY2FyZC1mb3JlZ3JvdW5kJyxcbiAgICAgIGNhbmNlbGxlZDogJ2JvcmRlci1kZXN0cnVjdGl2ZS80MCBiZy1kZXN0cnVjdGl2ZS81IHRleHQtY2FyZC1mb3JlZ3JvdW5kJyxcbiAgICB9LFxuICB9LFxuICBkZWZhdWx0VmFyaWFudHM6IHsgc3RhdGU6ICdwZW5kaW5nJyB9LFxufSk7XG5cbmNvbnN0IGNvbmZpcm1hdGlvbkljb25WYXJpYW50cyA9IGN2YSgnbXQtMC41IHNocmluay0wIHRleHQtYmFzZSBsZWFkaW5nLW5vbmUnLCB7XG4gIHZhcmlhbnRzOiB7XG4gICAgc3RhdGU6IHtcbiAgICAgIHBlbmRpbmc6ICd0ZXh0LXdhcm5pbmcnLFxuICAgICAgY29uZmlybWVkOiAndGV4dC1zdWNjZXNzJyxcbiAgICAgIGNhbmNlbGxlZDogJ3RleHQtZGVzdHJ1Y3RpdmUnLFxuICAgIH0sXG4gIH0sXG4gIGRlZmF1bHRWYXJpYW50czogeyBzdGF0ZTogJ3BlbmRpbmcnIH0sXG59KTtcblxuY29uc3QgY29uZmlybWF0aW9uUmVzb2x2ZWRWYXJpYW50cyA9IGN2YShcbiAgJ2lubGluZS1mbGV4IHNocmluay0wIGl0ZW1zLWNlbnRlciBnYXAtMSByb3VuZGVkLWZ1bGwgYm9yZGVyIHB4LTIgcHktMC41IHRleHQteHMgZm9udC1tZWRpdW0nLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIHBlbmRpbmc6ICdib3JkZXItYm9yZGVyIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCcsXG4gICAgICAgIGNvbmZpcm1lZDogJ2JvcmRlci1zdWNjZXNzLzQwIGJnLXN1Y2Nlc3MvMTAgdGV4dC1zdWNjZXNzJyxcbiAgICAgICAgY2FuY2VsbGVkOiAnYm9yZGVyLWRlc3RydWN0aXZlLzQwIGJnLWRlc3RydWN0aXZlLzEwIHRleHQtZGVzdHJ1Y3RpdmUnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czogeyBzdGF0ZTogJ3BlbmRpbmcnIH0sXG4gIH1cbik7XG5cbmV4cG9ydCB0eXBlIENvbmZpcm1hdGlvblByb3BzID0gVmFyaWFudFByb3BzPHR5cGVvZiBjb25maXJtYXRpb25WYXJpYW50cz47XG5cbi8qKiBSZW1peGljb24gY2xhc3Mgc2hvd24gYmVzaWRlIHRoZSBwcm9tcHQgZm9yIGVhY2ggc3RhdGUuICovXG5jb25zdCBDT05GSVJNQVRJT05fSUNPTlM6IFJlY29yZDxDb25maXJtYXRpb25TdGF0ZSwgc3RyaW5nPiA9IHtcbiAgcGVuZGluZzogJ3JpLXNoaWVsZC1jaGVjay1saW5lJyxcbiAgY29uZmlybWVkOiAncmktY2hlY2tib3gtY2lyY2xlLWZpbGwnLFxuICBjYW5jZWxsZWQ6ICdyaS1jbG9zZS1jaXJjbGUtZmlsbCcsXG59O1xuXG4vKipcbiAqIEFuIGlubGluZSBhcHByb3ZlIC8gZGVueSBwcm9tcHQgZm9yIGFuIGFnZW50IGFjdGlvbiB0aGF0IG5lZWRzIGEgaHVtYW4gdG9cbiAqIHNpZ24gb2ZmLiBXaGlsZSBgc3RhdGVgIGlzIGAncGVuZGluZydgIGl0IHNob3dzIGJvdGggYnV0dG9uczsgb25jZSB0aGUgdXNlclxuICogYW5zd2VycyDigJQgb3IgdGhlIGhvc3Qgc2V0cyBgc3RhdGVgIOKAlCB0aGUgYnV0dG9ucyBjb2xsYXBzZSBpbnRvIGEgY29tcGFjdFxuICogcmVzb2x2ZWQgcm93LlxuICpcbiAqIGBgYGh0bWxcbiAqIDx0b2xsZS1jb25maXJtYXRpb25cbiAqICAgdGl0bGU9XCJEZWxldGUgMTIgcm93cyBmcm9tIHRoZSBvcmRlcnMgdGFibGU/XCJcbiAqICAgZGVzY3JpcHRpb249XCJUaGlzIGNhbm5vdCBiZSB1bmRvbmUuXCJcbiAqICAgKGNvbmZpcm1lZCk9XCJydW4oKVwiXG4gKiAgIChjYW5jZWxsZWQpPVwic2tpcCgpXCJcbiAqID48L3RvbGxlLWNvbmZpcm1hdGlvbj5cbiAqIGBgYFxuICogQG5ld1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1jb25maXJtYXRpb24nLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiIFthdHRyLmRhdGEtc3RhdGVdPVwiY3VycmVudFN0YXRlXCIgcm9sZT1cImdyb3VwXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0aXRsZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtc3RhcnQgZ2FwLTNcIj5cbiAgICAgICAgPGkgW2NsYXNzXT1cImljb25DbGFzc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWluLXctMCBmbGV4LTFcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZFwiPnt7IHRpdGxlIH19PC9wPlxuICAgICAgICAgIDxwICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBjbGFzcz1cIm10LTAuNSB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IGRlc2NyaXB0aW9uIH19PC9wPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVtcHR5OmhpZGRlblwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50U3RhdGUgPT09ICdwZW5kaW5nJ1wiIGNsYXNzPVwibXQtMyBmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFtjbGFzc109XCJjb25maXJtQnV0dG9uQ2xhc3NcIiAoY2xpY2spPVwiY29uZmlybSgpXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicmktY2hlY2stbGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAge3sgY29uZmlybUxhYmVsIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFtjbGFzc109XCJjYW5jZWxCdXR0b25DbGFzc1wiIChjbGljayk9XCJjYW5jZWwoKVwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInJpLWNsb3NlLWxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgIHt7IGNhbmNlbExhYmVsIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJjdXJyZW50U3RhdGUgIT09ICdwZW5kaW5nJ1wiIFtjbGFzc109XCJyZXNvbHZlZENsYXNzXCI+XG4gICAgICAgICAgPGkgW2NsYXNzXT1cImljb25OYW1lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgIHt7IHJlc29sdmVkTGFiZWwgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIENvbmZpcm1hdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKiogSGVhZGxpbmUgZGVzY3JpYmluZyB0aGUgYWN0aW9uIGF3YWl0aW5nIGFwcHJvdmFsLiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSB0aXRsZSA9ICcnO1xuICAvKiogU3VwcG9ydGluZyBkZXRhaWwgc2hvd24gdW5kZXIgdGhlIHRpdGxlLiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbiA9ICcnO1xuICAvKiogTGFiZWwgb2YgdGhlIGFwcHJvdmUgYnV0dG9uLiBAZGVmYXVsdCAnQXBwcm92ZScgKi9cbiAgQElucHV0KCkgY29uZmlybUxhYmVsID0gJ0FwcHJvdmUnO1xuICAvKiogTGFiZWwgb2YgdGhlIGRlbnkgYnV0dG9uLiBAZGVmYXVsdCAnRGVueScgKi9cbiAgQElucHV0KCkgY2FuY2VsTGFiZWwgPSAnRGVueSc7XG4gIC8qKiBUZXh0IHNob3duIGluIHRoZSByZXNvbHZlZCByb3cgYWZ0ZXIgYXBwcm92YWwuIEBkZWZhdWx0ICdBcHByb3ZlZCcgKi9cbiAgQElucHV0KCkgY29uZmlybWVkTGFiZWwgPSAnQXBwcm92ZWQnO1xuICAvKiogVGV4dCBzaG93biBpbiB0aGUgcmVzb2x2ZWQgcm93IGFmdGVyIGRlbmlhbC4gQGRlZmF1bHQgJ0RlbmllZCcgKi9cbiAgQElucHV0KCkgY2FuY2VsbGVkTGFiZWwgPSAnRGVuaWVkJztcbiAgLyoqIFdoZXRoZXIgdGhlIHByb21wdCBpcyBzdGlsbCBvcGVuLCBhbmQgaG93IGl0IHdhcyBhbnN3ZXJlZC4gQGRlZmF1bHQgJ3BlbmRpbmcnICovXG4gIEBJbnB1dCgpIHN0YXRlOiBDb25maXJtYXRpb25TdGF0ZSA9ICdwZW5kaW5nJztcbiAgLyoqIEJsb2NrcyBib3RoIGJ1dHRvbnMgd2l0aG91dCByZXNvbHZpbmcgdGhlIHByb21wdC4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIHByb21wdCB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgYXBwcm92ZXMgdGhlIGFjdGlvbi4gKi9cbiAgQE91dHB1dCgpIGNvbmZpcm1lZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBkZW5pZXMgdGhlIGFjdGlvbi4gKi9cbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogU2V0IHdoZW4gdGhlIHVzZXIgYW5zd2Vycywgc28gdGhlIHByb21wdCByZXNvbHZlcyBvbiBpdHMgb3duIHdpdGhvdXQgdGhlXG4gICAqIGhvc3QgaGF2aW5nIHRvIGJpbmQgYHN0YXRlYCBiYWNrLiBDbGVhcmVkIHdoZW5ldmVyIGBzdGF0ZWAgaXMgcHVzaGVkIGluLlxuICAgKi9cbiAgcHJpdmF0ZSBhbnN3ZXI6IENvbmZpcm1hdGlvblN0YXRlIHwgbnVsbCA9IG51bGw7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzdGF0ZSddKSB0aGlzLmFuc3dlciA9IG51bGw7XG4gIFxuICAgIC8vIEEgYm91bmQgYGNsYXNzYCBpbnB1dCBpcyB3cml0dGVuIHRocm91Z2ggQW5ndWxhcidzIHN0eWxpbmcgcGF0aCxcbiAgICAvLyB3aGljaCBkb2VzIG5vdCBtYXJrIGFuIE9uUHVzaCB2aWV3IGRpcnR5IG9uIGl0cyBvd24uXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogVGhlIHN0YXRlIGFjdHVhbGx5IHJlbmRlcmVkOiB0aGUgdXNlcidzIGFuc3dlciBpZiB0aGVyZSBpcyBvbmUsIGVsc2UgYHN0YXRlYC4gKi9cbiAgZ2V0IGN1cnJlbnRTdGF0ZSgpOiBDb25maXJtYXRpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuYW5zd2VyID8/IHRoaXMuc3RhdGU7XG4gIH1cblxuICBnZXQgcmVzb2x2ZWRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZSA9PT0gJ2NvbmZpcm1lZCcgPyB0aGlzLmNvbmZpcm1lZExhYmVsIDogdGhpcy5jYW5jZWxsZWRMYWJlbDtcbiAgfVxuXG4gIGdldCBpY29uTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBDT05GSVJNQVRJT05fSUNPTlNbdGhpcy5jdXJyZW50U3RhdGVdO1xuICB9XG5cbiAgZ2V0IGNvbXB1dGVkQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGNuKGNvbmZpcm1hdGlvblZhcmlhbnRzKHsgc3RhdGU6IHRoaXMuY3VycmVudFN0YXRlIH0pLCB0aGlzLmNsYXNzKTtcbiAgfVxuXG4gIGdldCBpY29uQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGNuKGNvbmZpcm1hdGlvbkljb25WYXJpYW50cyh7IHN0YXRlOiB0aGlzLmN1cnJlbnRTdGF0ZSB9KSwgdGhpcy5pY29uTmFtZSk7XG4gIH1cblxuICBnZXQgcmVzb2x2ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oY29uZmlybWF0aW9uUmVzb2x2ZWRWYXJpYW50cyh7IHN0YXRlOiB0aGlzLmN1cnJlbnRTdGF0ZSB9KSk7XG4gIH1cblxuICBnZXQgY29uZmlybUJ1dHRvbkNsYXNzKCkge1xuICAgIHJldHVybiBjbihcbiAgICAgICdpbmxpbmUtZmxleCBoLTggaXRlbXMtY2VudGVyIGdhcC0xLjUgcm91bmRlZC1tZCBiZy1wcmltYXJ5IHB4LTMgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWNvbG9ycycsXG4gICAgICAnaG92ZXI6YmctcHJpbWFyeS85MCBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAnXG4gICAgKTtcbiAgfVxuXG4gIGdldCBjYW5jZWxCdXR0b25DbGFzcygpIHtcbiAgICByZXR1cm4gY24oXG4gICAgICAnaW5saW5lLWZsZXggaC04IGl0ZW1zLWNlbnRlciBnYXAtMS41IHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctYmFja2dyb3VuZCBweC0zIHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgICdob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAnXG4gICAgKTtcbiAgfVxuXG4gIGNvbmZpcm0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5jdXJyZW50U3RhdGUgIT09ICdwZW5kaW5nJykgcmV0dXJuO1xuICAgIHRoaXMuYW5zd2VyID0gJ2NvbmZpcm1lZCc7XG4gICAgdGhpcy5jb25maXJtZWQuZW1pdCgpO1xuICB9XG5cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMuY3VycmVudFN0YXRlICE9PSAncGVuZGluZycpIHJldHVybjtcbiAgICB0aGlzLmFuc3dlciA9ICdjYW5jZWxsZWQnO1xuICAgIHRoaXMuY2FuY2VsbGVkLmVtaXQoKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,36 @@
1
+ import { Directive, ElementRef, EventEmitter, HostListener, inject, Input, Output } from '@angular/core';
2
+ import { ContextMenuService } from './context-menu.service';
3
+ import * as i0 from "@angular/core";
4
+ export class ContextMenuTriggerDirective {
5
+ elementRef = inject(ElementRef);
6
+ contextMenuService = inject(ContextMenuService);
7
+ items = [];
8
+ action = new EventEmitter();
9
+ onContextMenu(event) {
10
+ event.stopPropagation();
11
+ this.contextMenuService.open({
12
+ event,
13
+ items: this.items,
14
+ triggerElement: this.elementRef.nativeElement,
15
+ onAction: (actionId) => this.action.emit(actionId)
16
+ });
17
+ }
18
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContextMenuTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
19
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: ContextMenuTriggerDirective, isStandalone: true, selector: "[tolleContextMenuTrigger]", inputs: { items: ["tolleContextMenuTrigger", "items"] }, outputs: { action: "action" }, host: { listeners: { "contextmenu": "onContextMenu($event)" } }, ngImport: i0 });
20
+ }
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContextMenuTriggerDirective, decorators: [{
22
+ type: Directive,
23
+ args: [{
24
+ selector: '[tolleContextMenuTrigger]',
25
+ standalone: true
26
+ }]
27
+ }], propDecorators: { items: [{
28
+ type: Input,
29
+ args: ['tolleContextMenuTrigger']
30
+ }], action: [{
31
+ type: Output
32
+ }], onContextMenu: [{
33
+ type: HostListener,
34
+ args: ['contextmenu', ['$event']]
35
+ }] } });
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LXRyaWdnZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9jb250ZXh0LW1lbnUtdHJpZ2dlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsa0JBQWtCLEVBQW1CLE1BQU0sd0JBQXdCLENBQUM7O0FBTTdFLE1BQU0sT0FBTywyQkFBMkI7SUFDOUIsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNoQyxrQkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUV0QixLQUFLLEdBQXNCLEVBQUUsQ0FBQztJQUN0RCxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUc5QyxhQUFhLENBQUMsS0FBaUI7UUFDN0IsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7WUFDM0IsS0FBSztZQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhO1lBQzdDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ25ELENBQUMsQ0FBQztJQUNMLENBQUM7d0dBaEJVLDJCQUEyQjs0RkFBM0IsMkJBQTJCOzs0RkFBM0IsMkJBQTJCO2tCQUp2QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwyQkFBMkI7b0JBQ3JDLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs4QkFLbUMsS0FBSztzQkFBdEMsS0FBSzt1QkFBQyx5QkFBeUI7Z0JBQ3RCLE1BQU07c0JBQWYsTUFBTTtnQkFHUCxhQUFhO3NCQURaLFlBQVk7dUJBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgaW5qZWN0LCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250ZXh0TWVudVNlcnZpY2UsIENvbnRleHRNZW51SXRlbSB9IGZyb20gJy4vY29udGV4dC1tZW51LnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbdG9sbGVDb250ZXh0TWVudVRyaWdnZXJdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBDb250ZXh0TWVudVRyaWdnZXJEaXJlY3RpdmUge1xuICBwcml2YXRlIGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgY29udGV4dE1lbnVTZXJ2aWNlID0gaW5qZWN0KENvbnRleHRNZW51U2VydmljZSk7XG5cbiAgQElucHV0KCd0b2xsZUNvbnRleHRNZW51VHJpZ2dlcicpIGl0ZW1zOiBDb250ZXh0TWVudUl0ZW1bXSA9IFtdO1xuICBAT3V0cHV0KCkgYWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQEhvc3RMaXN0ZW5lcignY29udGV4dG1lbnUnLCBbJyRldmVudCddKVxuICBvbkNvbnRleHRNZW51KGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5jb250ZXh0TWVudVNlcnZpY2Uub3Blbih7XG4gICAgICBldmVudCxcbiAgICAgIGl0ZW1zOiB0aGlzLml0ZW1zLFxuICAgICAgdHJpZ2dlckVsZW1lbnQ6IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgb25BY3Rpb246IChhY3Rpb25JZCkgPT4gdGhpcy5hY3Rpb24uZW1pdChhY3Rpb25JZClcbiAgICB9KTtcbiAgfVxufVxuIl19