@tolle_/tolle-ui 18.2.29 → 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 +59 -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 +16453 -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 +26 -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 +8480 -1542
  177. package/registry/llms-full.txt +2679 -319
  178. package/registry/llms.txt +43 -4
  179. package/registry/manifest.json +9090 -1742
  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,372 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild, forwardRef, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { computePosition, flip, shift, offset, size, autoUpdate } from '@floating-ui/dom';
5
+ import { cva } from 'class-variance-authority';
6
+ import { cn } from './utils/cn';
7
+ import { CommandComponent, CommandInputComponent, CommandListComponent, CommandEmptyComponent, CommandItemComponent, } from './command.component';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common";
10
+ const comboboxTriggerVariants = cva('flex w-full items-center justify-between gap-2 rounded-md border border-input bg-background text-foreground shadow-sm transition-colors ' +
11
+ 'focus:outline-none focus-visible:border-primary/80 focus-visible:ring-4 focus-visible:ring-ring/30 ' +
12
+ 'disabled:cursor-not-allowed disabled:opacity-50', {
13
+ variants: {
14
+ size: {
15
+ xs: 'h-8 px-2 text-xs',
16
+ sm: 'h-9 px-3 text-sm',
17
+ default: 'h-10 px-3 text-sm',
18
+ lg: 'h-11 px-4 text-base',
19
+ },
20
+ invalid: {
21
+ true: 'border-destructive focus-visible:border-destructive/80 focus-visible:ring-destructive/30',
22
+ false: '',
23
+ },
24
+ },
25
+ defaultVariants: { size: 'default', invalid: false },
26
+ });
27
+ /**
28
+ * A searchable single-select: a button that opens a `tolle-command` list in a
29
+ * floating panel. Implements `ControlValueAccessor`, so it works with
30
+ * `ngModel` and reactive forms.
31
+ *
32
+ * Use `tolle-select` when the list is short and needs no search, and
33
+ * `tolle-multi-select` when more than one value can be chosen.
34
+ * @new
35
+ */
36
+ export class ComboboxComponent {
37
+ cdr;
38
+ /** Options to choose from. @default [] */
39
+ options = [];
40
+ /** Text shown on the trigger when nothing is selected. @default 'Select an option…' */
41
+ placeholder = 'Select an option…';
42
+ /** Placeholder inside the search box. @default 'Search…' */
43
+ searchPlaceholder = 'Search…';
44
+ /** Message shown when the query matches no option. @default 'No results found.' */
45
+ emptyMessage = 'No results found.';
46
+ /** Height and text size of the trigger. @default 'default' */
47
+ size = 'default';
48
+ /** Applies the destructive border and focus ring. @default false */
49
+ invalid = false;
50
+ /** Disables the control. @default false */
51
+ disabled = false;
52
+ /** Set false to filter the options yourself, e.g. server-side. @default true */
53
+ shouldFilter = true;
54
+ /** Close the panel after a value is chosen. @default true */
55
+ closeOnSelect = true;
56
+ /** Where the panel opens relative to the trigger. @default 'bottom-start' */
57
+ placement = 'bottom-start';
58
+ /** Accessible name when there is no associated visible label. @default '' */
59
+ ariaLabel = '';
60
+ /** Extra Tailwind classes merged onto the trigger via `cn()` (last-wins). */
61
+ class = '';
62
+ /** Emitted with the chosen value whenever the selection changes. */
63
+ valueChange = new EventEmitter();
64
+ /** Emitted with the query text as the user searches. */
65
+ searchChange = new EventEmitter();
66
+ /** Emitted when the panel opens. */
67
+ opened = new EventEmitter();
68
+ /** Emitted when the panel closes. */
69
+ closed = new EventEmitter();
70
+ triggerEl;
71
+ panelEl;
72
+ panelId = `combobox-panel-${Math.random().toString(36).slice(2, 11)}`;
73
+ value = null;
74
+ isOpen = false;
75
+ cn = cn;
76
+ cleanup;
77
+ onChange = () => { };
78
+ onTouched = () => { };
79
+ constructor(cdr) {
80
+ this.cdr = cdr;
81
+ }
82
+ outsideClickHandler = (event) => {
83
+ const target = event.target;
84
+ if (!this.triggerEl?.nativeElement.contains(target) &&
85
+ !this.panelEl?.nativeElement.contains(target)) {
86
+ this.close();
87
+ }
88
+ };
89
+ escapeHandler = (event) => {
90
+ if (event.key === 'Escape' && this.isOpen) {
91
+ event.preventDefault();
92
+ this.close();
93
+ this.triggerEl?.nativeElement.focus();
94
+ }
95
+ };
96
+ get selectedLabel() {
97
+ return this.options.find((o) => o.value === this.value)?.label ?? '';
98
+ }
99
+ get computedTriggerClass() {
100
+ return cn(comboboxTriggerVariants({ size: this.size, invalid: this.invalid }), this.class);
101
+ }
102
+ toggle() {
103
+ this.isOpen ? this.close() : this.open();
104
+ }
105
+ open() {
106
+ if (this.disabled || this.isOpen)
107
+ return;
108
+ this.isOpen = true;
109
+ this.opened.emit();
110
+ this.cdr.markForCheck();
111
+ setTimeout(() => {
112
+ this.updatePosition();
113
+ // Focus the search box so the user can type straight away.
114
+ this.panelEl?.nativeElement.querySelector('input')?.focus();
115
+ document.addEventListener('pointerdown', this.outsideClickHandler, true);
116
+ document.addEventListener('keydown', this.escapeHandler, true);
117
+ });
118
+ }
119
+ close() {
120
+ if (!this.isOpen)
121
+ return;
122
+ this.isOpen = false;
123
+ this.closed.emit();
124
+ this.onTouched();
125
+ this.teardown();
126
+ this.cdr.markForCheck();
127
+ }
128
+ onTriggerKeyDown(event) {
129
+ if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key) && !this.isOpen) {
130
+ event.preventDefault();
131
+ this.open();
132
+ }
133
+ }
134
+ onSelect(value) {
135
+ this.value = value;
136
+ this.onChange(value);
137
+ this.valueChange.emit(value);
138
+ if (this.closeOnSelect) {
139
+ this.close();
140
+ this.triggerEl?.nativeElement.focus();
141
+ }
142
+ this.cdr.markForCheck();
143
+ }
144
+ updatePosition() {
145
+ const trigger = this.triggerEl?.nativeElement;
146
+ const panel = this.panelEl?.nativeElement;
147
+ if (!trigger || !panel)
148
+ return;
149
+ this.cleanup = autoUpdate(trigger, panel, () => {
150
+ computePosition(trigger, panel, {
151
+ placement: this.placement,
152
+ middleware: [
153
+ offset(4),
154
+ flip(),
155
+ shift({ padding: 8 }),
156
+ // Match the panel to the trigger width and cap its height to the space
157
+ // actually available, so the list scrolls instead of overflowing.
158
+ size({
159
+ padding: 8,
160
+ apply({ rects, availableHeight, elements }) {
161
+ Object.assign(elements.floating.style, {
162
+ minWidth: `${rects.reference.width}px`,
163
+ maxHeight: `${Math.max(160, availableHeight)}px`,
164
+ });
165
+ },
166
+ }),
167
+ ],
168
+ }).then(({ x, y }) => {
169
+ Object.assign(panel.style, {
170
+ left: `${x}px`,
171
+ top: `${y}px`,
172
+ visibility: 'visible',
173
+ });
174
+ });
175
+ });
176
+ }
177
+ teardown() {
178
+ this.cleanup?.();
179
+ this.cleanup = undefined;
180
+ document.removeEventListener('pointerdown', this.outsideClickHandler, true);
181
+ document.removeEventListener('keydown', this.escapeHandler, true);
182
+ }
183
+ ngOnDestroy() {
184
+ this.teardown();
185
+ }
186
+ writeValue(value) {
187
+ this.value = value;
188
+ this.cdr.markForCheck();
189
+ }
190
+ registerOnChange(fn) {
191
+ this.onChange = fn;
192
+ }
193
+ registerOnTouched(fn) {
194
+ this.onTouched = fn;
195
+ }
196
+ setDisabledState(isDisabled) {
197
+ this.disabled = isDisabled;
198
+ this.cdr.markForCheck();
199
+ }
200
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComboboxComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
201
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ComboboxComponent, isStandalone: true, selector: "tolle-combobox", inputs: { options: "options", placeholder: "placeholder", searchPlaceholder: "searchPlaceholder", emptyMessage: "emptyMessage", size: "size", invalid: "invalid", disabled: "disabled", shouldFilter: "shouldFilter", closeOnSelect: "closeOnSelect", placement: "placement", ariaLabel: "ariaLabel", class: "class" }, outputs: { valueChange: "valueChange", searchChange: "searchChange", opened: "opened", closed: "closed" }, providers: [
202
+ {
203
+ provide: NG_VALUE_ACCESSOR,
204
+ useExisting: forwardRef(() => ComboboxComponent),
205
+ multi: true,
206
+ },
207
+ ], viewQueries: [{ propertyName: "triggerEl", first: true, predicate: ["trigger"], descendants: true }, { propertyName: "panelEl", first: true, predicate: ["panel"], descendants: true }], ngImport: i0, template: `
208
+ <button
209
+ #trigger
210
+ type="button"
211
+ role="combobox"
212
+ aria-haspopup="listbox"
213
+ [attr.aria-expanded]="isOpen"
214
+ [attr.aria-controls]="isOpen ? panelId : null"
215
+ [attr.aria-label]="ariaLabel || null"
216
+ [attr.data-state]="isOpen ? 'open' : 'closed'"
217
+ [disabled]="disabled"
218
+ [class]="computedTriggerClass"
219
+ (click)="toggle()"
220
+ (keydown)="onTriggerKeyDown($event)"
221
+ >
222
+ <span [class]="cn('truncate', selectedLabel ? 'text-foreground' : 'text-muted-foreground')">
223
+ {{ selectedLabel || placeholder }}
224
+ </span>
225
+ <i
226
+ class="ri-expand-up-down-line shrink-0 text-muted-foreground transition-transform"
227
+ aria-hidden="true"
228
+ ></i>
229
+ </button>
230
+
231
+ <div
232
+ *ngIf="isOpen"
233
+ #panel
234
+ [id]="panelId"
235
+ class="fixed left-0 top-0 z-[9999]"
236
+ style="visibility: hidden"
237
+ >
238
+ <div class="overflow-hidden rounded-md border border-border bg-popover shadow-md">
239
+ <tolle-command [shouldFilter]="shouldFilter" (selected)="onSelect($event)" (queryChange)="searchChange.emit($event)">
240
+ <tolle-command-input [placeholder]="searchPlaceholder"></tolle-command-input>
241
+ <tolle-command-list>
242
+ <tolle-command-empty>{{ emptyMessage }}</tolle-command-empty>
243
+ <tolle-command-item
244
+ *ngFor="let option of options"
245
+ [value]="option.value"
246
+ [label]="option.label"
247
+ [keywords]="option.keywords || []"
248
+ [disabled]="option.disabled || false"
249
+ >
250
+ <i
251
+ class="ri-check-line shrink-0"
252
+ [class.opacity-0]="option.value !== value"
253
+ aria-hidden="true"
254
+ ></i>
255
+ <span class="truncate">{{ option.label }}</span>
256
+ </tolle-command-item>
257
+ </tolle-command-list>
258
+ </tolle-command>
259
+ </div>
260
+ </div>
261
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CommandComponent, selector: "tolle-command", inputs: ["shouldFilter", "ariaLabel", "class"], outputs: ["selected", "queryChange"] }, { kind: "component", type: CommandInputComponent, selector: "tolle-command-input", inputs: ["placeholder", "ariaLabel", "class", "inputClass"] }, { kind: "component", type: CommandListComponent, selector: "tolle-command-list", inputs: ["ariaLabel", "class"] }, { kind: "component", type: CommandEmptyComponent, selector: "tolle-command-empty", inputs: ["class"] }, { kind: "component", type: CommandItemComponent, selector: "tolle-command-item", inputs: ["value", "label", "keywords", "disabled", "class"], outputs: ["selected"] }] });
262
+ }
263
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComboboxComponent, decorators: [{
264
+ type: Component,
265
+ args: [{ selector: 'tolle-combobox', standalone: true, imports: [
266
+ CommonModule,
267
+ CommandComponent,
268
+ CommandInputComponent,
269
+ CommandListComponent,
270
+ CommandEmptyComponent,
271
+ CommandItemComponent,
272
+ ], providers: [
273
+ {
274
+ provide: NG_VALUE_ACCESSOR,
275
+ useExisting: forwardRef(() => ComboboxComponent),
276
+ multi: true,
277
+ },
278
+ ], template: `
279
+ <button
280
+ #trigger
281
+ type="button"
282
+ role="combobox"
283
+ aria-haspopup="listbox"
284
+ [attr.aria-expanded]="isOpen"
285
+ [attr.aria-controls]="isOpen ? panelId : null"
286
+ [attr.aria-label]="ariaLabel || null"
287
+ [attr.data-state]="isOpen ? 'open' : 'closed'"
288
+ [disabled]="disabled"
289
+ [class]="computedTriggerClass"
290
+ (click)="toggle()"
291
+ (keydown)="onTriggerKeyDown($event)"
292
+ >
293
+ <span [class]="cn('truncate', selectedLabel ? 'text-foreground' : 'text-muted-foreground')">
294
+ {{ selectedLabel || placeholder }}
295
+ </span>
296
+ <i
297
+ class="ri-expand-up-down-line shrink-0 text-muted-foreground transition-transform"
298
+ aria-hidden="true"
299
+ ></i>
300
+ </button>
301
+
302
+ <div
303
+ *ngIf="isOpen"
304
+ #panel
305
+ [id]="panelId"
306
+ class="fixed left-0 top-0 z-[9999]"
307
+ style="visibility: hidden"
308
+ >
309
+ <div class="overflow-hidden rounded-md border border-border bg-popover shadow-md">
310
+ <tolle-command [shouldFilter]="shouldFilter" (selected)="onSelect($event)" (queryChange)="searchChange.emit($event)">
311
+ <tolle-command-input [placeholder]="searchPlaceholder"></tolle-command-input>
312
+ <tolle-command-list>
313
+ <tolle-command-empty>{{ emptyMessage }}</tolle-command-empty>
314
+ <tolle-command-item
315
+ *ngFor="let option of options"
316
+ [value]="option.value"
317
+ [label]="option.label"
318
+ [keywords]="option.keywords || []"
319
+ [disabled]="option.disabled || false"
320
+ >
321
+ <i
322
+ class="ri-check-line shrink-0"
323
+ [class.opacity-0]="option.value !== value"
324
+ aria-hidden="true"
325
+ ></i>
326
+ <span class="truncate">{{ option.label }}</span>
327
+ </tolle-command-item>
328
+ </tolle-command-list>
329
+ </tolle-command>
330
+ </div>
331
+ </div>
332
+ `, styles: [":host{display:block}\n"] }]
333
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { options: [{
334
+ type: Input
335
+ }], placeholder: [{
336
+ type: Input
337
+ }], searchPlaceholder: [{
338
+ type: Input
339
+ }], emptyMessage: [{
340
+ type: Input
341
+ }], size: [{
342
+ type: Input
343
+ }], invalid: [{
344
+ type: Input
345
+ }], disabled: [{
346
+ type: Input
347
+ }], shouldFilter: [{
348
+ type: Input
349
+ }], closeOnSelect: [{
350
+ type: Input
351
+ }], placement: [{
352
+ type: Input
353
+ }], ariaLabel: [{
354
+ type: Input
355
+ }], class: [{
356
+ type: Input
357
+ }], valueChange: [{
358
+ type: Output
359
+ }], searchChange: [{
360
+ type: Output
361
+ }], opened: [{
362
+ type: Output
363
+ }], closed: [{
364
+ type: Output
365
+ }], triggerEl: [{
366
+ type: ViewChild,
367
+ args: ['trigger']
368
+ }], panelEl: [{
369
+ type: ViewChild,
370
+ args: ['panel']
371
+ }] } });
372
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9jb21ib2JveC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixTQUFTLEVBQ1QsVUFBVSxHQUdYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUYsT0FBTyxFQUFFLEdBQUcsRUFBcUIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsb0JBQW9CLEdBQ3JCLE1BQU0scUJBQXFCLENBQUM7OztBQUU3QixNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FDakMsMElBQTBJO0lBQ3hJLHFHQUFxRztJQUNyRyxpREFBaUQsRUFDbkQ7SUFDRSxRQUFRLEVBQUU7UUFDUixJQUFJLEVBQUU7WUFDSixFQUFFLEVBQUUsa0JBQWtCO1lBQ3RCLEVBQUUsRUFBRSxrQkFBa0I7WUFDdEIsT0FBTyxFQUFFLG1CQUFtQjtZQUM1QixFQUFFLEVBQUUscUJBQXFCO1NBQzFCO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsSUFBSSxFQUFFLDBGQUEwRjtZQUNoRyxLQUFLLEVBQUUsRUFBRTtTQUNWO0tBQ0Y7SUFDRCxlQUFlLEVBQUUsRUFBRSxJ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Q1A7d0JBQ1AsWUFBWTt3QkFDWixnQkFBZ0I7d0JBQ2hCLHFCQUFxQjt3QkFDckIsb0JBQW9CO3dCQUNwQixxQkFBcUI7d0JBQ3JCLG9CQUFvQjtxQkFDckIsYUFDVTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQzs0QkFDaEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0YsWUFDUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0RUO3NGQUlRLE9BQU87c0JBQWYsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFHSSxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTTtnQkFFZSxTQUFTO3NCQUE5QixTQUFTO3VCQUFDLFNBQVM7Z0JBQ0EsT0FBTztzQkFBMUIsU0FBUzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCxcbiAgZm9yd2FyZFJlZixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgY29tcHV0ZVBvc2l0aW9uLCBmbGlwLCBzaGlmdCwgb2Zmc2V0LCBzaXplLCBhdXRvVXBkYXRlIH0gZnJvbSAnQGZsb2F0aW5nLXVpL2RvbSc7XG5pbXBvcnQgeyBjdmEsIHR5cGUgVmFyaWFudFByb3BzIH0gZnJvbSAnY2xhc3MtdmFyaWFuY2UtYXV0aG9yaXR5JztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5pbXBvcnQge1xuICBDb21tYW5kQ29tcG9uZW50LFxuICBDb21tYW5kSW5wdXRDb21wb25lbnQsXG4gIENvbW1hbmRMaXN0Q29tcG9uZW50LFxuICBDb21tYW5kRW1wdHlDb21wb25lbnQsXG4gIENvbW1hbmRJdGVtQ29tcG9uZW50LFxufSBmcm9tICcuL2NvbW1hbmQuY29tcG9uZW50JztcblxuY29uc3QgY29tYm9ib3hUcmlnZ2VyVmFyaWFudHMgPSBjdmEoXG4gICdmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHRleHQtZm9yZWdyb3VuZCBzaGFkb3ctc20gdHJhbnNpdGlvbi1jb2xvcnMgJyArXG4gICAgJ2ZvY3VzOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmJvcmRlci1wcmltYXJ5LzgwIGZvY3VzLXZpc2libGU6cmluZy00IGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzMwICcgK1xuICAgICdkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCcsXG4gIHtcbiAgICB2YXJpYW50czoge1xuICAgICAgc2l6ZToge1xuICAgICAgICB4czogJ2gtOCBweC0yIHRleHQteHMnLFxuICAgICAgICBzbTogJ2gtOSBweC0zIHRleHQtc20nLFxuICAgICAgICBkZWZhdWx0OiAnaC0xMCBweC0zIHRleHQtc20nLFxuICAgICAgICBsZzogJ2gtMTEgcHgtNCB0ZXh0LWJhc2UnLFxuICAgICAgfSxcbiAgICAgIGludmFsaWQ6IHtcbiAgICAgICAgdHJ1ZTogJ2JvcmRlci1kZXN0cnVjdGl2ZSBmb2N1cy12aXNpYmxlOmJvcmRlci1kZXN0cnVjdGl2ZS84MCBmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvMzAnLFxuICAgICAgICBmYWxzZTogJycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGVmYXVsdFZhcmlhbnRzOiB7IHNpemU6ICdkZWZhdWx0JywgaW52YWxpZDogZmFsc2UgfSxcbiAgfVxuKTtcblxuZXhwb3J0IHR5cGUgQ29tYm9ib3hQcm9wcyA9IFZhcmlhbnRQcm9wczx0eXBlb2YgY29tYm9ib3hUcmlnZ2VyVmFyaWFudHM+O1xuXG5leHBvcnQgdHlwZSBDb21ib2JveE9wdGlvbiA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKiogRXh0cmEgdGVybXMgdGhhdCBzaG91bGQgYWxzbyBtYXRjaCB0aGlzIG9wdGlvbiB3aGVuIHNlYXJjaGluZy4gKi9cbiAga2V5d29yZHM/OiBzdHJpbmdbXTtcbn07XG5cbi8qKlxuICogQSBzZWFyY2hhYmxlIHNpbmdsZS1zZWxlY3Q6IGEgYnV0dG9uIHRoYXQgb3BlbnMgYSBgdG9sbGUtY29tbWFuZGAgbGlzdCBpbiBhXG4gKiBmbG9hdGluZyBwYW5lbC4gSW1wbGVtZW50cyBgQ29udHJvbFZhbHVlQWNjZXNzb3JgLCBzbyBpdCB3b3JrcyB3aXRoXG4gKiBgbmdNb2RlbGAgYW5kIHJlYWN0aXZlIGZvcm1zLlxuICpcbiAqIFVzZSBgdG9sbGUtc2VsZWN0YCB3aGVuIHRoZSBsaXN0IGlzIHNob3J0IGFuZCBuZWVkcyBubyBzZWFyY2gsIGFuZFxuICogYHRvbGxlLW11bHRpLXNlbGVjdGAgd2hlbiBtb3JlIHRoYW4gb25lIHZhbHVlIGNhbiBiZSBjaG9zZW4uXG4gKiBAbmV3XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWNvbWJvYm94JyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBDb21tYW5kQ29tcG9uZW50LFxuICAgIENvbW1hbmRJbnB1dENvbXBvbmVudCxcbiAgICBDb21tYW5kTGlzdENvbXBvbmVudCxcbiAgICBDb21tYW5kRW1wdHlDb21wb25lbnQsXG4gICAgQ29tbWFuZEl0ZW1Db21wb25lbnQsXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ29tYm9ib3hDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8YnV0dG9uXG4gICAgICAjdHJpZ2dlclxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJpc09wZW4gPyBwYW5lbElkIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbCB8fCBudWxsXCJcbiAgICAgIFthdHRyLmRhdGEtc3RhdGVdPVwiaXNPcGVuID8gJ29wZW4nIDogJ2Nsb3NlZCdcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtjbGFzc109XCJjb21wdXRlZFRyaWdnZXJDbGFzc1wiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgICAgKGtleWRvd24pPVwib25UcmlnZ2VyS2V5RG93bigkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8c3BhbiBbY2xhc3NdPVwiY24oJ3RydW5jYXRlJywgc2VsZWN0ZWRMYWJlbCA/ICd0ZXh0LWZvcmVncm91bmQnIDogJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCcpXCI+XG4gICAgICAgIHt7IHNlbGVjdGVkTGFiZWwgfHwgcGxhY2Vob2xkZXIgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxpXG4gICAgICAgIGNsYXNzPVwicmktZXhwYW5kLXVwLWRvd24tbGluZSBzaHJpbmstMCB0ZXh0LW11dGVkLWZvcmVncm91bmQgdHJhbnNpdGlvbi10cmFuc2Zvcm1cIlxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgPjwvaT5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwiaXNPcGVuXCJcbiAgICAgICNwYW5lbFxuICAgICAgW2lkXT1cInBhbmVsSWRcIlxuICAgICAgY2xhc3M9XCJmaXhlZCBsZWZ0LTAgdG9wLTAgei1bOTk5OV1cIlxuICAgICAgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW5cIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWJvcmRlciBiZy1wb3BvdmVyIHNoYWRvdy1tZFwiPlxuICAgICAgICA8dG9sbGUtY29tbWFuZCBbc2hvdWxkRmlsdGVyXT1cInNob3VsZEZpbHRlclwiIChzZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQpXCIgKHF1ZXJ5Q2hhbmdlKT1cInNlYXJjaENoYW5nZS5lbWl0KCRldmVudClcIj5cbiAgICAgICAgICA8dG9sbGUtY29tbWFuZC1pbnB1dCBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXJcIj48L3RvbGxlLWNvbW1hbmQtaW5wdXQ+XG4gICAgICAgICAgPHRvbGxlLWNvbW1hbmQtbGlzdD5cbiAgICAgICAgICAgIDx0b2xsZS1jb21tYW5kLWVtcHR5Pnt7IGVtcHR5TWVzc2FnZSB9fTwvdG9sbGUtY29tbWFuZC1lbXB0eT5cbiAgICAgICAgICAgIDx0b2xsZS1jb21tYW5kLWl0ZW1cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJvcHRpb24ubGFiZWxcIlxuICAgICAgICAgICAgICBba2V5d29yZHNdPVwib3B0aW9uLmtleXdvcmRzIHx8IFtdXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5kaXNhYmxlZCB8fCBmYWxzZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJyaS1jaGVjay1saW5lIHNocmluay0wXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Mub3BhY2l0eS0wXT1cIm9wdGlvbi52YWx1ZSAhPT0gdmFsdWVcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHJ1bmNhdGVcIj57eyBvcHRpb24ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3RvbGxlLWNvbW1hbmQtaXRlbT5cbiAgICAgICAgICA8L3RvbGxlLWNvbW1hbmQtbGlzdD5cbiAgICAgICAgPC90b2xsZS1jb21tYW5kPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIENvbWJvYm94Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveSB7XG4gIC8qKiBPcHRpb25zIHRvIGNob29zZSBmcm9tLiBAZGVmYXVsdCBbXSAqL1xuICBASW5wdXQoKSBvcHRpb25zOiBDb21ib2JveE9wdGlvbltdID0gW107XG4gIC8qKiBUZXh0IHNob3duIG9uIHRoZSB0cmlnZ2VyIHdoZW4gbm90aGluZyBpcyBzZWxlY3RlZC4gQGRlZmF1bHQgJ1NlbGVjdCBhbiBvcHRpb27igKYnICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ1NlbGVjdCBhbiBvcHRpb27igKYnO1xuICAvKiogUGxhY2Vob2xkZXIgaW5zaWRlIHRoZSBzZWFyY2ggYm94LiBAZGVmYXVsdCAnU2VhcmNo4oCmJyAqL1xuICBASW5wdXQoKSBzZWFyY2hQbGFjZWhvbGRlciA9ICdTZWFyY2jigKYnO1xuICAvKiogTWVzc2FnZSBzaG93biB3aGVuIHRoZSBxdWVyeSBtYXRjaGVzIG5vIG9wdGlvbi4gQGRlZmF1bHQgJ05vIHJlc3VsdHMgZm91bmQuJyAqL1xuICBASW5wdXQoKSBlbXB0eU1lc3NhZ2UgPSAnTm8gcmVzdWx0cyBmb3VuZC4nO1xuICAvKiogSGVpZ2h0IGFuZCB0ZXh0IHNpemUgb2YgdGhlIHRyaWdnZXIuIEBkZWZhdWx0ICdkZWZhdWx0JyAqL1xuICBASW5wdXQoKSBzaXplOiBDb21ib2JveFByb3BzWydzaXplJ10gPSAnZGVmYXVsdCc7XG4gIC8qKiBBcHBsaWVzIHRoZSBkZXN0cnVjdGl2ZSBib3JkZXIgYW5kIGZvY3VzIHJpbmcuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIGludmFsaWQgPSBmYWxzZTtcbiAgLyoqIERpc2FibGVzIHRoZSBjb250cm9sLiBAZGVmYXVsdCBmYWxzZSAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICAvKiogU2V0IGZhbHNlIHRvIGZpbHRlciB0aGUgb3B0aW9ucyB5b3Vyc2VsZiwgZS5nLiBzZXJ2ZXItc2lkZS4gQGRlZmF1bHQgdHJ1ZSAqL1xuICBASW5wdXQoKSBzaG91bGRGaWx0ZXIgPSB0cnVlO1xuICAvKiogQ2xvc2UgdGhlIHBhbmVsIGFmdGVyIGEgdmFsdWUgaXMgY2hvc2VuLiBAZGVmYXVsdCB0cnVlICovXG4gIEBJbnB1dCgpIGNsb3NlT25TZWxlY3QgPSB0cnVlO1xuICAvKiogV2hlcmUgdGhlIHBhbmVsIG9wZW5zIHJlbGF0aXZlIHRvIHRoZSB0cmlnZ2VyLiBAZGVmYXVsdCAnYm90dG9tLXN0YXJ0JyAqL1xuICBASW5wdXQoKSBwbGFjZW1lbnQ6ICdib3R0b20tc3RhcnQnIHwgJ2JvdHRvbS1lbmQnIHwgJ3RvcC1zdGFydCcgfCAndG9wLWVuZCcgPSAnYm90dG9tLXN0YXJ0JztcbiAgLyoqIEFjY2Vzc2libGUgbmFtZSB3aGVuIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgdmlzaWJsZSBsYWJlbC4gQGRlZmF1bHQgJycgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsID0gJyc7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSB0cmlnZ2VyIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgLyoqIEVtaXR0ZWQgd2l0aCB0aGUgY2hvc2VuIHZhbHVlIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4gKi9cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8qKiBFbWl0dGVkIHdpdGggdGhlIHF1ZXJ5IHRleHQgYXMgdGhlIHVzZXIgc2VhcmNoZXMuICovXG4gIEBPdXRwdXQoKSBzZWFyY2hDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgcGFuZWwgb3BlbnMuICovXG4gIEBPdXRwdXQoKSBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHBhbmVsIGNsb3Nlcy4gKi9cbiAgQE91dHB1dCgpIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAVmlld0NoaWxkKCd0cmlnZ2VyJykgdHJpZ2dlckVsPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhbmVsJykgcGFuZWxFbD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIHJlYWRvbmx5IHBhbmVsSWQgPSBgY29tYm9ib3gtcGFuZWwtJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMSl9YDtcblxuICB2YWx1ZTogYW55ID0gbnVsbDtcbiAgaXNPcGVuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xuXG4gIHByaXZhdGUgY2xlYW51cD86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgb3V0c2lkZUNsaWNrSGFuZGxlciA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBOb2RlO1xuICAgIGlmIChcbiAgICAgICF0aGlzLnRyaWdnZXJFbD8ubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpICYmXG4gICAgICAhdGhpcy5wYW5lbEVsPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldClcbiAgICApIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlc2NhcGVIYW5kbGVyID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgJiYgdGhpcy5pc09wZW4pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB0aGlzLnRyaWdnZXJFbD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICBnZXQgc2VsZWN0ZWRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZCgobykgPT4gby52YWx1ZSA9PT0gdGhpcy52YWx1ZSk/LmxhYmVsID8/ICcnO1xuICB9XG5cbiAgZ2V0IGNvbXB1dGVkVHJpZ2dlckNsYXNzKCkge1xuICAgIHJldHVybiBjbihjb21ib2JveFRyaWdnZXJWYXJpYW50cyh7IHNpemU6IHRoaXMuc2l6ZSwgaW52YWxpZDogdGhpcy5pbnZhbGlkIH0pLCB0aGlzLmNsYXNzKTtcbiAgfVxuXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzT3BlbiA/IHRoaXMuY2xvc2UoKSA6IHRoaXMub3BlbigpO1xuICB9XG5cbiAgb3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLmlzT3BlbikgcmV0dXJuO1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLm9wZW5lZC5lbWl0KCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKTtcbiAgICAgIC8vIEZvY3VzIHRoZSBzZWFyY2ggYm94IHNvIHRoZSB1c2VyIGNhbiB0eXBlIHN0cmFpZ2h0IGF3YXkuXG4gICAgICB0aGlzLnBhbmVsRWw/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKT8uZm9jdXMoKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vdXRzaWRlQ2xpY2tIYW5kbGVyLCB0cnVlKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmVzY2FwZUhhbmRsZXIsIHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy50ZWFyZG93bigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25UcmlnZ2VyS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChbJ0Fycm93RG93bicsICdBcnJvd1VwJywgJ0VudGVyJywgJyAnXS5pbmNsdWRlcyhldmVudC5rZXkpICYmICF0aGlzLmlzT3Blbikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VsZWN0KHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB0aGlzLnRyaWdnZXJFbD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUG9zaXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgdHJpZ2dlciA9IHRoaXMudHJpZ2dlckVsPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wYW5lbEVsPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdHJpZ2dlciB8fCAhcGFuZWwpIHJldHVybjtcblxuICAgIHRoaXMuY2xlYW51cCA9IGF1dG9VcGRhdGUodHJpZ2dlciwgcGFuZWwsICgpID0+IHtcbiAgICAgIGNvbXB1dGVQb3NpdGlvbih0cmlnZ2VyLCBwYW5lbCwge1xuICAgICAgICBwbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50LFxuICAgICAgICBtaWRkbGV3YXJlOiBbXG4gICAgICAgICAgb2Zmc2V0KDQpLFxuICAgICAgICAgIGZsaXAoKSxcbiAgICAgICAgICBzaGlmdCh7IHBhZGRpbmc6IDggfSksXG4gICAgICAgICAgLy8gTWF0Y2ggdGhlIHBhbmVsIHRvIHRoZSB0cmlnZ2VyIHdpZHRoIGFuZCBjYXAgaXRzIGhlaWdodCB0byB0aGUgc3BhY2VcbiAgICAgICAgICAvLyBhY3R1YWxseSBhdmFpbGFibGUsIHNvIHRoZSBsaXN0IHNjcm9sbHMgaW5zdGVhZCBvZiBvdmVyZmxvd2luZy5cbiAgICAgICAgICBzaXplKHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDgsXG4gICAgICAgICAgICBhcHBseSh7IHJlY3RzLCBhdmFpbGFibGVIZWlnaHQsIGVsZW1lbnRzIH0pIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50cy5mbG9hdGluZy5zdHlsZSwge1xuICAgICAgICAgICAgICAgIG1pbldpZHRoOiBgJHtyZWN0cy5yZWZlcmVuY2Uud2lkdGh9cHhgLFxuICAgICAgICAgICAgICAgIG1heEhlaWdodDogYCR7TWF0aC5tYXgoMTYwLCBhdmFpbGFibGVIZWlnaHQpfXB4YCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSkudGhlbigoeyB4LCB5IH0pID0+IHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwYW5lbC5zdHlsZSwge1xuICAgICAgICAgIGxlZnQ6IGAke3h9cHhgLFxuICAgICAgICAgIHRvcDogYCR7eX1weGAsXG4gICAgICAgICAgdmlzaWJpbGl0eTogJ3Zpc2libGUnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB0ZWFyZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXA/LigpO1xuICAgIHRoaXMuY2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub3V0c2lkZUNsaWNrSGFuZGxlciwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuZXNjYXBlSGFuZGxlciwgdHJ1ZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnRlYXJkb3duKCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,164 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { cn } from './utils/cn';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ /**
7
+ * The ⌘K command palette: a `tolle-command` in a centred modal overlay.
8
+ *
9
+ * Project a full command menu inside:
10
+ *
11
+ * ```html
12
+ * <tolle-command-dialog [(open)]="paletteOpen">
13
+ * <tolle-command (selected)="run($event)">
14
+ * <tolle-command-input></tolle-command-input>
15
+ * <tolle-command-list>…</tolle-command-list>
16
+ * </tolle-command>
17
+ * </tolle-command-dialog>
18
+ * ```
19
+ *
20
+ * Set `shortcut` to bind a global hotkey (default ⌘K / Ctrl+K).
21
+ * @new
22
+ */
23
+ export class CommandDialogComponent {
24
+ cdr;
25
+ /** Whether the palette is visible. Supports two-way binding via `[(open)]`. @default false */
26
+ open = false;
27
+ /**
28
+ * Global hotkey that toggles the palette, as `mod+key` where `mod` maps to ⌘
29
+ * on macOS and Ctrl elsewhere. Set to `''` to disable the binding.
30
+ * @default 'mod+k'
31
+ */
32
+ shortcut = 'mod+k';
33
+ /** Close the palette when the backdrop is clicked. @default true */
34
+ closeOnBackdrop = true;
35
+ /** Accessible name for the dialog. @default 'Command palette' */
36
+ ariaLabel = 'Command palette';
37
+ /** Extra Tailwind classes merged onto the panel via `cn()` (last-wins). */
38
+ class = '';
39
+ /** Two-way binding partner for `open`. */
40
+ openChange = new EventEmitter();
41
+ /** Emitted when the palette opens. */
42
+ opened = new EventEmitter();
43
+ /** Emitted when the palette closes. */
44
+ closed = new EventEmitter();
45
+ panelEl;
46
+ cn = cn;
47
+ constructor(cdr) {
48
+ this.cdr = cdr;
49
+ }
50
+ onKeyDown = (event) => {
51
+ if (event.key === 'Escape' && this.open) {
52
+ event.preventDefault();
53
+ this.setOpen(false);
54
+ return;
55
+ }
56
+ if (!this.shortcut)
57
+ return;
58
+ const parts = this.shortcut.toLowerCase().split('+');
59
+ const key = parts[parts.length - 1];
60
+ const needsMod = parts.includes('mod') || parts.includes('meta') || parts.includes('ctrl');
61
+ const modHeld = event.metaKey || event.ctrlKey;
62
+ if (event.key.toLowerCase() === key && (!needsMod || modHeld)) {
63
+ event.preventDefault();
64
+ this.setOpen(!this.open);
65
+ }
66
+ };
67
+ ngOnInit() {
68
+ document.addEventListener('keydown', this.onKeyDown);
69
+ }
70
+ ngOnDestroy() {
71
+ document.removeEventListener('keydown', this.onKeyDown);
72
+ }
73
+ onBackdropClick() {
74
+ if (this.closeOnBackdrop)
75
+ this.setOpen(false);
76
+ }
77
+ setOpen(next) {
78
+ if (this.open === next)
79
+ return;
80
+ this.open = next;
81
+ this.openChange.emit(next);
82
+ (next ? this.opened : this.closed).emit();
83
+ this.cdr.markForCheck();
84
+ if (next) {
85
+ // Focus the projected search box once the panel is in the DOM, so typing
86
+ // works immediately on open.
87
+ setTimeout(() => this.panelEl?.nativeElement.querySelector('input')?.focus());
88
+ }
89
+ }
90
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CommandDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
91
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CommandDialogComponent, isStandalone: true, selector: "tolle-command-dialog", inputs: { open: "open", shortcut: "shortcut", closeOnBackdrop: "closeOnBackdrop", ariaLabel: "ariaLabel", class: "class" }, outputs: { openChange: "openChange", opened: "opened", closed: "closed" }, viewQueries: [{ propertyName: "panelEl", first: true, predicate: ["panel"], descendants: true }], ngImport: i0, template: `
92
+ <div
93
+ *ngIf="open"
94
+ class="fixed inset-0 z-[9999] flex items-start justify-center p-4 pt-[15vh]"
95
+ role="dialog"
96
+ aria-modal="true"
97
+ [attr.aria-label]="ariaLabel"
98
+ >
99
+ <div
100
+ class="fixed inset-0 bg-black/50 backdrop-blur-sm animate-in fade-in"
101
+ aria-hidden="true"
102
+ (click)="onBackdropClick()"
103
+ ></div>
104
+
105
+ <div
106
+ #panel
107
+ [class]="cn(
108
+ 'relative z-10 w-full max-w-lg overflow-hidden rounded-lg border border-border bg-popover shadow-lg',
109
+ class
110
+ )"
111
+ >
112
+ <ng-content></ng-content>
113
+ </div>
114
+ </div>
115
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
116
+ }
117
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CommandDialogComponent, decorators: [{
118
+ type: Component,
119
+ args: [{ selector: 'tolle-command-dialog', standalone: true, imports: [CommonModule], template: `
120
+ <div
121
+ *ngIf="open"
122
+ class="fixed inset-0 z-[9999] flex items-start justify-center p-4 pt-[15vh]"
123
+ role="dialog"
124
+ aria-modal="true"
125
+ [attr.aria-label]="ariaLabel"
126
+ >
127
+ <div
128
+ class="fixed inset-0 bg-black/50 backdrop-blur-sm animate-in fade-in"
129
+ aria-hidden="true"
130
+ (click)="onBackdropClick()"
131
+ ></div>
132
+
133
+ <div
134
+ #panel
135
+ [class]="cn(
136
+ 'relative z-10 w-full max-w-lg overflow-hidden rounded-lg border border-border bg-popover shadow-lg',
137
+ class
138
+ )"
139
+ >
140
+ <ng-content></ng-content>
141
+ </div>
142
+ </div>
143
+ `, styles: [":host{display:block}\n"] }]
144
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { open: [{
145
+ type: Input
146
+ }], shortcut: [{
147
+ type: Input
148
+ }], closeOnBackdrop: [{
149
+ type: Input
150
+ }], ariaLabel: [{
151
+ type: Input
152
+ }], class: [{
153
+ type: Input
154
+ }], openChange: [{
155
+ type: Output
156
+ }], opened: [{
157
+ type: Output
158
+ }], closed: [{
159
+ type: Output
160
+ }], panelEl: [{
161
+ type: ViewChild,
162
+ args: ['panel']
163
+ }] } });
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9jb21tYW5kLWRpYWxvZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixTQUFTLEdBSVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7OztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQWdDSCxNQUFNLE9BQU8sc0JBQXNCO0lBMkJiO0lBMUJwQiw4RkFBOEY7SUFDckYsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUN0Qjs7OztPQUlHO0lBQ00sUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUM1QixvRUFBb0U7SUFDM0QsZUFBZSxHQUFHLElBQUksQ0FBQztJQUNoQyxpRUFBaUU7SUFDeEQsU0FBUyxHQUFHLGlCQUFpQixDQUFDO0lBQ3ZDLDJFQUEyRTtJQUNsRSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBRXBCLDBDQUEwQztJQUNoQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztJQUNuRCxzQ0FBc0M7SUFDNUIsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFDNUMsdUNBQXVDO0lBQzdCLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRXhCLE9BQU8sQ0FBMkI7SUFFNUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUVsQixZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtJQUFHLENBQUM7SUFFN0IsU0FBUyxHQUFHLENBQUMsS0FBb0IsRUFBRSxFQUFFO1FBQ3BELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxR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QUVhLE9BQU87c0JBQTFCLFNBQVM7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBFbGVtZW50UmVmLFxuICBWaWV3Q2hpbGQsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuLyoqXG4gKiBUaGUg4oyYSyBjb21tYW5kIHBhbGV0dGU6IGEgYHRvbGxlLWNvbW1hbmRgIGluIGEgY2VudHJlZCBtb2RhbCBvdmVybGF5LlxuICpcbiAqIFByb2plY3QgYSBmdWxsIGNvbW1hbmQgbWVudSBpbnNpZGU6XG4gKlxuICogYGBgaHRtbFxuICogPHRvbGxlLWNvbW1hbmQtZGlhbG9nIFsob3BlbildPVwicGFsZXR0ZU9wZW5cIj5cbiAqICAgPHRvbGxlLWNvbW1hbmQgKHNlbGVjdGVkKT1cInJ1bigkZXZlbnQpXCI+XG4gKiAgICAgPHRvbGxlLWNvbW1hbmQtaW5wdXQ+PC90b2xsZS1jb21tYW5kLWlucHV0PlxuICogICAgIDx0b2xsZS1jb21tYW5kLWxpc3Q+4oCmPC90b2xsZS1jb21tYW5kLWxpc3Q+XG4gKiAgIDwvdG9sbGUtY29tbWFuZD5cbiAqIDwvdG9sbGUtY29tbWFuZC1kaWFsb2c+XG4gKiBgYGBcbiAqXG4gKiBTZXQgYHNob3J0Y3V0YCB0byBiaW5kIGEgZ2xvYmFsIGhvdGtleSAoZGVmYXVsdCDijJhLIC8gQ3RybCtLKS5cbiAqIEBuZXdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtY29tbWFuZC1kaWFsb2cnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cIm9wZW5cIlxuICAgICAgY2xhc3M9XCJmaXhlZCBpbnNldC0wIHotWzk5OTldIGZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1jZW50ZXIgcC00IHB0LVsxNXZoXVwiXG4gICAgICByb2xlPVwiZGlhbG9nXCJcbiAgICAgIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZml4ZWQgaW5zZXQtMCBiZy1ibGFjay81MCBiYWNrZHJvcC1ibHVyLXNtIGFuaW1hdGUtaW4gZmFkZS1pblwiXG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgIChjbGljayk9XCJvbkJhY2tkcm9wQ2xpY2soKVwiXG4gICAgICA+PC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgI3BhbmVsXG4gICAgICAgIFtjbGFzc109XCJjbihcbiAgICAgICAgICAncmVsYXRpdmUgei0xMCB3LWZ1bGwgbWF4LXctbGcgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctcG9wb3ZlciBzaGFkb3ctbGcnLFxuICAgICAgICAgIGNsYXNzXG4gICAgICAgIClcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ29tbWFuZERpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIFdoZXRoZXIgdGhlIHBhbGV0dGUgaXMgdmlzaWJsZS4gU3VwcG9ydHMgdHdvLXdheSBiaW5kaW5nIHZpYSBgWyhvcGVuKV1gLiBAZGVmYXVsdCBmYWxzZSAqL1xuICBASW5wdXQoKSBvcGVuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBHbG9iYWwgaG90a2V5IHRoYXQgdG9nZ2xlcyB0aGUgcGFsZXR0ZSwgYXMgYG1vZCtrZXlgIHdoZXJlIGBtb2RgIG1hcHMgdG8g4oyYXG4gICAqIG9uIG1hY09TIGFuZCBDdHJsIGVsc2V3aGVyZS4gU2V0IHRvIGAnJ2AgdG8gZGlzYWJsZSB0aGUgYmluZGluZy5cbiAgICogQGRlZmF1bHQgJ21vZCtrJ1xuICAgKi9cbiAgQElucHV0KCkgc2hvcnRjdXQgPSAnbW9kK2snO1xuICAvKiogQ2xvc2UgdGhlIHBhbGV0dGUgd2hlbiB0aGUgYmFja2Ryb3AgaXMgY2xpY2tlZC4gQGRlZmF1bHQgdHJ1ZSAqL1xuICBASW5wdXQoKSBjbG9zZU9uQmFja2Ryb3AgPSB0cnVlO1xuICAvKiogQWNjZXNzaWJsZSBuYW1lIGZvciB0aGUgZGlhbG9nLiBAZGVmYXVsdCAnQ29tbWFuZCBwYWxldHRlJyAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWwgPSAnQ29tbWFuZCBwYWxldHRlJztcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIHBhbmVsIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgLyoqIFR3by13YXkgYmluZGluZyBwYXJ0bmVyIGZvciBgb3BlbmAuICovXG4gIEBPdXRwdXQoKSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSBwYWxldHRlIG9wZW5zLiAqL1xuICBAT3V0cHV0KCkgb3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSBwYWxldHRlIGNsb3Nlcy4gKi9cbiAgQE91dHB1dCgpIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAVmlld0NoaWxkKCdwYW5lbCcpIHBhbmVsRWw/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwcm90ZWN0ZWQgY24gPSBjbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbktleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiB0aGlzLm9wZW4pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNldE9wZW4oZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zaG9ydGN1dCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhcnRzID0gdGhpcy5zaG9ydGN1dC50b0xvd2VyQ2FzZSgpLnNwbGl0KCcrJyk7XG4gICAgY29uc3Qga2V5ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgbmVlZHNNb2QgPSBwYXJ0cy5pbmNsdWRlcygnbW9kJykgfHwgcGFydHMuaW5jbHVkZXMoJ21ldGEnKSB8fCBwYXJ0cy5pbmNsdWRlcygnY3RybCcpO1xuICAgIGNvbnN0IG1vZEhlbGQgPSBldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXk7XG5cbiAgICBpZiAoZXZlbnQua2V5LnRvTG93ZXJDYXNlKCkgPT09IGtleSAmJiAoIW5lZWRzTW9kIHx8IG1vZEhlbGQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRPcGVuKCF0aGlzLm9wZW4pO1xuICAgIH1cbiAgfTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd24pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duKTtcbiAgfVxuXG4gIG9uQmFja2Ryb3BDbGljaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZU9uQmFja2Ryb3ApIHRoaXMuc2V0T3BlbihmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHNldE9wZW4obmV4dDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZW4gPT09IG5leHQpIHJldHVybjtcbiAgICB0aGlzLm9wZW4gPSBuZXh0O1xuICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KG5leHQpO1xuICAgIChuZXh0ID8gdGhpcy5vcGVuZWQgOiB0aGlzLmNsb3NlZCkuZW1pdCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgaWYgKG5leHQpIHtcbiAgICAgIC8vIEZvY3VzIHRoZSBwcm9qZWN0ZWQgc2VhcmNoIGJveCBvbmNlIHRoZSBwYW5lbCBpcyBpbiB0aGUgRE9NLCBzbyB0eXBpbmdcbiAgICAgIC8vIHdvcmtzIGltbWVkaWF0ZWx5IG9uIG9wZW4uXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucGFuZWxFbD8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpPy5mb2N1cygpKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==